Ticket #8758: scriptvars.patch

File scriptvars.patch, 7.6 KB (added by SF/next_ghost, 13 years ago)

ScriptVars against SVN 29859

  • engines/cine/script.h

     
    2626#ifndef CINE_SCRIPT_H
    2727#define CINE_SCRIPT_H
    2828
     29#include "common/savefile.h"
     30
    2931namespace Cine {
    3032
    3133#define SCRIPT_STACK_SIZE 50
    3234
     35class ScriptVars {
     36        private:
     37                unsigned int _size;
     38                int16 *_vars;
     39
     40        public:
     41                explicit ScriptVars(unsigned int len = 50);
     42                ScriptVars(Common::InSaveFile &fHandle, unsigned int len = 50);
     43                ScriptVars(const ScriptVars &src);
     44                ~ScriptVars(void);
     45
     46                ScriptVars &operator=(const ScriptVars &src);
     47                int16 &operator[](unsigned int idx);
     48                int16 operator[](unsigned int idx) const;
     49
     50                void save(Common::OutSaveFile &fHandle);
     51                void save(Common::OutSaveFile &fHandle, unsigned int len);
     52                void load(Common::InSaveFile &fHandle);
     53                void load(Common::InSaveFile &fHandle, unsigned int len);
     54                void reset(void);
     55};
     56
    3357struct scriptStruct {
    3458        byte *ptr;
    3559        uint16 size;
  • engines/cine/object.h

     
    2626#ifndef CINE_OBJECT_H
    2727#define CINE_OBJECT_H
    2828
     29#include "script.h"
     30
    2931namespace Cine {
    3032
    3133struct objectStruct {
     
    5355#define NUM_MAX_VAR 256
    5456
    5557extern objectStruct objectTable[NUM_MAX_OBJECT];
    56 extern uint16 globalVars[NUM_MAX_VAR];
     58extern ScriptVars globalVars;
    5759
    5860extern overlayHeadElement overlayHead;
    5961
  • engines/cine/various.cpp

     
    171171                pNewElement->stack[i] = 0;
    172172        }
    173173
    174         for (i = 0; i < 50; i++) {
    175                 pNewElement->localVars[i] = 0;
    176         }
    177 
    178174        pNewElement->compareResult = 0;
    179175        pNewElement->scriptPosition = 0;
    180176
     
    329325        for (i = 0; i < SCRIPT_STACK_SIZE; i++)
    330326                newElement->stack[i] = fHandle->readUint16BE();
    331327
    332         for (i = 0; i < 50; i++)
    333                 newElement->localVars[i] = fHandle->readUint16BE();
     328        newElement->localVars.load(*fHandle);
    334329
    335330        newElement->compareResult = fHandle->readUint16BE();
    336331        newElement->scriptPosition = fHandle->readUint16BE();
     
    455450                objectTable[i].costume = 0;
    456451        }
    457452
    458         for (i = 0; i < 255; i++) {
    459                 globalVars[i] = 0;
    460         }
     453        globalVars.reset();
    461454
    462455        var2 = var3 = var4 = var5 = 0;
    463456
     
    520513                tempPalette[i] = fHandle->readUint16BE();
    521514        }
    522515
    523         for (i = 0; i < 255; i++) {
    524                 globalVars[i] = fHandle->readUint16BE();
    525         }
     516        globalVars.load(*fHandle, NUM_MAX_VAR - 1);
    526517
    527518        for (i = 0; i < 16; i++) {
    528519                zoneData[i] = fHandle->readUint16BE();
     
    683674                fHandle->writeUint16BE(tempPalette[i]);
    684675        }
    685676
    686         for (i = 0; i < 255; i++) {
    687                 fHandle->writeUint16BE(globalVars[i]);
    688         }
     677        globalVars.save(*fHandle, NUM_MAX_VAR - 1);
    689678
    690679        for (i = 0; i < 16; i++) {
    691680                fHandle->writeUint16BE(zoneData[i]);
     
    757746                                fHandle->writeUint16BE(currentHead->stack[i]);
    758747                        }
    759748
    760                         for (i = 0; i < 50; i++) {
    761                                 fHandle->writeUint16BE(currentHead->localVars[i]);
    762                         }
     749                        currentHead->localVars.save(*fHandle);
    763750
    764751                        fHandle->writeUint16BE(currentHead->compareResult);
    765752                        fHandle->writeUint16BE(currentHead->scriptPosition);
     
    788775                                fHandle->writeUint16BE(currentHead->stack[i]);
    789776                        }
    790777
    791                         for (i = 0; i < 50; i++) {
    792                                 fHandle->writeUint16BE(currentHead->localVars[i]);
    793                         }
     778                        currentHead->localVars.save(*fHandle);
    794779
    795780                        fHandle->writeUint16BE(currentHead->compareResult);
    796781                        fHandle->writeUint16BE(currentHead->scriptPosition);
  • engines/cine/prc.h

     
    3131struct prcLinkedListStruct {
    3232        struct prcLinkedListStruct *next;
    3333        int16 stack[SCRIPT_STACK_SIZE];
    34         int16 localVars[50];
     34        ScriptVars localVars;
    3535        uint16 compareResult;
    3636        uint16 scriptPosition;
    3737        byte *scriptPtr;
  • engines/cine/script.cpp

     
    453453        return val;
    454454}
    455455
     456// empty array
     457ScriptVars::ScriptVars(unsigned int len) : _size(len), _vars(new int16[len]) {
     458        assert(_vars);
     459        reset();
     460}
     461
     462// read game save, for later use
     463ScriptVars::ScriptVars(Common::InSaveFile &fHandle, unsigned int len)
     464        : _size(len), _vars(new int16[len]) {
     465
     466        assert(_vars);
     467
     468        load(fHandle);
     469}
     470
     471// copy constructor
     472ScriptVars::ScriptVars(const ScriptVars &src) : _size(src._size), _vars(new int16[_size]) {
     473        assert(_vars);
     474        memcpy(_vars, src._vars, _size * sizeof(int16));
     475}
     476
     477ScriptVars::~ScriptVars(void) {
     478        delete[] _vars;
     479}
     480
     481ScriptVars &ScriptVars::operator=(const ScriptVars &src) {
     482        ScriptVars tmp(src);
     483        int16 *tmpvars = _vars;
     484
     485        _vars = tmp._vars;
     486        tmp._vars = tmpvars;
     487        _size = src._size;
     488
     489        return *this;
     490}
     491
     492// array access
     493int16 &ScriptVars::operator[](unsigned int idx) {
     494        debugN(5, "assert(%d < %d)", idx, _size);
     495        assert(idx < _size);
     496        return _vars[idx];
     497}
     498
     499int16 ScriptVars::operator[](unsigned int idx) const {
     500        debugN(5, "assert(%d < %d)\n", idx, _size);
     501        assert(idx < _size);
     502        return _vars[idx];
     503}
     504
     505// dump to savefile
     506void ScriptVars::save(Common::OutSaveFile &fHandle) {
     507        save(fHandle, _size);
     508}
     509
     510// globalVars[255] is not written to savefiles...
     511void ScriptVars::save(Common::OutSaveFile &fHandle, unsigned int len) {
     512        debugN(5, "assert(%d <= %d)\n", len, _size);
     513        assert(len <= _size);
     514        for (unsigned int i = 0; i < len; i++) {
     515                fHandle.writeUint16BE(_vars[i]);
     516        }
     517}
     518
     519// read from savefile
     520void ScriptVars::load(Common::InSaveFile &fHandle) {
     521        load(fHandle, _size);
     522}
     523
     524void ScriptVars::load(Common::InSaveFile &fHandle, unsigned int len) {
     525        debugN(5, "assert(%d <= %d)\n", len, _size);
     526        assert(len <= _size);
     527        for (unsigned int i = 0; i < len; i++) {
     528                _vars[i] = fHandle.readUint16BE();
     529        }
     530}
     531
     532void ScriptVars::reset(void) {
     533        memset( _vars, 0, _size * sizeof(int16));
     534}
     535
    456536void addGfxElementA0(int16 param1, int16 param2) {
    457537        overlayHeadElement *currentHead = &overlayHead;
    458538        overlayHeadElement *tempHead = currentHead;
     
    661741                pNewElement->stack[i] = scriptTable[idx].stack[i];
    662742        }
    663743
    664         for (i = 0; i < 50; i++) {
    665                 pNewElement->localVars[i] = 0;
    666         }
    667 
    668744        pNewElement->compareResult = 0;
    669745        pNewElement->scriptPosition = 0;
    670746
  • engines/cine/object.cpp

     
    3636namespace Cine {
    3737
    3838objectStruct objectTable[NUM_MAX_OBJECT];
    39 uint16 globalVars[NUM_MAX_VAR];
     39ScriptVars globalVars(NUM_MAX_VAR);
    4040overlayHeadElement overlayHead;
    4141
    4242void unloadAllMasks(void) {
     
    4545        while (current) {
    4646                overlayHeadElement *next = current->next;
    4747
    48                 free(current);
     48                delete current;
    4949
    5050                current = next;
    5151        }
     
    124124
    125125        tempPtr2->previous = currentHeadPtr->previous;
    126126
    127         free(currentHeadPtr);
     127        delete currentHeadPtr;
    128128
    129129        return 0;
    130130}
     
    151151
    152152        tempPtr2->previous = currentHeadPtr->previous;
    153153
    154         free(currentHeadPtr);
     154        delete currentHeadPtr;
    155155        return 0;
    156156}
    157157
  • engines/cine/cine.cpp

     
    136136                objectTable[i].name[0] = 0;
    137137        }
    138138
    139         for (i = 0; i < NUM_MAX_VAR; i++) {
    140                 globalVars[i] = 0;
    141         }
    142 
    143139        for (i = 0; i < NUM_MAX_SCRIPT; i++) {
    144140                scriptTable[i].ptr = NULL;
    145141                scriptTable[i].size = 0;