From 49d025a44c46dd88f9e2fdf2e67942b8b5445d39 Mon Sep 17 00:00:00 2001 From: Martin Haye Date: Sat, 24 Sep 2016 11:10:17 -0700 Subject: [PATCH] Fleshed out ability to use an item on a map space. In addition, add item god-mode cheat moved to player info screen and made fancier. --- .../src/org/badvision/A2PackPartitions.groovy | 23 ++++++++ Platform/Apple/virtual/src/plasma/diskops.pla | 11 +--- Platform/Apple/virtual/src/plasma/gamelib.plh | 5 +- .../Apple/virtual/src/plasma/gameloop.pla | 38 +++++-------- Platform/Apple/virtual/src/plasma/party.pla | 55 ++++++++++++++++++- 5 files changed, 94 insertions(+), 38 deletions(-) diff --git a/Platform/Apple/tools/PackPartitions/src/org/badvision/A2PackPartitions.groovy b/Platform/Apple/tools/PackPartitions/src/org/badvision/A2PackPartitions.groovy index 9fef765e..7a42e4eb 100644 --- a/Platform/Apple/tools/PackPartitions/src/org/badvision/A2PackPartitions.groovy +++ b/Platform/Apple/tools/PackPartitions/src/org/badvision/A2PackPartitions.groovy @@ -2218,6 +2218,7 @@ end funcs.each { typeName, func, index, row -> out.println("const ${func} = ${(index+2)*2}") } + out.println("const NUM_ITEMS = ${funcs.size()}") } replaceIfDiff("build/src/plasma/gen_items.plh") @@ -3107,6 +3108,25 @@ end } } + def packLogicOperation(blk) + { + def op = getSingle(blk.field, "OP").text() + assert blk.value[0].@name == 'A' + assert blk.value[1].@name == 'B' + def val1 = getSingle(blk.value[0].block) + def val2 = getSingle(blk.value[1].block) + switch (op) { + case 'AND': + packExpr(val1); out << " and "; packExpr(val2) + break + case 'OR': + packExpr(val1); out << " or "; packExpr(val2) + break + default: + assert false : "Logic op '$op' not yet implemented." + } + } + def packVarGet(blk) { def name = "v_" + humanNameToSymbol(getSingle(blk.field, "VAR").text(), false) @@ -3143,6 +3163,9 @@ end case 'logic_compare': packLogicCompare(blk) break + case 'logic_operation': + packLogicOperation(blk) + break case 'variables_get': packVarGet(blk) break diff --git a/Platform/Apple/virtual/src/plasma/diskops.pla b/Platform/Apple/virtual/src/plasma/diskops.pla index 21a9636c..e4904092 100644 --- a/Platform/Apple/virtual/src/plasma/diskops.pla +++ b/Platform/Apple/virtual/src/plasma/diskops.pla @@ -142,15 +142,6 @@ asm mliStub rts end -/////////////////////////////////////////////////////////////////////////////////////////////////// -// Clear the text-mode screen, and put the cursor there. -// Params: None -asm home - +asmPlasm 0 - +safeHome - rts -end - /////////////////////////////////////////////////////////////////////////////////////////////////// def callMLI(cmd, p_params) byte err @@ -286,7 +277,7 @@ def _newOrLoadGame(ask) return 0 fin - home() + textHome() ^$c053 ^$25 = 20 puts("\n N)ew game, or L)oad last game? ") diff --git a/Platform/Apple/virtual/src/plasma/gamelib.plh b/Platform/Apple/virtual/src/plasma/gamelib.plh index 6fea0233..b3e3f07e 100644 --- a/Platform/Apple/virtual/src/plasma/gamelib.plh +++ b/Platform/Apple/virtual/src/plasma/gamelib.plh @@ -13,6 +13,7 @@ import gamelib //////////// Shared library routines //////////// predef setScriptInfo, scriptDisplayStr, scriptDisplayStrNL, getYN, queue_setMap predef setSky, setGround, queue_teleport, setPortrait, clearPortrait, moveWayBackward + predef flipToPage1, textHome predef getUpperKey, clearWindow, getGlobals, rand16, printf1, printf2, printf3 predef displayf1, displayf2, displayf3, buildString, addToString, finishString, printHex predef displayChar, rawDisplayStr, displayStr, rightJustifyStr, rightJustifyNum, puts @@ -22,10 +23,10 @@ import gamelib predef encodeDice, rollDice, setPlural, getStringResponse predef streqi, strncpy, fatal, pause, tossStrings, charToUpper predef addEncounterZone, clearEncounterZones, showMapName, setMapWindow, getMapWindow - predef addGold, countGold, payGold + predef addGold, countGold, payGold, scriptEvent predef calcPlayerArmor, rdkey, initHeap, scriptCombat, makeModifier predef giveItemToPlayer, takeItemFromPlayer, playerHasItem, getStat, setStat - predef setGameFlag, getGameFlag, scriptSetAvatar + predef setGameFlag, getGameFlag, scriptSetAvatar, parseDecWithDefault, readStr predef addPlayerToParty, removePlayerFromParty, partyHasPlayer /////////// Shared string constants ////////////// diff --git a/Platform/Apple/virtual/src/plasma/gameloop.pla b/Platform/Apple/virtual/src/plasma/gameloop.pla index 0f383710..dc1f7f4e 100644 --- a/Platform/Apple/virtual/src/plasma/gameloop.pla +++ b/Platform/Apple/virtual/src/plasma/gameloop.pla @@ -37,6 +37,7 @@ include "gen_modules.plh" include "gen_enemies.plh" include "gen_players.plh" include "gen_globalScripts.plh" +include "gen_items.plh" include "combat.plh" include "party.plh" include "diskops.plh" @@ -176,7 +177,7 @@ asm initDisplay // params: mapNum, pMapData, x, y, dir +asmPlasm 5 jmp $6000 end -asm flipToPage1 // no params +export asm flipToPage1 // no params +asmPlasm 0 jmp $6003 end @@ -591,7 +592,7 @@ end /////////////////////////////////////////////////////////////////////////////////////////////////// // Read a string from the keyboard, turn it into a PLASMA string and return a pointer to the string. -asm readStr +export asm readStr +asmPlasm 0 bit setROM jsr ROM_getln1 @@ -807,6 +808,15 @@ export asm rand16 end +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Clear the text-mode screen, and put the text cursor at the top of it. +// Params: None +export asm textHome + +asmPlasm 0 + +safeHome + rts +end + /////////////////////////////////////////////////////////////////////////////////////////////////// // General methods @@ -966,7 +976,7 @@ def parseDec(str) end /////////////////////////////////////////////////////////////////////////////////////////////////// -def parseDecWithDefault(str, default) +export def parseDecWithDefault(str, default) if ^str == 0 return default fin @@ -1194,7 +1204,7 @@ end /////////////////////////////////////////////////////////////////////////////////////////////////// // Send an event to the scripts on the current map square -def scriptEvent(event, param) +export def scriptEvent(event, param) byte i, argCount word script if !nMapScripts; return; fin @@ -2081,25 +2091,6 @@ def testCombat getPos(@x, @y) checkEncounter(x, y, TRUE) end -def addItem() - word funcTbl, func, p_item, n_item - - flipToPage1() - ^$c053 - if ^$25 < 23; ^$25 = 23; fin - - puts("\nAdd item #: ") - n_item = parseDecWithDefault(readStr(), 0) - ^$c052 - - if n_item >= 2 - funcTbl = loadEngine(MODULE_GEN_ITEMS) - func = *(funcTbl + n_item * 2) - p_item = func() - addToList(@global=>p_players=>p_items, p_item) - returnFromEngine() - fin -end def printMem flipToPage1 ^$c051 @@ -2113,7 +2104,6 @@ def setCheatCmds // install cheat commands cmdTbl['T'] = @kbdTeleport cmdTbl['P'] = @showPos - cmdTbl['%'] = @addItem cmdTbl['>'] = @nextPortrait cmdTbl['<'] = @prevPortrait cmdTbl['!'] = @testCombat diff --git a/Platform/Apple/virtual/src/plasma/party.pla b/Platform/Apple/virtual/src/plasma/party.pla index abfec35a..c916dff6 100644 --- a/Platform/Apple/virtual/src/plasma/party.pla +++ b/Platform/Apple/virtual/src/plasma/party.pla @@ -17,6 +17,8 @@ include "playtype.plh" // Global definitions include "globalDefs.plh" +include "gen_modules.plh" +include "gen_items.plh" // Definition of constants for functions exported by this module include "party.plh" @@ -55,7 +57,7 @@ def itemMatch(item, group) is TYPE_EQUIP return type == TYPE_ARMOR or type == TYPE_WEAPON is TYPE_USE - return type == TYPE_ITEM and item=>p_modifiers + return type == TYPE_ITEM break is TYPE_DROP return type == TYPE_WEAPON or type == TYPE_ARMOR @@ -234,6 +236,47 @@ def showPlayerSheet(num, i_page, i_rows) return player end +// Add an item cheat +def addItem(player) + word pModule, funcTbl, func, p_item, n_item, n2, pstr, pstr2 + pstr = "%d: %s\n" + pstr2 = "Add item #: " + + flipToPage1() + textHome() + ^$c051 + + mmgr(START_LOAD, 1) // code is in partition 1 + pModule = mmgr(QUEUE_LOAD, MODULE_GEN_ITEMS<<8 | RES_TYPE_MODULE) + mmgr(FINISH_LOAD, 0) + funcTbl = pModule() + + for n_item = 1 to NUM_ITEMS + func = *(funcTbl + (n_item+1) * 2) + p_item = func() + printf2(pstr, n_item, p_item=>s_name) + if (n_item % 22) == 0 or n_item == NUM_ITEMS + mmgr(HEAP_COLLECT, 0) + puts(pstr2) + n2 = parseDecWithDefault(readStr(), 0) + if n2 >= 1 and n2 <= NUM_ITEMS + func = *(funcTbl + (n2+1) * 2) + p_item = func() + printf1("Adding '%s'\n", p_item=>s_name) + addToList(@player=>p_items, p_item) + rdkey() + break + else + textHome() + fin + fin + next + + mmgr(FREE_MEMORY, pModule) + ^$c050 + return +end + // Show player sheet and accept command def _party_doPlayerSheet(num) word player, item @@ -274,7 +317,9 @@ def _party_doPlayerSheet(num) rawDisplayStr("\n^T032Which item?") item = itemNum(player, i_rows * i_page, getUpperKey() - 'A', TYPE_USE) if item - if streqi(item=>p_modifiers=>s_name, "health") + setWindow2() + clearWindow() + if item=>p_modifiers and streqi(item=>p_modifiers=>s_name, "health") if player=>w_health < player=>w_maxHealth player=>w_health = min(player=>w_health + item=>p_modifiers=>w_modValue, player=>w_maxHealth) item->b_curUses++ @@ -283,6 +328,7 @@ def _party_doPlayerSheet(num) fin fin fin + scriptEvent(@S_USE, item=>s_name) fin else beep @@ -343,6 +389,11 @@ def _party_doPlayerSheet(num) addGold(500) fin break + is '%' // item cheat + if global->b_godmode + addItem(player) + fin + break // All done otherwise return wend