some additions

svn-id: r8010
This commit is contained in:
Oliver Kiehl 2003-05-26 17:41:19 +00:00
parent b19a6d8574
commit 4554cd1b19
4 changed files with 118 additions and 26 deletions

View file

@ -25,7 +25,7 @@
#include "sky/compact.h"
#include "sky/skydefs.h"
uint16 SkyLogic::_screen;
uint32 SkyLogic::_scriptVariables[838];
typedef void (SkyLogic::*LogicTable) ();
static const LogicTable logicTable[] = {
@ -174,8 +174,10 @@ void SkyLogic::arAnim() {
// fine because the later collision will almost certainly
// take longer to clear than the earlier one.
if (collide(SkyState::fetchCompact(_compact->extCompact->waitingFor)))
error("stop_and_wait not implemented\n");
if (collide(SkyState::fetchCompact(_compact->extCompact->waitingFor))) {
stopAndWait();
return;
}
// we are not in fact hitting this person so clr & continue
// it must have registered some time ago
@ -609,6 +611,19 @@ void SkyLogic::runGetOff() {
script((uint16)(getOff & 0xffff), (uint16)(getOff >> 16));
}
void SkyLogic::stopAndWait() {
_compact->mode += 4;
uint16 *scriptNo = (uint16 *)SkyCompact::getCompactElem(_compact, C_BASE_SUB + _compact->mode);
uint16 *offset = (uint16 *)SkyCompact::getCompactElem(_compact, C_BASE_SUB + _compact->mode + 2);
*scriptNo = (uint16)(_compact->extCompact->stopScript & 0xffff);
*offset = (uint16)(_compact->extCompact->stopScript >> 16);
_compact->logic = L_SCRIPT;
logicScript();
}
void SkyLogic::checkModuleLoaded(uint16 moduleNo) {
if (!_moduleList[moduleNo])
_moduleList[moduleNo] = (uint16 *)_skyDisk->loadFile((uint16)moduleNo + F_MODULE_0, NULL);
@ -1447,7 +1462,12 @@ uint32 SkyLogic::fnStopMode(uint32 a, uint32 b, uint32 c) {
}
uint32 SkyLogic::fnWeWait(uint32 id, uint32 b, uint32 c) {
error("Stub: fnWeWait");
// We have hit another mega
// we are going to wait for it to move
_compact->extCompact->waitingFor = id;
stopAndWait();
return 1; // not sure about this
}
uint32 SkyLogic::fnSendSync(uint32 mega, uint32 sync, uint32 c) {
@ -1489,8 +1509,72 @@ uint32 SkyLogic::fnCheckRequest(uint32 a, uint32 b, uint32 c) {
return 0; // drop from script
}
uint32 SkyLogic::fnStartMenu(uint32 a, uint32 b, uint32 c) {
error("Stub: fnStartMenu");
uint32 SkyLogic::fnStartMenu(uint32 firstObject, uint32 b, uint32 c) {
// initialise the top menu bar
// firstObject is o0 for game menu, k0 for linc
// (1) FIRST, SET UP THE 2 ARROWS SO THEY APPEAR ON SCREEN
Compact *cpt = SkyState::fetchCompact(47);
cpt->status = ST_MOUSE + ST_FOREGROUND + ST_LOGIC + ST_RECREATE;
cpt->screen = (uint16)(_scriptVariables[SCREEN] & 0xffff);
cpt = SkyState::fetchCompact(48);
cpt->status = ST_MOUSE + ST_FOREGROUND + ST_LOGIC + ST_RECREATE;
cpt->screen = (uint16)(_scriptVariables[SCREEN] & 0xffff);
// (2) COPY OBJECTS FROM NON-ZERO INVENTORY VARIABLES INTO OBJECT DISPLAY LIST (& COUNT THEM)
// sort the objects and pad with blanks
uint32 menuLength = 0;
for (uint i = firstObject; i < firstObject + ARRAYSIZE(_objectList); i++) {
if ( _scriptVariables[i] )
_objectList[menuLength++] = _scriptVariables[i];
}
_scriptVariables[MENU_LENGTH] = menuLength;
// (3) OK, NOW TOP UP THE LIST WITH THE REQUIRED NO. OF BLANK OBJECTS (for min display length 11)
uint32 blankID = 51;
for (uint i = menuLength; i < 11; i++)
_objectList[i] = blankID++;
// (4) KILL ID's OF ALL 20 OBJECTS SO UNWANTED ICONS (SCROLLED OFF) DON'T REMAIN ON SCREEN
// (There should be a better way of doing this - only kill id of 12th item when menu has scrolled right)
for (int i = 0; i < ARRAYSIZE(_objectList); i++) {
if (_objectList[i])
(SkyState::fetchCompact(_objectList[i]))->status = ST_LOGIC;
}
// (5) NOW FIND OUT WHICH OBJECT TO START THE DISPLAY FROM (depending on scroll offset)
if (menuLength < 11) // check we can scroll
_scriptVariables[SCROLL_OFFSET] = 0;
else if (menuLength < _scriptVariables[SCROLL_OFFSET] + 11)
_scriptVariables[SCROLL_OFFSET] = menuLength - 11;
// (6) AND FINALLY, INITIALISE THE 11 OBJECTS SO THEY APPEAR ON SCREEEN
uint16 rollingX = 128 + 28;
for (int i = 0; i < 11; i++) {
cpt = SkyState::fetchCompact(
_objectList[_scriptVariables[SCROLL_OFFSET] + i]);
cpt->status = ST_MOUSE + ST_FOREGROUND + ST_LOGIC + ST_RECREATE;
cpt->screen = (uint16)(_scriptVariables[SCREEN] & 0xffff);
cpt->xcood = rollingX;
rollingX += 24;
if (_scriptVariables[MENU] == 2)
cpt->ycood = 136;
else
cpt->ycood = 112;
}
return 1;
}
uint32 SkyLogic::fnUnhighlight(uint32 item, uint32 b, uint32 c) {
@ -1798,12 +1882,14 @@ uint32 SkyLogic::fnSaveCoods(uint32 a, uint32 b, uint32 c) {
error("Stub: fnSaveCoods");
}
uint32 SkyLogic::fnPlotGrid(uint32 a, uint32 b, uint32 c) {
error("Stub: fnPlotGrid");
uint32 SkyLogic::fnPlotGrid(uint32 x, uint32 y, uint32 width) {
_skyGrid->plotGrid(x, y, width, _compact);
return 1;
}
uint32 SkyLogic::fnRemoveGrid(uint32 a, uint32 b, uint32 c) {
error("Stub: fnRemoveGrid");
uint32 SkyLogic::fnRemoveGrid(uint32 x, uint32 y, uint32 width) {
_skyGrid->removeGrid(x, y, width, _compact);
return 1;
}
uint32 SkyLogic::fnEyeball(uint32 id, uint32 b, uint32 c) {

View file

@ -169,7 +169,7 @@ public:
uint32 fnUnPauseFx(uint32 a, uint32 b, uint32 c);
uint32 fnPrintf(uint32 a, uint32 b, uint32 c);
static uint16 _screen;
static uint32 _scriptVariables[838];
protected:
void push(uint32);
@ -180,13 +180,15 @@ protected:
void initScriptVariables();
void mainAnim();
void runGetOff();
void stopAndWait();
uint16 *_moduleList[16];
uint32 _stack[20];
byte _stackPtr;
Compact *_compact;
uint32 _scriptVariables[838];
uint32 _objectList[30];
uint32 _currentSection;
uint32 _saveCurrentSection;

View file

@ -38,6 +38,7 @@
// scriptVariable offsets
#define RESULT 0
#define SCREEN 1
#define LOGIC_LIST_NO 2
#define CUR_ID 12
#define MOUSE_STATUS 13
@ -50,6 +51,9 @@
#define HIT_ID 37
#define THE_CHOSEN_ONE 51
#define TEXT1 53
#define MENU_LENGTH 100
#define SCROLL_OFFSET 101
#define MENU 102
#define CUR_SECTION 143
//screen/grid defines

View file

@ -366,7 +366,7 @@ lowTextManager_t SkyText::lowTextManager(uint32 textNum, uint16 width, uint16 lo
cpt->logic = logicNum;
cpt->status = ST_LOGIC | ST_FOREGROUND | ST_RECREATE;
cpt->screen = SkyLogic::_screen;
cpt->screen = SkyLogic::_scriptVariables[SCREEN];
struct lowTextManager_t ret;
ret.textData = _dtData;