mirror of
https://github.com/KranX/Vangers.git
synced 2025-12-01 07:25:28 +07:00
9753 lines
205 KiB
C++
9753 lines
205 KiB
C++
/* ---------------------------- INCLUDE SECTION ----------------------------- */
|
|
|
|
#include "../global.h"
|
|
|
|
#include "../runtime.h"
|
|
|
|
#include "../iscreen/hfont.h"
|
|
#include "../iscreen/iscreen.h"
|
|
#include "item_api.h"
|
|
#include "actint.h"
|
|
#include "aci_scr.h"
|
|
#include "aci_str.h"
|
|
#include "aci_evnt.h"
|
|
#include "a_consts.h"
|
|
#include "credits.h"
|
|
#include "../iscreen/ikeys.h"
|
|
#include "../iscreen/controls.h"
|
|
|
|
#include "mlconsts.h"
|
|
#include "mlstruct.h"
|
|
|
|
#include "../units/uvsapi.h"
|
|
|
|
#include "../uvs/univang.h"
|
|
#include "../uvs/diagen.h"
|
|
|
|
#include "../sound/hsound.h"
|
|
#include "layout.h"
|
|
/* ----------------------------- STRUCT SECTION ----------------------------- */
|
|
/* ----------------------------- EXTERN SECTION ----------------------------- */
|
|
|
|
template <> void layout(invMatrix* view, int width, int height){
|
|
unsigned int anchor = view->anchor;
|
|
|
|
if(anchor & WIDGET_ANCHOR_INITIALIZED){
|
|
std::cout<<" WARNING: layout is already done"<<std::endl;
|
|
return;
|
|
}
|
|
|
|
view->anchor |= WIDGET_ANCHOR_INITIALIZED;
|
|
|
|
if(anchor & WIDGET_ANCHOR_RIGHT){
|
|
view->ScreenX = width - view->ScreenX - view->ScreenSizeX;
|
|
}
|
|
|
|
if(anchor & WIDGET_ANCHOR_BOTTOM){
|
|
view->ScreenY = height - view->ScreenY - view->ScreenSizeY;
|
|
}
|
|
}
|
|
|
|
template <> void layout(bmlObject* view, int width, int height){
|
|
unsigned int anchor = view->anchor;
|
|
|
|
if(anchor & WIDGET_ANCHOR_INITIALIZED){
|
|
std::cout<<" WARNING: layout is already done"<<std::endl;
|
|
return;
|
|
}
|
|
|
|
view->anchor |= WIDGET_ANCHOR_INITIALIZED;
|
|
|
|
if(anchor & WIDGET_ANCHOR_RIGHT){
|
|
view->OffsX = width - view->OffsX - view->SizeX;
|
|
}
|
|
|
|
if(anchor & WIDGET_ANCHOR_BOTTOM){
|
|
view->OffsY = height - view->OffsY - view->SizeY;
|
|
}
|
|
}
|
|
|
|
extern int uvsTabuTaskFlag;
|
|
|
|
extern bmlObject* aIndArrowBML;
|
|
extern bmlObject* aIndDataBML;
|
|
extern bmlObject* aIndBackBML;
|
|
|
|
extern int iChatExit;
|
|
|
|
extern int NetworkON;
|
|
|
|
extern int iMouseX;
|
|
extern int iMouseY;
|
|
|
|
extern int iMouseLPressFlag;
|
|
extern int iMouseRPressFlag;
|
|
|
|
extern int iMousePrevX;
|
|
extern int iMousePrevY;
|
|
|
|
extern aciFont** aScrFonts32;
|
|
|
|
#ifdef _ACI_BML_FONTS_
|
|
extern aciFont** aScrFonts;
|
|
#else
|
|
extern iScreenFont** aScrFonts;
|
|
#endif
|
|
|
|
extern int aciKeyboardLocked;
|
|
extern int aciML_ToolzerRadius;
|
|
|
|
extern unsigned char* iscrPal;
|
|
extern iScreenDispatcher* iScrDisp;
|
|
|
|
extern int CurrentWorld;
|
|
extern int GameQuantReturnValue;
|
|
|
|
extern int* aSinTable;
|
|
extern int* aCosTable;
|
|
|
|
extern int uvsCurrentWorldUnable;
|
|
extern int iScreenLog;
|
|
extern int* AVI_index;
|
|
|
|
extern actIntDispatcher* aScrDisp;
|
|
extern int PalIterLock;
|
|
extern int aciShopMenuLog;
|
|
extern int ExclusiveLog;
|
|
|
|
extern int aciWorldIndex;
|
|
|
|
extern int Pause;
|
|
|
|
extern char* aciSTR_OFF;
|
|
extern char* aciSTR_DAY;
|
|
extern char* aciSTR_UNDEFINED_PRICE;
|
|
extern char* aciSTR_PRICE;
|
|
extern char* aciSTR_EMPTY_SLOT;
|
|
extern char* aciSTR_UNNAMED_SAVE;
|
|
extern char* aciSTR_AUTOSAVE;
|
|
extern char* aciSTR_WINS;
|
|
extern char* aciSTR_LOSSES;
|
|
extern char* aciSTR_LUCK;
|
|
extern char* aciSTR_DOMINANCE;
|
|
extern char* aciSTR_BROKEN;
|
|
extern char* aciSTR_ENERGY_SHIELD;
|
|
extern char* aciSTR_RESTORING_SPEED;
|
|
extern char* aciSTR_MECHANIC_ARMOR;
|
|
extern char* aciSTR_VELOCITY;
|
|
extern char* aciSTR_SPIRAL_CAPACITY;
|
|
extern char* aciSTR_AIR_RESERVE;
|
|
extern char* aciSTR_DAMAGE;
|
|
extern char* aciSTR_LOAD;
|
|
extern char* aciSTR_SHOTS;
|
|
extern char* aciSTR_BURST;
|
|
extern char* aciSTR_WORKING_TIME;
|
|
extern char* aciSTR_SECONDS;
|
|
extern char* aciSTR_IN_PACK;
|
|
extern char* aciSTR_NO_CASH;
|
|
extern char* aciSTR_PICKUP_ITEMS_OFF;
|
|
extern char* aciSTR_PICKUP_WEAPONS_OFF;
|
|
extern char* aciSTR_PutThis;
|
|
|
|
extern char* aciSTR_RESTRICTIONS;
|
|
extern char* aciSTR_STATISTICS;
|
|
extern char* aciSTR_MINUTES;
|
|
|
|
extern int aciItmTextQueueSize;
|
|
|
|
/* --------------------------- PROTOTYPE SECTION ---------------------------- */
|
|
|
|
void aciWorldExploredInfo(void);
|
|
void LoadingMessage(int flush = 0);
|
|
void acsHandleExtEvent(int code,int data0 = 0,int data1 = 0,int data2 = 0);
|
|
|
|
void aciShowLocationPicture(void);
|
|
void aciPrepareScreenText(char* ptr,int sz,int max_len);
|
|
|
|
void aOutText32(int x,int y,int color,void* text,int font,int hspace,int vspace);
|
|
void aOutText32clip(int x,int y,int color,void* text,int font,int hspace,int vspace);
|
|
int aTextWidth32(void* text,int font,int hspace);
|
|
int aTextHeight32(void* text,int font,int vspace);
|
|
|
|
void aciInitItmTextQueue(void);
|
|
void aciReadItmText(void);
|
|
char* dgGetThreallPhrase(void);
|
|
void aciShowRacingPlace(void);
|
|
|
|
void aciML_Pause(void);
|
|
void aciML_Resume(void);
|
|
|
|
int aciGetCurCycle(void);
|
|
|
|
void ipal_init(unsigned char* p);
|
|
|
|
void aciPutBufSpr(int x,int y,int sx,int sy,int bsx,void* src,void* dest,int col,int col_sz);
|
|
|
|
iListElement* iGetObject(const char* scr,const char* obj);
|
|
int aciGetCurMatrixPrice(void);
|
|
|
|
void aciChangeWorld(int id);
|
|
|
|
void iChatInit(void);
|
|
void iChatQuant(int flush = 0);
|
|
void iChatFinit(void);
|
|
void iChatKeyQuant(SDL_Event *k);
|
|
void iChatMouseQuant(int x,int y,int bt);
|
|
|
|
void LoadResourceSOUND(const char *path_name, int surface);
|
|
void SoundEscaveOff(void);
|
|
|
|
void aci_setMatrixBorder(void);
|
|
void aci_setScMatrixBorder(void);
|
|
void aci_LocationQuant(void);
|
|
void aciAutoMoveItems(void);
|
|
void aciSetMechName(void);
|
|
void aciSell_Item(invItem* p);
|
|
void aciSell_Matrix(invMatrix* p);
|
|
void aciSellMoveItem(void);
|
|
void aciInitInfoPanels(void);
|
|
int aciCheckSellItem(void);
|
|
void aciSetTimePanel(void);
|
|
void aciInitEvLineID(void);
|
|
void aciChangeList(void);
|
|
void aciInitShopItems(void);
|
|
void aciSetShopItem(int id);
|
|
void aciShowFrags(void);
|
|
void aciInitAviObject(void);
|
|
|
|
void aciPutTreasureItem(void);
|
|
|
|
void aciCHandler(int k);
|
|
|
|
void aciHandleCameraEvent(int code,int data);
|
|
void aciPrepareWorldsMenu(void);
|
|
|
|
void aciSet_aMouse(void);
|
|
void aciSet_iMouse(void);
|
|
|
|
void aciNextShopItem(void);
|
|
void aciPrevShopItem(void);
|
|
void aciInitShopAvi(void);
|
|
void aciChangeAviIndex(void);
|
|
void aciBuyItem(void);
|
|
|
|
void aciInitShopButtons(void);
|
|
|
|
void aciGetEleech(void);
|
|
void aciGetRubox(void);
|
|
void aciInitMechosInfo(invMatrix* p,InfoPanel* ip);
|
|
|
|
void aciInitShopList(void);
|
|
void aciChooseShopItem(void);
|
|
|
|
void aciNextPhrase(void);
|
|
void aciStartSpeech(void);
|
|
void aciInitCurMatrixPtr(void);
|
|
|
|
void aciHandleSubmenuEvent(int id,fncMenuItem* p);
|
|
|
|
char* aciGetPrice(iListElement* p,int mode,int sell_mode);
|
|
char* aciGetItemLoad(invItem* p,int mode);
|
|
|
|
void aciSwapMatrices(void);
|
|
void aciCancelMatrix(void);
|
|
void aciShowScMatrix(void);
|
|
|
|
void aciNextPhrase(void);
|
|
void aciBuildQuestList(void);
|
|
void aciAskQuestion(void);
|
|
void aciShowBlockPhrase(void);
|
|
|
|
void aciPay4Item(invItem* p);
|
|
int aciCheckItemCredits(void);
|
|
|
|
void iScrQuant(void);
|
|
void i_evince_pal(unsigned char* p,int delta);
|
|
|
|
int aciGetScreenMechos(int x,int y);
|
|
|
|
void redraw_fnc(int x,int y,int sx,int sy,int fnc);
|
|
|
|
char* GetCompasTarget(void);
|
|
|
|
void swap_buf_col(int src,int dest,int sx,int sy,unsigned char* buf);
|
|
|
|
void restore_mouse_cursor(void);
|
|
void set_mouse_cursor(char* p,int sx,int sy);
|
|
void set_map_to_fullscreen();
|
|
void set_map_to_ibs(ibsObject* ibs);
|
|
|
|
void put_fon(int x,int y,int sx,int sy,unsigned char* buf);
|
|
void put_attr_fon(int x,int y,int sx,int sy,unsigned char* buf);
|
|
void iregRender(int LowX,int LowY,int HiX,int HiY);
|
|
|
|
void show_map(int x,int y,int sx,int sy);
|
|
void a_buf_line(int x1,int y1,int x2,int y2,int col,int sx,int sy,unsigned char* buf);
|
|
void a_buf_line2(int x1,int y1,int x2,int y2,int col,int sx,int sy,unsigned char* buf);
|
|
void a_buf_setpixel(int x,int y,int sx,int sy,int col,unsigned char* buf);
|
|
|
|
void ibsout(int x, int y, void* ptr);
|
|
void ibsout(int x, int y, void* ptr, uint8_t *renderBuffer);
|
|
|
|
void change_screen(int scr);
|
|
|
|
void mem_putspr(int x,int y,int sx,int sy,int bsx,int bsy,unsigned char* src,unsigned char* dest);
|
|
void mem_putspr_h(int x,int y,int sx,int sy,int bsx,int bsy,unsigned char* src,unsigned char* dest);
|
|
void mem_rectangle(int x,int y,int sx,int sy,int bsx,int col_in,int col_out,int mode,void* buf);
|
|
|
|
void build_cell_frame(void);
|
|
void free_cell_frame(void);
|
|
void aMS_init(void);
|
|
|
|
#if defined(_GENERATE_MATRIX_SHAPES_) || defined(_GENERATE_iMATRIX_SHAPES_)
|
|
void smooth_shape_quant(int sx,int sy,unsigned char* buf,int src,int dest,int cnd);
|
|
#endif
|
|
|
|
void put_buf2col(int x,int y,int sx,int sy,unsigned char* buf,int null_lev,int n_mode);
|
|
void put_map(int x,int y,int sx,int sy);
|
|
|
|
#ifdef _DEBUG
|
|
void aciResizeItem(double delta);
|
|
#endif
|
|
|
|
int acsQuant(void);
|
|
|
|
/* --------------------------- DEFINITION SECTION --------------------------- */
|
|
|
|
const int aciTEXT_COLOR = 165 + (2 << 16);
|
|
|
|
// Ind colors...
|
|
#define ACI_IND_SPIRAL_COL 195
|
|
#define ACI_IND_SPIRAL_SIZE 3
|
|
|
|
#define ACI_IND_JUMP_COL 160
|
|
#define ACI_IND_JUMP_SIZE 1
|
|
|
|
#define ACI_IND_DVC_COL 160
|
|
#define ACI_IND_DVC_SIZE 1
|
|
|
|
#define ACI_IND_NRG0_COL 224
|
|
#define ACI_IND_NRG0_SIZE 1
|
|
#define ACI_IND_NRG1_COL 128
|
|
#define ACI_IND_NRG1_SIZE 1
|
|
|
|
#define ACI_IND_LOAD_COL 224
|
|
#define ACI_IND_LOAD_SIZE 1
|
|
|
|
#define ACI_IND_FON_START 74
|
|
#define ACI_IND_FON_SIZE 3
|
|
|
|
#define ACI_IND_ARROW_START 72
|
|
#define ACI_IND_ARROW_SIZE 1
|
|
|
|
#if defined(_GENERATE_MATRIX_SHAPES_) || defined(_GENERATE_iMATRIX_SHAPES_)
|
|
//#define _FACET_FLOOR_
|
|
#ifdef _GENERATE_MATRIX_SHAPES_
|
|
#define SHAPE_DEPTH 6
|
|
#else
|
|
#define SHAPE_DEPTH 8
|
|
#endif
|
|
#endif
|
|
|
|
const int MAX_ITEM_ID = 9;
|
|
const int MAX_MATRIX_ID = 3;
|
|
|
|
#define AS_NUMRES 2
|
|
|
|
#define FULLSCR_MODE 1
|
|
#define INVSCR_MODE 2
|
|
|
|
#define FM_OFFSET 3
|
|
#define ACI_ARROW_OFFS_UP 1
|
|
#define ACI_ARROW_OFFS_DOWN 5
|
|
|
|
#define IND_DATA_OFFS 5
|
|
|
|
int aCellSize = 20;
|
|
int iCellSize = 20;
|
|
int aci_CellSize = 20;
|
|
|
|
int aciCurCredits01 = 0;
|
|
|
|
int curItemID = 1;
|
|
int curMatrixID = 0;
|
|
|
|
unsigned char* aCellFrame;
|
|
|
|
int aciTextColBright = 0;
|
|
int aciTextColBrightDelta = 1;
|
|
|
|
int aci_tmp = 0;
|
|
int aci_tmp_max = 64;
|
|
|
|
int aciCurLuck = 0;
|
|
int aciPrevLuck = -1;
|
|
int aciCurDominance = 0;
|
|
int aciPrevDominance = -1;
|
|
|
|
int aciCurEnergy = 63;
|
|
int aciMaxEnergy = 64;
|
|
|
|
int aciCurArmor = 63;
|
|
int aciMaxArmor = 64;
|
|
|
|
int aciCurLoad = 0;
|
|
int aciMaxLoad = 1;
|
|
|
|
int aciCurFrame = 0;
|
|
|
|
int aciTextEndFlag = 0;
|
|
|
|
int aciCurWpnResource = 0;
|
|
int aciMaxWpnResource = 1;
|
|
|
|
int aciCurDvcResource = 0;
|
|
int aciMaxDvcResource = 1;
|
|
|
|
int aciCurJumpCount = 3;
|
|
int aciMaxJumpCount = 5;
|
|
int aciPrevJumpCount = -1;
|
|
|
|
//int aciCurCredits = 11000;
|
|
int aciCurTime = 0;
|
|
|
|
int aciCurJumpImpulse = 0;
|
|
int aciMaxJumpImpulse = 1;
|
|
|
|
int aciNumColSchemes = 0;
|
|
int aciColSchemeLen = 0;
|
|
unsigned char** aciColorSchemes = NULL;
|
|
unsigned char* aciCurColorScheme;
|
|
unsigned char* actIntPal;
|
|
|
|
const char* aci_curLocationName = "";
|
|
int aci_curLocationID = 0;
|
|
int aci_SecondMatrixID = 0;
|
|
|
|
char* aci_ivMapName = NULL;
|
|
char* aci_iScreenID = NULL;
|
|
unsigned char aci_iscrPal[768];
|
|
|
|
invMatrix* backupMatrix;
|
|
|
|
int prevWorld;
|
|
|
|
int aciPickupItems = 1;
|
|
int aciPickupDevices = 1;
|
|
|
|
int aciBufRedrawFlag = 0;
|
|
|
|
int aciProtractorEvent = 0;
|
|
int aciMechMessiahEvent = 0;
|
|
int aciTeleportEvent = 0;
|
|
|
|
#ifdef _DEBUG
|
|
int aciShotCount = 0;
|
|
int aciCurIND = 0;
|
|
int aciIndMove = 0;
|
|
#endif
|
|
|
|
aciBitmapMenuItem::aciBitmapMenuItem(void)
|
|
{
|
|
ID = 0;
|
|
PosX = PosY = 0;
|
|
SizeX = SizeY = 0;
|
|
|
|
numStates = curState = 0;
|
|
flags = 0;
|
|
|
|
fname = NULL;
|
|
}
|
|
|
|
aciBitmapMenuItem::~aciBitmapMenuItem(void)
|
|
{
|
|
if(fname) delete[] fname;
|
|
if(flags & BMI_DATA_LOADED) delete[] data;
|
|
}
|
|
|
|
aciBitmapMenu::aciBitmapMenu(void)
|
|
{
|
|
ID = 0;
|
|
PosX = PosY = 0;
|
|
SizeX = SizeY = 0;
|
|
|
|
activeCount = 0;
|
|
curCount = 0;
|
|
|
|
flags = BM_REBUILD;
|
|
upMenu = NULL;
|
|
|
|
items = new iList;
|
|
pictBuf = NULL;
|
|
}
|
|
|
|
aciBitmapMenu::~aciBitmapMenu(void)
|
|
{
|
|
aciBitmapMenuItem* p,*p1;
|
|
p = (aciBitmapMenuItem*)items -> last;
|
|
while(p){
|
|
p1 = (aciBitmapMenuItem*)p -> prev;
|
|
delete p;
|
|
p = p1;
|
|
}
|
|
delete items;
|
|
if(pictBuf) delete[] pictBuf;
|
|
}
|
|
|
|
void aciBitmapMenuItem::load(void)
|
|
{
|
|
XStream fh;
|
|
short sx,sy,s;
|
|
if(!fname) return;
|
|
|
|
if(!(flags & BMI_DATA_LOADED)){
|
|
fh.open(fname,XS_IN);
|
|
fh > sx > sy > s;
|
|
|
|
SizeX = sx;
|
|
SizeY = sy;
|
|
numStates = s;
|
|
|
|
data = new unsigned char[SizeX * SizeY * numStates];
|
|
fh.read(data,SizeX * SizeY * numStates);
|
|
fh.close();
|
|
|
|
flags |= BMI_DATA_LOADED;
|
|
switch(ID){
|
|
case BMENU_ITEM_ROT:
|
|
curState = iGetOptionValue(iCAMERA_TURN);
|
|
break;
|
|
case BMENU_ITEM_ZOOM:
|
|
curState = iGetOptionValue(iCAMERA_SCALE);
|
|
break;
|
|
case BMENU_ITEM_PERSP:
|
|
curState = iGetOptionValue(iCAMERA_SLOPE);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
void aciBitmapMenuItem::free(void)
|
|
{
|
|
if(flags & BMI_DATA_LOADED){
|
|
delete[] data;
|
|
flags ^= BMI_DATA_LOADED;
|
|
}
|
|
}
|
|
|
|
void aciBitmapMenuItem::init_name(char* p)
|
|
{
|
|
int sz = strlen(p) + 1;
|
|
if(fname) delete fname;
|
|
|
|
fname = new char[sz];
|
|
strcpy(fname,p);
|
|
}
|
|
|
|
void aciBitmapMenu::add_item(aciBitmapMenuItem* p)
|
|
{
|
|
items -> connect((iListElement*)p);
|
|
}
|
|
|
|
void aciBitmapMenuItem::redraw(int bsx,int bsy,unsigned char* buf)
|
|
{
|
|
mem_putspr(PosX,PosY,SizeX,SizeY,bsx,bsy,data + SizeX * SizeY * curState,buf);
|
|
}
|
|
|
|
int aciBitmapMenuItem::check_xy(int x,int y)
|
|
{
|
|
if(x >= PosX && y >= PosY && x < PosX + SizeX && y < PosY + SizeY) return 1;
|
|
return 0;
|
|
}
|
|
|
|
void aciBitmapMenu::init(void)
|
|
{
|
|
aciBitmapMenuItem* p = (aciBitmapMenuItem*)items -> last;
|
|
while(p){
|
|
p -> load();
|
|
p = (aciBitmapMenuItem*)p -> prev;
|
|
}
|
|
alloc_mem();
|
|
remap_coords();
|
|
}
|
|
|
|
void aciBitmapMenu::finit(void)
|
|
{
|
|
aciBitmapMenuItem* p = (aciBitmapMenuItem*)items -> last;
|
|
while(p){
|
|
p -> free();
|
|
p = (aciBitmapMenuItem*)p -> prev;
|
|
}
|
|
free_mem();
|
|
}
|
|
|
|
void aciBitmapMenu::alloc_mem(void)
|
|
{
|
|
pictBuf = new unsigned char[SizeX * SizeY];
|
|
flags |= BM_REBUILD;
|
|
}
|
|
|
|
void aciBitmapMenu::free_mem(void)
|
|
{
|
|
delete[] pictBuf;
|
|
pictBuf = NULL;
|
|
}
|
|
|
|
void aciBitmapMenu::build_pict(void)
|
|
{
|
|
aciBitmapMenuItem* p = (aciBitmapMenuItem*)items -> last;
|
|
memset(pictBuf,aciCurColorScheme[ACI_BACK_COL],SizeX * SizeY);
|
|
while(p){
|
|
p -> redraw(SizeX,SizeY,pictBuf);
|
|
p = (aciBitmapMenuItem*)p -> prev;
|
|
}
|
|
flags &= ~BM_REBUILD;
|
|
}
|
|
|
|
void aciBitmapMenu::redraw(int x,int y,int sx,int sy)
|
|
{
|
|
int dx,dy;
|
|
|
|
if(!pictBuf) return;
|
|
|
|
dx = (sx - SizeX)/2;
|
|
dy = (sy - SizeY)/2;
|
|
|
|
if(flags & BM_REBUILD) build_pict();
|
|
XGR_PutSpr(x + dx,y + dy,SizeX,SizeY,pictBuf,XGR_BLACK_FON);
|
|
}
|
|
|
|
#ifdef _ACI_BML_FONTS_
|
|
aciFont::aciFont(void)
|
|
{
|
|
flags = 0;
|
|
SizeX = SizeY = Size = 0;
|
|
data = NULL;
|
|
LeftOffs = RightOffs = NULL;
|
|
}
|
|
|
|
aciFont::~aciFont(void)
|
|
{
|
|
if(data) delete data;
|
|
if(LeftOffs) delete LeftOffs;
|
|
if(RightOffs) delete RightOffs;
|
|
}
|
|
|
|
void aciFont::load(char* fname)
|
|
{
|
|
short sx,sy,sz;
|
|
XStream fh(fname,XS_IN);
|
|
fh > sx > sy > sz;
|
|
SizeX = sx;
|
|
SizeY = sy;
|
|
Size = sz;
|
|
|
|
data = new unsigned char[SizeX * SizeY * Size];
|
|
fh.read(data,SizeX * SizeY * Size);
|
|
fh.close();
|
|
}
|
|
|
|
void aciFont::calc_offs(void)
|
|
{
|
|
int i,j,s,offs = 0;
|
|
int align_left,align_right,fl,fr;
|
|
unsigned char* p = data;
|
|
|
|
LeftOffs = new char[Size];
|
|
RightOffs = new char[Size];
|
|
|
|
for(s = 0; s < Size; s ++){
|
|
offs = SizeX * SizeY * s;
|
|
align_left = align_right = 3;
|
|
for(i = 0; i < SizeY; i ++){
|
|
fl = fr = 0;
|
|
for(j = 0; j < SizeX - 1; j ++){
|
|
if(flags & ACI_RANGE_FONT){
|
|
if(!fl && p[offs + j] && j < align_left){
|
|
align_left = j;
|
|
fl = 1;
|
|
}
|
|
if(!fr && p[offs + SizeX - j - 1] && j < align_right){
|
|
align_right = j;
|
|
fr = 1;
|
|
}
|
|
}
|
|
else {
|
|
if(!fl && p[offs + j] == 1 && j < align_left){
|
|
align_left = j;
|
|
fl = 1;
|
|
}
|
|
if(!fr && p[offs + SizeX - j - 1] == 1 && j < align_right){
|
|
align_right = j;
|
|
fr = 1;
|
|
}
|
|
}
|
|
}
|
|
offs += SizeX;
|
|
}
|
|
if(s != ' '){
|
|
LeftOffs[s] = align_left;
|
|
RightOffs[s] = align_right;
|
|
}
|
|
else {
|
|
if(SizeX < 8){
|
|
LeftOffs[s] = 1;
|
|
RightOffs[s] = 1;
|
|
}
|
|
else {
|
|
LeftOffs[s] = 3;
|
|
RightOffs[s] = 3;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
aciWorldMap::aciWorldMap(void)
|
|
{
|
|
int i;
|
|
redraw_buf = NULL;
|
|
ShapeSizeX = NULL;
|
|
ShapeSizeY = NULL;
|
|
|
|
shapes = NULL;
|
|
|
|
flags = WMAP_REBUILD_PIC;
|
|
|
|
world_list = new iList;
|
|
|
|
shape_files = new char*[3];
|
|
for(i = 0; i < 3; i ++) {
|
|
shape_files[i] = NULL;
|
|
}
|
|
|
|
ShapeOffsX = new short[3];
|
|
ShapeOffsY = new short[3];
|
|
|
|
world_ids = new signed char[AS_MAX_WORLD];
|
|
|
|
for(i = 0; i < 3; i ++)
|
|
ShapeOffsX[i] = ShapeOffsY[i] = 0;
|
|
|
|
world_ptr = new aciWorldInfo*[AS_MAX_WORLD];
|
|
}
|
|
|
|
aciWorldMap::~aciWorldMap(void)
|
|
{
|
|
int i;
|
|
aciWorldInfo* p,*p1;
|
|
|
|
delete[] ShapeOffsX;
|
|
delete[] ShapeOffsY;
|
|
|
|
if(redraw_buf) {
|
|
delete[] redraw_buf;
|
|
}
|
|
|
|
delete[] world_ids;
|
|
|
|
if(shapes){
|
|
for(i = 0; i < AS_NUM_WORLD_SHAPES; i ++)
|
|
delete[] shapes[i];
|
|
delete[] shapes;
|
|
}
|
|
if(ShapeSizeX){
|
|
delete[] ShapeSizeX;
|
|
}
|
|
if(ShapeSizeY){
|
|
delete[] ShapeSizeY;
|
|
}
|
|
|
|
for(i = 0; i < 3; i ++) {
|
|
if(shape_files[i]) {
|
|
delete[] shape_files[i];
|
|
}
|
|
}
|
|
delete[] shape_files;
|
|
|
|
p = (aciWorldInfo*)world_list -> last;
|
|
while(p){
|
|
p1 = (aciWorldInfo*)p -> prev;
|
|
delete p;
|
|
p = p1;
|
|
}
|
|
delete world_list;
|
|
|
|
delete[] world_ptr;
|
|
}
|
|
|
|
int aciWorldMap::world_key(int id)
|
|
{
|
|
int i;
|
|
aciWorldInfo* p,*p1;
|
|
|
|
p1 = NULL;
|
|
p = (aciWorldInfo*)world_list -> last;
|
|
while(p){
|
|
if(p -> links[id]) return 1;
|
|
if(p -> ID == id) p1 = p;
|
|
p = (aciWorldInfo*)p -> prev;
|
|
}
|
|
if(p1){
|
|
for(i = 0; i < AS_MAX_WORLD; i ++)
|
|
if(p1 -> links[i]) return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
aciWorldInfo::aciWorldInfo(void)
|
|
{
|
|
ID = 0;
|
|
uvsID = -1;
|
|
flags = 0;
|
|
|
|
font = 0;
|
|
|
|
PosX = PosY = 0;
|
|
|
|
name = NULL;
|
|
|
|
letter = 0;
|
|
shape_id = 0;
|
|
|
|
links = new char[AS_MAX_WORLD];
|
|
memset(links,0,AS_MAX_WORLD);
|
|
}
|
|
|
|
aciWorldInfo::~aciWorldInfo(void)
|
|
{
|
|
if(name) {
|
|
delete[] name;
|
|
}
|
|
|
|
delete[] links;
|
|
}
|
|
|
|
void aciWorldInfo::add_link(int id)
|
|
{
|
|
links[id] = 1;
|
|
}
|
|
|
|
void aciWorldInfo::delete_link(int id)
|
|
{
|
|
links[id] = 0;
|
|
}
|
|
|
|
aciLocationInfo::aciLocationInfo(void)
|
|
{
|
|
int i;
|
|
|
|
ID = 0;
|
|
WorldID = 0;
|
|
SaveScreenID = 3;
|
|
|
|
numIndex = new char[ACI_LOCATION_INDEX_SIZE];
|
|
memset(numIndex,-1,ACI_LOCATION_INDEX_SIZE);
|
|
|
|
mapData = new iList;
|
|
|
|
numColorScheme = SCH_ISCREEN;
|
|
mapName = NULL;
|
|
palName = NULL;
|
|
screenID = NULL;
|
|
|
|
nameID = NULL;
|
|
nameID2 = NULL;
|
|
|
|
numMatrixShutters1 = 0;
|
|
MatrixShutters1 = NULL;
|
|
|
|
numMatrixShutters2 = 0;
|
|
MatrixShutters2 = NULL;
|
|
|
|
numGateShutters = 0;
|
|
GateShutters = NULL;
|
|
|
|
ExcludeItems = new char[ACI_MAX_TYPE];
|
|
memset(ExcludeItems,0,ACI_MAX_TYPE);
|
|
|
|
objIDs = new char*[ACI_NUM_OBJECTS];
|
|
objList = new iListElement*[ACI_NUM_OBJECTS];
|
|
|
|
s_objIDs = new char*[ACI_NUM_S_OBJECTS];
|
|
s_objList = new iListElement*[ACI_NUM_S_OBJECTS];
|
|
|
|
soundResPath = NULL;
|
|
|
|
for(i = 0; i < ACI_NUM_OBJECTS; i ++)
|
|
objIDs[i] = NULL;
|
|
|
|
for(i = 0; i < ACI_NUM_S_OBJECTS; i ++)
|
|
s_objIDs[i] = NULL;
|
|
}
|
|
|
|
aciLocationInfo::~aciLocationInfo(void)
|
|
{
|
|
int i;
|
|
iListElement* p,*p1;
|
|
if(nameID) delete[] nameID;
|
|
if(nameID2) delete[] nameID2;
|
|
if(mapName) delete[] mapName;
|
|
if(palName) delete[] palName;
|
|
if(screenID) delete[] screenID;
|
|
|
|
p = mapData -> last;
|
|
while(p){
|
|
p1 = p -> prev;
|
|
delete p;
|
|
p = p1;
|
|
}
|
|
delete mapData;
|
|
|
|
if(soundResPath)
|
|
delete[] soundResPath;
|
|
|
|
delete[] numIndex;
|
|
|
|
for(i = 0; i < numMatrixShutters1; i ++)
|
|
delete MatrixShutters1[i];
|
|
delete[] MatrixShutters1;
|
|
|
|
for(i = 0; i < numMatrixShutters2; i ++)
|
|
delete MatrixShutters2[i];
|
|
delete[] MatrixShutters2;
|
|
|
|
for(i = 0; i < numGateShutters; i ++)
|
|
if(GateShutters[i]) delete GateShutters[i];
|
|
delete[] GateShutters;
|
|
|
|
for(i = 0; i < ACI_NUM_OBJECTS; i ++){
|
|
if(objIDs[i])
|
|
delete[] objIDs[i];
|
|
}
|
|
delete[] objIDs;
|
|
for(i = 0; i < ACI_NUM_S_OBJECTS; i ++){
|
|
if(s_objIDs[i])
|
|
delete[] s_objIDs[i];
|
|
}
|
|
delete[] s_objIDs;
|
|
delete[] ExcludeItems;
|
|
|
|
delete[] objList;
|
|
delete[] s_objList;
|
|
}
|
|
|
|
void aciLocationInfo::prepare(void)
|
|
{
|
|
int i;
|
|
iScreen* scr;
|
|
if(!objIDs[ACI_SHOP_SCREEN_ID]){
|
|
for(i = 0; i < ACI_NUM_OBJECTS; i ++)
|
|
objList[i] = NULL;
|
|
}
|
|
else {
|
|
scr = (iScreen*)iScrDisp -> get_object(objIDs[ACI_SHOP_SCREEN_ID]);
|
|
for(i = 0; i < ACI_NUM_OBJECTS; i ++){
|
|
if(objIDs[i]){
|
|
objList[i] = scr -> get_object(objIDs[i]);
|
|
}
|
|
else {
|
|
objList[i] = NULL;
|
|
}
|
|
}
|
|
}
|
|
scr = (iScreen*)iScrDisp -> get_object(screenID);
|
|
if(!scr) ErrH.Abort("Escave screen not found...");
|
|
for(i = 0; i < ACI_NUM_S_OBJECTS; i ++){
|
|
if(s_objIDs[i]){
|
|
s_objList[i] = scr -> get_object(s_objIDs[i]);
|
|
}
|
|
else {
|
|
s_objList[i] = NULL;
|
|
}
|
|
}
|
|
}
|
|
|
|
void bmlObject::change_color(int from,int to)
|
|
{
|
|
int i,j,fr,index = 0;
|
|
for(fr = 0; fr < Size; fr ++){
|
|
for(i = 0; i < SizeY; i ++){
|
|
for(j = 0; j < SizeX; j ++){
|
|
if(frames[index] == from) frames[index] = to;
|
|
index ++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void aciLocationInfo::init_map_data(void)
|
|
{
|
|
unsigned short x,y,sx,sy,num;
|
|
unsigned char* data;
|
|
|
|
XStream fh;
|
|
|
|
iListElement* p = mapData -> last;
|
|
|
|
while(p){
|
|
if(p -> ID_ptr.size()){
|
|
fh.open(p->ID_ptr.c_str(),XS_IN);
|
|
fh > sx > sy > num > x > y;
|
|
data = new unsigned char[sx * sy * num];
|
|
fh.read(data,sx * sy * num);
|
|
fh.close();
|
|
|
|
put_fon(x,y,sx,sy,data);
|
|
put_attr_fon(x,y,sx,sy,data + sx * sy);
|
|
// iregRender(x,y,x + sx,y + sy);
|
|
|
|
delete[] data;
|
|
}
|
|
p = p -> prev;
|
|
}
|
|
}
|
|
|
|
iScreen* aciLocationInfo::get_shop_scr(void)
|
|
{
|
|
iScreen* scr;
|
|
if(!objIDs[ACI_SHOP_SCREEN_ID]) return NULL;
|
|
scr = (iScreen*)iScrDisp -> get_object(objIDs[ACI_SHOP_SCREEN_ID]);
|
|
|
|
return scr;
|
|
}
|
|
|
|
aIndData::aIndData(void)
|
|
{
|
|
ID = 0;
|
|
|
|
type = IND_CLOCK;
|
|
|
|
NumVals = 1;
|
|
|
|
CornerNum = 0;
|
|
|
|
promptData = NULL;
|
|
|
|
flags = 0;
|
|
|
|
SizeX = SizeY = 0;
|
|
|
|
pict_buf = NULL;
|
|
bml = NULL;
|
|
|
|
colors = NULL;
|
|
check_points = NULL;
|
|
value = NULL;
|
|
value_ptr = NULL;
|
|
max_value = NULL;
|
|
|
|
PosX = PosY = 0;
|
|
|
|
alloc_mem();
|
|
}
|
|
|
|
aIndData::~aIndData(void)
|
|
{
|
|
if(pict_buf)
|
|
delete[] pict_buf;
|
|
|
|
delete[] check_points;
|
|
delete[] value;
|
|
delete[] value_ptr;
|
|
delete[] max_value;
|
|
delete[] colors;
|
|
|
|
if(promptData)
|
|
delete[] promptData;
|
|
|
|
if(bml)
|
|
delete bml;
|
|
}
|
|
|
|
bmlObject::bmlObject(void)
|
|
{
|
|
ID = 0;
|
|
anchor = 0;
|
|
flags = 0;
|
|
SizeX = SizeY = Size = 0;
|
|
OffsX = OffsY = 0;
|
|
frames = NULL;
|
|
name = NULL;
|
|
}
|
|
|
|
bmlObject::~bmlObject(void)
|
|
{
|
|
if(frames) delete[] frames;
|
|
if(name) delete[] name;
|
|
}
|
|
|
|
void bmlObject::init_name(char* p)
|
|
{
|
|
int sz = strlen(p);
|
|
name = new char[sz + 1];
|
|
strcpy(name,p);
|
|
}
|
|
|
|
void bmlObject::free(void)
|
|
{
|
|
if(frames) {
|
|
delete[] frames;
|
|
}
|
|
frames = NULL;
|
|
}
|
|
|
|
void bmlObject::load(const char* fname,int bmp)
|
|
{
|
|
if(!fname)
|
|
fname = name;
|
|
|
|
if(!fname) return;
|
|
|
|
if(flags & BML_FRAMES_LOADED) free();
|
|
|
|
XStream fh(fname,XS_IN);
|
|
if(bmp)
|
|
flags |= BMP_FLAG;
|
|
|
|
if(!(flags & BMP_FLAG) && !(flags & BG_FLAG)){
|
|
if(!(flags & BML_NO_OFFSETS))
|
|
fh > SizeX > SizeY > Size > OffsX > OffsY;
|
|
else
|
|
fh > SizeX > SizeY > Size;
|
|
}
|
|
else {
|
|
if(flags & BMP_FLAG){
|
|
fh > SizeX > SizeY;
|
|
Size = 1;
|
|
}
|
|
if(flags & BG_FLAG){
|
|
Size = 1;
|
|
}
|
|
}
|
|
frames = new unsigned char[SizeX * SizeY * Size];
|
|
fh.read(frames,SizeX * SizeY * Size);
|
|
fh.close();
|
|
|
|
flags |= BML_FRAMES_LOADED;
|
|
}
|
|
|
|
void bmlObject::load2mem(unsigned char* ptr,char* fname)
|
|
{
|
|
if(!fname)
|
|
fname = name;
|
|
|
|
if(!fname) return;
|
|
|
|
//std::cout<<"bmlObject::load2mem "<<fname<<std::endl;
|
|
XStream fh(fname,XS_IN);
|
|
|
|
if(!(flags & BMP_FLAG) && !(flags & BG_FLAG)){
|
|
fh > SizeX > SizeY > Size > OffsX > OffsY;
|
|
}
|
|
else {
|
|
if(flags & BMP_FLAG){
|
|
fh > SizeX > SizeY;
|
|
Size = 1;
|
|
}
|
|
if(flags & BG_FLAG){
|
|
Size = 1;
|
|
}
|
|
}
|
|
fh.read(ptr,SizeX * SizeY * Size);
|
|
fh.close();
|
|
}
|
|
|
|
void bmlObject::show(int frame)
|
|
{
|
|
unsigned char* frame_ptr = frames + SizeX * SizeY * frame;
|
|
|
|
XGR_PutSpr(OffsX,OffsY,SizeX,SizeY,frame_ptr,XGR_HIDDEN_FON | XGR_CLIPPED);
|
|
}
|
|
|
|
void bmlObject::offs_show(int x,int y,int frame)
|
|
{
|
|
unsigned char* frame_ptr = frames + SizeX * SizeY * frame;
|
|
XGR_PutSpr(x,y,SizeX,SizeY,frame_ptr,XGR_HIDDEN_FON | XGR_CLIPPED);
|
|
}
|
|
|
|
ibsObject::ibsObject(void)
|
|
{
|
|
ID = 0;
|
|
image = NULL;
|
|
name = NULL;
|
|
|
|
fontID = 0;
|
|
|
|
memset(indPosX,0,4);
|
|
memset(indPosY,0,4);
|
|
|
|
ImageSize = 0;
|
|
}
|
|
|
|
ibsObject::~ibsObject(void)
|
|
{
|
|
if(image) {
|
|
delete[] image;
|
|
}
|
|
if(name) {
|
|
delete[] name;
|
|
}
|
|
}
|
|
|
|
void ibsObject::free(void)
|
|
{
|
|
if(image) {
|
|
delete[] image;
|
|
}
|
|
image = NULL;
|
|
}
|
|
|
|
void ibsObject::set_name(char* p)
|
|
{
|
|
int sz = strlen(p);
|
|
name = new char[sz + 1];
|
|
strcpy(name,p);
|
|
}
|
|
|
|
void ibsObject::load(char* fname)
|
|
{
|
|
if(!fname) fname = name;
|
|
|
|
if(!fname) ErrH.Abort("Bad XBM name");
|
|
|
|
XStream fh;
|
|
XBuffer XBuf;
|
|
XBuf < fname < ".xbm";
|
|
fh.open(XBuf.GetBuf(),XS_IN);
|
|
fh > PosX > PosY > bSizeX > bSizeY > SizeX > SizeY > ImageSize;
|
|
image = new unsigned char[ImageSize];
|
|
fh.read(image,ImageSize);
|
|
fh.close();
|
|
|
|
SideX = SizeX/2;
|
|
SideY = SizeY/2;
|
|
|
|
CenterX = PosX + SideX;
|
|
CenterY = PosY + SideY;
|
|
}
|
|
|
|
void ibsObject::show(uint8_t* renderBuffer)
|
|
{
|
|
ibsout(PosX, PosY, image, renderBuffer);
|
|
}
|
|
|
|
void ibsObject::show_bground(void)
|
|
{
|
|
for(int i = 0; i < backs.size(); i++){
|
|
backs[i] -> show();
|
|
}
|
|
}
|
|
|
|
actIntDispatcher::actIntDispatcher(void)
|
|
{
|
|
int i;
|
|
flags = 0;
|
|
|
|
curIbsID = 0;
|
|
|
|
iP = NULL;
|
|
|
|
wMap = NULL;
|
|
qMenu = NULL;
|
|
|
|
curPrompt = new aciPromptData;
|
|
|
|
ScrTextData = new aciScreenText;
|
|
|
|
invPrompt = new XGR_MousePromptScreen;
|
|
infPrompt = new XGR_MousePromptScreen;
|
|
|
|
freeItemList = new iList;
|
|
freeMatrixList = new iList;
|
|
freeMenuItemList = new iList;
|
|
|
|
b_menuList = new iList;
|
|
|
|
map_names = new char*[MAX_NUM_MAP];
|
|
for(i = 0; i < MAX_NUM_MAP; i ++)
|
|
map_names[i] = NULL;
|
|
|
|
i_infoPanels = new iList;
|
|
infoPanels = new iList;
|
|
|
|
curScrMode = prevScrMode = FULLSCR_MODE;
|
|
|
|
ModeObj = new aKeyObj;
|
|
InvObj = new aKeyObj;
|
|
InvObj -> add_key(SDL_SCANCODE_RETURN);
|
|
InfoObj = new aKeyObj;
|
|
|
|
locationList = new iList;
|
|
|
|
menuList = new iList;
|
|
itemList = new iList;
|
|
matrixList = new iList;
|
|
|
|
i_matrixList = new iList;
|
|
i_Counters = new iList;
|
|
i_itemList = new iList;
|
|
i_menuList = new iList;
|
|
|
|
iscr_iP = NULL;
|
|
ascr_iP = NULL;
|
|
|
|
indList = new iList;
|
|
|
|
intButtons = new iList;
|
|
invButtons = new iList;
|
|
infButtons = new iList;
|
|
|
|
intCounters = new iList;
|
|
invCounters = new iList;
|
|
infCounters = new iList;
|
|
|
|
curItem = NULL;
|
|
|
|
events = new actEventHeap;
|
|
|
|
curMode = AS_INFO_MODE;
|
|
|
|
mapObj = new bmlObject;
|
|
mapObj -> flags |= BMP_FLAG;
|
|
|
|
ibsList = new iList;
|
|
backList = new iList;
|
|
|
|
curIbs = NULL;
|
|
curMatrix = NULL;
|
|
}
|
|
|
|
actIntDispatcher::~actIntDispatcher(void)
|
|
{
|
|
int i;
|
|
fncMenu* p,*p1;
|
|
invMatrix* m,*m1;
|
|
invItem* it,*it1;
|
|
aButton* bt,*bt1;
|
|
aIndData* ind,*ind1;
|
|
CounterPanel* cp,*cp1;
|
|
aciLocationInfo* lP,*lP1;
|
|
InfoPanel* pl,*pl1;
|
|
fncMenuItem* f,*f1;
|
|
bmlObject* bml,*bml1;
|
|
ibsObject* ibs,*ibs1;
|
|
|
|
aciBitmapMenu* bm,*bm1;
|
|
|
|
delete curPrompt;
|
|
|
|
delete invPrompt;
|
|
delete infPrompt;
|
|
|
|
XGR_MouseSetPromptData(NULL);
|
|
|
|
if(iP) delete iP;
|
|
if(iscr_iP) delete iscr_iP;
|
|
|
|
if(wMap) delete wMap;
|
|
|
|
if(qMenu) delete qMenu;
|
|
|
|
delete ScrTextData;
|
|
|
|
if(aciColorSchemes){
|
|
for(i = 0; i < aciNumColSchemes; i ++)
|
|
if(aciColorSchemes[i])
|
|
delete[] aciColorSchemes[i];
|
|
delete[] aciColorSchemes;
|
|
aciNumColSchemes = 0;
|
|
}
|
|
|
|
delete mapObj;
|
|
for(i = 0; i < MAX_NUM_MAP; i ++)
|
|
if(map_names[i]) delete[] map_names[i];
|
|
delete[] map_names;
|
|
|
|
m = (invMatrix*)freeMatrixList -> last;
|
|
while(m){
|
|
m1 = (invMatrix*)m -> prev;
|
|
delete m;
|
|
m = m1;
|
|
}
|
|
delete freeMatrixList;
|
|
|
|
f = (fncMenuItem*)freeMenuItemList -> last;
|
|
while(f){
|
|
f1 = (fncMenuItem*)f -> prev;
|
|
delete f;
|
|
f = f1;
|
|
}
|
|
delete freeMenuItemList;
|
|
|
|
it = (invItem*)freeItemList -> last;
|
|
while(it){
|
|
it1 = (invItem*)it -> prev;
|
|
delete it;
|
|
it = it1;
|
|
}
|
|
delete freeItemList;
|
|
|
|
pl = (InfoPanel*)i_infoPanels -> last;
|
|
while(pl){
|
|
pl1 = (InfoPanel*)pl -> prev;
|
|
delete pl;
|
|
pl = pl1;
|
|
}
|
|
delete i_infoPanels;
|
|
|
|
pl = (InfoPanel*)infoPanels -> last;
|
|
while(pl){
|
|
pl1 = (InfoPanel*)pl -> prev;
|
|
delete pl;
|
|
pl = pl1;
|
|
}
|
|
delete infoPanels;
|
|
|
|
delete ModeObj;
|
|
delete InvObj;
|
|
delete InfoObj;
|
|
|
|
lP = (aciLocationInfo*)locationList -> last;
|
|
while(lP){
|
|
lP1 = (aciLocationInfo*)lP -> prev;
|
|
delete lP;
|
|
lP = lP1;
|
|
}
|
|
delete locationList;
|
|
|
|
it = (invItem*)itemList -> last;
|
|
while(it){
|
|
it1 = (invItem*)it -> prev;
|
|
delete it;
|
|
it = it1;
|
|
}
|
|
delete itemList;
|
|
|
|
it = (invItem*)i_itemList -> last;
|
|
while(it){
|
|
it1 = (invItem*)it -> prev;
|
|
delete it;
|
|
it = it1;
|
|
}
|
|
delete i_itemList;
|
|
|
|
p = (fncMenu*)menuList -> last;
|
|
while(p){
|
|
p1 = (fncMenu*)p -> prev;
|
|
if(!(p -> flags & FM_ITEM_MENU))
|
|
delete p;
|
|
p = p1;
|
|
}
|
|
delete menuList;
|
|
|
|
bm = (aciBitmapMenu*)b_menuList -> last;
|
|
while(bm){
|
|
bm1 = (aciBitmapMenu*)bm -> prev;
|
|
delete bm;
|
|
bm = bm1;
|
|
}
|
|
delete b_menuList;
|
|
|
|
p = (fncMenu*)i_menuList -> last;
|
|
while(p){
|
|
p1 = (fncMenu*)p -> prev;
|
|
if(!(p -> flags & FM_ITEM_MENU))
|
|
delete p;
|
|
p = p1;
|
|
}
|
|
delete i_menuList;
|
|
|
|
m = (invMatrix*)matrixList -> last;
|
|
while(m){
|
|
m1 = (invMatrix*)m -> prev;
|
|
delete m;
|
|
m = m1;
|
|
}
|
|
delete matrixList;
|
|
|
|
m = (invMatrix*)i_matrixList -> last;
|
|
while(m){
|
|
m1 = (invMatrix*)m -> prev;
|
|
delete m;
|
|
m = m1;
|
|
}
|
|
delete i_matrixList;
|
|
|
|
bt = (aButton*)intButtons -> last;
|
|
while(bt){
|
|
bt1 = (aButton*)bt -> prev;
|
|
delete bt;
|
|
bt = bt1;
|
|
}
|
|
delete intButtons;
|
|
|
|
bt = (aButton*)invButtons -> last;
|
|
while(bt){
|
|
bt1 = (aButton*)bt -> prev;
|
|
delete bt;
|
|
bt = bt1;
|
|
}
|
|
delete invButtons;
|
|
|
|
bt = (aButton*)infButtons -> last;
|
|
while(bt){
|
|
bt1 = (aButton*)bt -> prev;
|
|
delete bt;
|
|
bt = bt1;
|
|
}
|
|
delete infButtons;
|
|
|
|
ind = (aIndData*)indList -> last;
|
|
while(ind){
|
|
ind1 = (aIndData*)ind -> prev;
|
|
delete ind;
|
|
ind = ind1;
|
|
}
|
|
delete indList;
|
|
|
|
cp = (CounterPanel*)intCounters -> last;
|
|
while(cp){
|
|
cp1 = (CounterPanel*)cp -> prev;
|
|
delete cp;
|
|
cp = cp1;
|
|
}
|
|
delete intCounters;
|
|
|
|
cp = (CounterPanel*)infCounters -> last;
|
|
while(cp){
|
|
cp1 = (CounterPanel*)cp -> prev;
|
|
delete cp;
|
|
cp = cp1;
|
|
}
|
|
delete infCounters;
|
|
|
|
cp = (CounterPanel*)invCounters -> last;
|
|
while(cp){
|
|
cp1 = (CounterPanel*)cp -> prev;
|
|
delete cp;
|
|
cp = cp1;
|
|
}
|
|
delete invCounters;
|
|
|
|
cp = (CounterPanel*)i_Counters -> last;
|
|
while(cp){
|
|
cp1 = (CounterPanel*)cp -> prev;
|
|
delete cp;
|
|
cp = cp1;
|
|
}
|
|
delete i_Counters;
|
|
|
|
bml = (bmlObject*)backList -> last;
|
|
while(bml){
|
|
bml1 = (bmlObject*)bml -> prev;
|
|
delete bml;
|
|
bml = bml1;
|
|
}
|
|
delete backList;
|
|
|
|
ibs = (ibsObject*)ibsList -> last;
|
|
while(ibs){
|
|
ibs1 = (ibsObject*)ibs -> prev;
|
|
delete ibs;
|
|
ibs = ibs1;
|
|
}
|
|
delete ibsList;
|
|
|
|
delete events;
|
|
flags = 0;
|
|
}
|
|
|
|
invItem::invItem(void)
|
|
{
|
|
ID = 0;
|
|
|
|
slotType = -1;
|
|
|
|
EvCode = 0;
|
|
|
|
flags = 0;
|
|
|
|
NumIndex = 0;
|
|
|
|
classID = AS_ITEM_CLASS;
|
|
|
|
ScreenSizeX = ScreenSizeY = 0;
|
|
|
|
ShapeSizeX = ShapeSizeY = 0;
|
|
ShapeCenterX = ShapeCenterY = 0;
|
|
|
|
MatrixX = MatrixY = 0;
|
|
|
|
pData = NULL;
|
|
promptData = NULL;
|
|
pTemplate = NULL;
|
|
|
|
dropCount = 0;
|
|
|
|
numComments = 0;
|
|
comments = NULL;
|
|
|
|
partData = NULL;
|
|
|
|
ShapeLen = 0;
|
|
ShapeX = NULL;
|
|
ShapeY = NULL;
|
|
|
|
fname = NULL;
|
|
menu = NULL;
|
|
|
|
uvsDataPtr = NULL;
|
|
item_ptr = NULL;
|
|
|
|
numAviIDs = 0;
|
|
avi_ids = NULL;
|
|
}
|
|
|
|
invItem::~invItem(void)
|
|
{
|
|
int i;
|
|
ScreenSizeX = ScreenSizeY = 0;
|
|
|
|
if(flags & INV_CLONE){
|
|
ID_ptr.clear();
|
|
}
|
|
else {
|
|
if(partData) delete partData;
|
|
|
|
if(fname) {
|
|
delete[] fname;
|
|
}
|
|
|
|
if(flags & AS_ITEM_DATA_LOADED)
|
|
delete[] frame;
|
|
|
|
if(pData)
|
|
delete[] pData;
|
|
|
|
if(pTemplate)
|
|
delete[] pTemplate;
|
|
|
|
if(promptData)
|
|
delete[] promptData;
|
|
|
|
if(numAviIDs){
|
|
for(i = 0; i < numAviIDs; i ++){
|
|
if(avi_ids[i]) delete[] avi_ids[i];
|
|
}
|
|
delete[] avi_ids;
|
|
}
|
|
|
|
if(ShapeX) delete[] ShapeX;
|
|
if(ShapeY) delete[] ShapeY;
|
|
|
|
if(numComments){
|
|
for(i = 0; i < numComments; i ++)
|
|
delete[] comments[i];
|
|
delete[] comments;
|
|
}
|
|
}
|
|
}
|
|
|
|
void invItem::init(void)
|
|
{
|
|
fncMenu* m;
|
|
load_frame();
|
|
if(menu){
|
|
m = (fncMenu*)menu;
|
|
m -> init();
|
|
m -> curItem = m -> get_fnc_item(m -> curFunction);
|
|
if(m -> VItems < m -> items -> Size)
|
|
m -> firstItem = m -> curItem;
|
|
else
|
|
m -> firstItem = (fncMenuItem*)m -> items -> first;
|
|
}
|
|
|
|
calc_shape_center();
|
|
}
|
|
|
|
void invItem::finit(void)
|
|
{
|
|
free_frame();
|
|
}
|
|
|
|
//TODO need fast malloc
|
|
void CounterPanel::redraw(void)
|
|
{
|
|
int i,x,y,digits,ox,dx = aCellSize + 1,v = *value_ptr,col,bcol = aciCurColorScheme[ACI_BACK_COL],col_sz = 0;
|
|
char* ptr;
|
|
unsigned char* buf = NULL, *p = NULL;
|
|
iScreenObject* obj;
|
|
|
|
if(ID == CREDITS_COUNTER) v = aciGetCurCredits();
|
|
|
|
#ifdef _ACI_BML_FONTS_
|
|
if(flags & CP_RANGE_FONT){
|
|
col = aciCurColorScheme[FM_SELECT_START];
|
|
col_sz = aciCurColorScheme[FM_SELECT_SIZE];
|
|
}
|
|
else {
|
|
col = (aciCurColorScheme[COUNTER_BORDER_COL] << 8) | aciCurColorScheme[COUNTER_COL];
|
|
}
|
|
#else
|
|
col = aciCurColorScheme[COUNTER_COL];
|
|
#endif
|
|
|
|
unsigned char* frm = aCellFrame;
|
|
|
|
last_value = v;
|
|
|
|
if(flags & CP_RANGE_FONT){
|
|
y = (dx - aScrFonts32[font] -> SizeY) >> 1;
|
|
ox = (dx - aScrFonts32[font] -> SizeX) >> 1;
|
|
}
|
|
else {
|
|
y = (dx - aScrFonts[font] -> SizeY) >> 1;
|
|
ox = (dx - aScrFonts[font] -> SizeX) >> 1;
|
|
}
|
|
|
|
if(!iScreenOwner){
|
|
buf = new unsigned char[SizeX * SizeY];
|
|
} else {
|
|
if(!(iScreenOwner -> flags & EL_DATA_LOADED))
|
|
return;
|
|
obj = (iScreenObject*)iScreenOwner -> owner;
|
|
obj -> flags |= OBJ_MUST_REDRAW;
|
|
buf = (unsigned char*)iScreenOwner -> fdata;
|
|
}
|
|
p = new unsigned char[dx * dx];
|
|
|
|
memset(buf,0,SizeX * SizeY);
|
|
memcpy(p,frm,dx * dx);
|
|
|
|
xconv -> init();
|
|
*xconv <= v;
|
|
|
|
ptr = xconv -> address();
|
|
digits = strlen(ptr);
|
|
|
|
x = 0;
|
|
swap_buf_col(1,bcol,dx,dx,p);
|
|
swap_buf_col(2,bcol,dx,dx,p);
|
|
for(i = 0; i < MaxLen; i ++){
|
|
mem_putspr(x,0,dx,dx,SizeX,SizeY,p,buf);
|
|
x += dx - 1;
|
|
}
|
|
|
|
x = (MaxLen - digits) * dx;
|
|
for(i = 0; i < digits; i ++){
|
|
if(flags & CP_RANGE_FONT)
|
|
aPutChar32(x + ox,y,font,col,col_sz,ptr[i],SizeX,buf);
|
|
else
|
|
aPutChar(x + ox,y,font,col,ptr[i],SizeX,SizeY,buf);
|
|
x += dx - 1;
|
|
}
|
|
if(!iScreenOwner){
|
|
XGR_PutSpr(PosX,PosY,SizeX,SizeY,buf,XGR_HIDDEN_FON);
|
|
if(ibs) ibs -> show();
|
|
}
|
|
|
|
flags &= ~CP_REDRAW;
|
|
if(!iScreenOwner) {
|
|
delete[] buf;
|
|
}
|
|
delete[] p;
|
|
}
|
|
|
|
void invItem::redraw(int x,int y,int drop_mode,int flush_mode)
|
|
{
|
|
int dx,dy,col = 0,mx,my;
|
|
unsigned char* buf;
|
|
|
|
mx = MatrixX * aCellSize + (aCellSize >> 1);
|
|
if(MatrixY & 0x01) mx += (aCellSize >> 1);
|
|
|
|
my = MatrixY * (aCellSize - (aCellSize >> 2)) + (aCellSize >> 1);
|
|
|
|
dx = mx - ShapeCenterX + (ShapeSizeX >> 1) - (ScreenSizeX >> 1);
|
|
dy = my - ShapeCenterY + (ShapeSizeY >> 1) - (ScreenSizeY >> 1);
|
|
|
|
if(aciBufRedrawFlag){
|
|
put_buf2col(800 + x + dx,y + dy,ScreenSizeX,ScreenSizeY,(unsigned char*)frame,300,0);
|
|
// put_map(800 + x + dx,y + dy,ScreenSizeX,ScreenSizeY);
|
|
}
|
|
else {
|
|
XGR_PutSpr(x + dx,y + dy,ScreenSizeX,ScreenSizeY,frame,XGR_HIDDEN_FON);
|
|
|
|
if(flush_mode)
|
|
XGR_Flush(x + dx,y + dy,ScreenSizeX,ScreenSizeY);
|
|
}
|
|
|
|
if(drop_mode){
|
|
switch(slotType){
|
|
case -1:
|
|
col = aciCurColorScheme[INV_NUM_ITM_COL];
|
|
break;
|
|
case AS_WEAPON_SLOT:
|
|
col = aciCurColorScheme[INV_NUM_WPN_COL];
|
|
break;
|
|
case AS_TWEAPON_SLOT:
|
|
col = aciCurColorScheme[INV_NUM_TWPN_COL];
|
|
break;
|
|
case AS_DEVICE_SLOT:
|
|
col = aciCurColorScheme[INV_NUM_DVC_COL];
|
|
break;
|
|
}
|
|
dx = mx + ShapeX[NumIndex] * aCellSize - (aCellSize >> 1);
|
|
dy = my + ShapeY[NumIndex] * (aCellSize - (aCellSize >> 2)) - (aCellSize >> 1);
|
|
|
|
if(ShapeY[NumIndex] & 0x01) dx += (aCellSize >> 1);
|
|
|
|
buf = new unsigned char[aCellSize * aCellSize];
|
|
memset(buf,0,aCellSize * aCellSize);
|
|
aPutNum(aCellSize/2 - aScrFonts[INV_FONT] -> SizeX/2,aCellSize/2 - aScrFonts[INV_FONT] -> SizeY/2,INV_FONT,col,dropCount,aCellSize,buf,1);
|
|
|
|
if(aciBufRedrawFlag){
|
|
put_buf2col(800 + x + dx,y + dy,aCellSize,aCellSize,buf,300,0);
|
|
// put_map(800 + x + dx,y + dy,aCellSize,aCellSize);
|
|
}
|
|
else {
|
|
XGR_PutSpr(x + dx,y + dy,aCellSize,aCellSize,buf,XGR_HIDDEN_FON);
|
|
|
|
if(flush_mode)
|
|
XGR_Flush(x + dx,y + dy,aCellSize,aCellSize);
|
|
}
|
|
|
|
delete[] buf;
|
|
}
|
|
if(aciBufRedrawFlag && flush_mode){
|
|
dx = mx - ShapeCenterX + (ShapeSizeX >> 1) - (ScreenSizeX >> 1);
|
|
dy = my - ShapeCenterY + (ShapeSizeY >> 1) - (ScreenSizeY >> 1);
|
|
put_map(800 + x + dx,y + dy,ScreenSizeX,ScreenSizeY);
|
|
}
|
|
#ifdef _ACI_BOUND_TEST_
|
|
col = aciCurColorScheme[INV_NUM_ITM_COL];
|
|
|
|
dx = mx - ShapeCenterX;
|
|
dy = my - ShapeCenterY;
|
|
XGR_Rectangle(x + dx,y + dy,ShapeSizeX,ShapeSizeY,col,col,XGR_OUTLINED);
|
|
XGR_Rectangle(x + dx + ShapeCenterX - 1,y + dy + ShapeCenterY - 1,3,3,col,col,XGR_FILLED);
|
|
#endif
|
|
}
|
|
|
|
void invItem::get_coords(int px,int py,int& x,int& y,int& sx,int& sy)
|
|
{
|
|
int dx,dy,mx,my;
|
|
|
|
mx = MatrixX * aCellSize + (aCellSize >> 1);
|
|
if(MatrixY & 0x01) mx += (aCellSize >> 1);
|
|
|
|
my = MatrixY * (aCellSize - (aCellSize >> 2)) + (aCellSize >> 1);
|
|
|
|
dx = mx - ShapeCenterX + (ShapeSizeX >> 1) - (ScreenSizeX >> 1);
|
|
dy = my - ShapeCenterY + (ShapeSizeY >> 1) - (ScreenSizeY >> 1);
|
|
|
|
x = px + dx;
|
|
y = py + dy;
|
|
|
|
sx = ScreenSizeX;
|
|
sy = ScreenSizeY;
|
|
}
|
|
|
|
void invItem::init_fname(char* p)
|
|
{
|
|
int sz = strlen(p) + 1;
|
|
fname = new char[sz + 1];
|
|
strcpy(fname, p);
|
|
}
|
|
|
|
void invItem::clone(invItem* p)
|
|
{
|
|
p -> menu = menu;
|
|
p -> pData = pData;
|
|
p -> promptData = promptData;
|
|
p -> pTemplate = pTemplate;
|
|
|
|
p -> ID_ptr = ID_ptr;
|
|
p -> classID = classID;
|
|
|
|
p -> ID = ID;
|
|
|
|
p -> slotType = slotType;
|
|
|
|
p -> EvCode = EvCode;
|
|
|
|
p -> flags = flags;
|
|
|
|
p -> ScreenSizeX = ScreenSizeX;
|
|
p -> ScreenSizeY = ScreenSizeY;
|
|
|
|
p -> fname = fname;
|
|
p -> frame = frame;
|
|
|
|
p -> ShapeLen = ShapeLen;
|
|
p -> ShapeX = ShapeX;
|
|
p -> ShapeY = ShapeY;
|
|
|
|
p -> ShapeSizeX = ShapeSizeX;
|
|
p -> ShapeSizeY = ShapeSizeY;
|
|
|
|
p -> ShapeCenterX = ShapeCenterX;
|
|
p -> ShapeCenterY = ShapeCenterY;
|
|
|
|
p -> NumIndex = NumIndex;
|
|
|
|
p -> numComments = numComments;
|
|
p -> comments = comments;
|
|
|
|
p -> numAviIDs = numAviIDs;
|
|
p -> avi_ids = avi_ids;
|
|
|
|
p -> partData = partData;
|
|
|
|
p -> flags |= INV_CLONE;
|
|
}
|
|
|
|
void invItem::init_name(char* p)
|
|
{
|
|
init_id(p);
|
|
}
|
|
|
|
void invItem::load_frame(void)
|
|
{
|
|
XStream fh;
|
|
|
|
short sx,sy;
|
|
if(!(flags & AS_ITEM_DATA_LOADED) && fname){
|
|
flags |= AS_ITEM_DATA_LOADED;
|
|
fh.open(fname,XS_IN);
|
|
|
|
fh > sx > sy;
|
|
ScreenSizeX = sx;
|
|
ScreenSizeY = sy;
|
|
frame = new char[ScreenSizeX * ScreenSizeY];
|
|
fh.read(frame,ScreenSizeX * ScreenSizeY);
|
|
}
|
|
}
|
|
|
|
void invItem::free_frame(void)
|
|
{
|
|
if(flags & AS_ITEM_DATA_LOADED){
|
|
flags &= ~AS_ITEM_DATA_LOADED;
|
|
delete[] frame;
|
|
}
|
|
}
|
|
|
|
invMatrixCell::invMatrixCell(void)
|
|
{
|
|
type = AS_NO_CELL;
|
|
flags = 0;
|
|
|
|
slotType = slotNumber = -1;
|
|
|
|
item = NULL;
|
|
}
|
|
|
|
void invMatrixCell::init_mem(void)
|
|
{
|
|
type = AS_NO_CELL;
|
|
flags = 0;
|
|
|
|
slotType = slotNumber = -1;
|
|
|
|
item = NULL;
|
|
}
|
|
|
|
invMatrix::invMatrix(void)
|
|
{
|
|
anchor = 0;
|
|
type = 0;
|
|
flags = 0;
|
|
|
|
internalID = 0;
|
|
|
|
maxLoad = 1;
|
|
|
|
SizeX = SizeY = 0;
|
|
ScreenX = ScreenY = 0;
|
|
ScreenSizeX = ScreenSizeY = 0;
|
|
|
|
pData = NULL;
|
|
back = NULL;
|
|
|
|
items = new iList;
|
|
|
|
matrix = NULL;
|
|
mech_name = NULL;
|
|
|
|
numAviIDs = 0;
|
|
avi_ids = NULL;
|
|
|
|
uvsDataPtr = NULL;
|
|
}
|
|
|
|
invMatrix::invMatrix(int sx,int sy)
|
|
{
|
|
type = 0;
|
|
flags = 0;
|
|
|
|
SizeX = sx;
|
|
SizeY = sy;
|
|
|
|
ScreenX = ScreenY = 0;
|
|
ScreenSizeX = ScreenSizeY = 0;
|
|
|
|
back = NULL;
|
|
mech_name = NULL;
|
|
pData = NULL;
|
|
|
|
items = new iList;
|
|
alloc_matrix();
|
|
|
|
numAviIDs = 0;
|
|
avi_ids = NULL;
|
|
|
|
uvsDataPtr = NULL;
|
|
}
|
|
|
|
invMatrix::~invMatrix(void)
|
|
{
|
|
int i;
|
|
invItem* p,*p1;
|
|
|
|
p = (invItem*)items -> last;
|
|
while(p){
|
|
p1 = (invItem*)p -> prev;
|
|
delete p;
|
|
p = p1;
|
|
}
|
|
delete items;
|
|
|
|
if(!(flags & IM_CLONE)){
|
|
if(back)
|
|
delete back;
|
|
if(mech_name)
|
|
delete[] mech_name;
|
|
if(pData)
|
|
delete[] pData;
|
|
|
|
if(numAviIDs){
|
|
for(i = 0; i < numAviIDs; i ++)
|
|
if(avi_ids[i]) delete[] avi_ids[i];
|
|
delete[] avi_ids;
|
|
}
|
|
}
|
|
free_matrix();
|
|
|
|
type = 0;
|
|
flags = 0;
|
|
|
|
SizeX = SizeY = 0;
|
|
ScreenX = ScreenY = 0;
|
|
ScreenSizeX = ScreenSizeY = 0;
|
|
}
|
|
|
|
void invMatrix::alloc_prm(void)
|
|
{
|
|
pData = new char[IM_NUM_PARAMS * ACI_MAX_PRM_LEN];
|
|
memset(pData,0,IM_NUM_PARAMS * ACI_MAX_PRM_LEN);
|
|
}
|
|
|
|
void invItem::alloc_prm(void)
|
|
{
|
|
pData = new char[INV_ITEM_NUM_PARAMS * ACI_MAX_PRM_LEN];
|
|
memset(pData,0,INV_ITEM_NUM_PARAMS * ACI_MAX_PRM_LEN);
|
|
}
|
|
|
|
void invMatrix::alloc_matrix(void)
|
|
{
|
|
int i,sz = SizeX * SizeY;
|
|
matrix = new invMatrixCell*[sz];
|
|
matrix_heap = new char[sz * sizeof(invMatrixCell)];
|
|
for(i = 0; i < sz; i ++){
|
|
matrix[i] = (invMatrixCell*)(matrix_heap + i * sizeof(invMatrixCell));
|
|
matrix[i] -> init_mem();
|
|
}
|
|
}
|
|
|
|
int invMatrix::slot_exist(int id)
|
|
{
|
|
int i,sz = SizeX * SizeY;
|
|
for(i = 0; i < sz; i ++){
|
|
if(matrix[i] -> slotType == id) return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
void invMatrix::free_matrix(void)
|
|
{
|
|
delete[] matrix;
|
|
delete[] matrix_heap;
|
|
}
|
|
|
|
int invMatrix::get_item_slot(invItem* p)
|
|
{
|
|
return matrix[p -> MatrixX + p -> MatrixY * SizeX] -> slotNumber;
|
|
}
|
|
|
|
int invMatrix::check_fit(int x,int y,invItem* p)
|
|
{
|
|
int i,offs = 0;
|
|
|
|
int ix = x,iy = y,dl = p -> ShapeLen,tp = p -> slotType;
|
|
int* dx = p -> ShapeX;
|
|
int* dy = p -> ShapeY;
|
|
|
|
for(i = 0; i < dl; i ++){
|
|
ix = x + dx[i];
|
|
iy = y + dy[i];
|
|
|
|
if((y & 0x01) && (dy[i] & 0x01))
|
|
ix ++;
|
|
|
|
if(ix < 0 || iy < 0 || ix >= SizeX || iy >= SizeY)
|
|
return 0;
|
|
|
|
offs = ix + iy * SizeX;
|
|
|
|
if(matrix[offs] -> type == AS_NO_CELL || (tp != matrix[offs] -> slotType && matrix[offs] -> slotType != -1) || (matrix[offs] -> flags & AS_BUSY_CELL))
|
|
return 0;
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
int invMatrix::auto_put_item(invItem* p)
|
|
{
|
|
int x,y,offs = 0;
|
|
for(y = 0; y < SizeY; y ++){
|
|
for(x = 0; x < SizeX; x ++){
|
|
if(!(p -> flags & INV_ITEM_NO_ACTIVATE) || p -> slotType != matrix[offs] -> slotType){
|
|
if(put_item(x,y,p))
|
|
return 1;
|
|
}
|
|
offs ++;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int invMatrix::put_item(int x,int y,invItem* p,int mode)
|
|
{
|
|
int i,offs = 0,ix,iy;
|
|
if(!check_fit(x,y,p))
|
|
return 0;
|
|
|
|
p -> MatrixX = x;
|
|
p -> MatrixY = y;
|
|
|
|
ix = x;
|
|
iy = y;
|
|
|
|
for(i = 0; i < p -> ShapeLen; i ++){
|
|
ix = x + p -> ShapeX[i];
|
|
iy = y + p -> ShapeY[i];
|
|
|
|
if((y & 0x01) && (p -> ShapeY[i] & 0x01))
|
|
ix ++;
|
|
|
|
offs = ix + iy * SizeX;
|
|
matrix[offs] -> put_item(p);
|
|
}
|
|
|
|
items -> connect((iListElement*)p);
|
|
if(!mode)
|
|
p -> dropCount = items -> Size;
|
|
if(p -> slotType != -1)
|
|
fill(p);
|
|
return 1;
|
|
}
|
|
|
|
int invMatrix::put_item_shadow(int x,int y,invItem* p)
|
|
{
|
|
int i,offs = 0,ix,iy;
|
|
|
|
ix = x;
|
|
iy = y;
|
|
|
|
for(i = 0; i < p -> ShapeLen; i ++){
|
|
ix = x + p -> ShapeX[i];
|
|
iy = y + p -> ShapeY[i];
|
|
|
|
if((y & 0x01) && (p -> ShapeY[i] & 0x01))
|
|
ix ++;
|
|
|
|
offs = ix + iy * SizeX;
|
|
matrix[offs] -> flags |= AS_IN_SHADOW;
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
void invMatrix::fill(invItem* p)
|
|
{
|
|
int x,y,flag = 1,index;
|
|
invMatrixCell* ic,*ic1;
|
|
|
|
while(flag){
|
|
index = 0;
|
|
flag = 0;
|
|
for(y = 0; y < SizeY; y ++){
|
|
for(x = 0; x < SizeX; x ++){
|
|
ic = matrix[index];
|
|
if(ic -> flags & AS_BUSY_CELL && ic -> item == p && ic -> slotType != -1){
|
|
if(x){
|
|
ic1 = matrix[index - 1];
|
|
if(ic1 -> slotNumber == ic -> slotNumber && !(ic1 -> flags & AS_BUSY_CELL)){
|
|
flag = 1;
|
|
ic1 -> put_item(p);
|
|
}
|
|
}
|
|
if(x < SizeX - 1){
|
|
ic1 = matrix[index + 1];
|
|
if(ic1 -> slotNumber == ic -> slotNumber && !(ic1 -> flags & AS_BUSY_CELL)){
|
|
flag = 1;
|
|
ic1 -> put_item(p);
|
|
}
|
|
}
|
|
if(y){
|
|
ic1 = matrix[index - SizeX];
|
|
if(ic1 -> slotNumber == ic -> slotNumber && !(ic1 -> flags & AS_BUSY_CELL)){
|
|
flag = 1;
|
|
ic1 -> put_item(p);
|
|
}
|
|
}
|
|
if(y < SizeY - SizeX){
|
|
ic1 = matrix[index + SizeX];
|
|
if(ic1 -> slotNumber == ic -> slotNumber && !(ic1 -> flags & AS_BUSY_CELL)){
|
|
flag = 1;
|
|
ic1 -> put_item(p);
|
|
}
|
|
}
|
|
}
|
|
index ++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void invMatrix::remove_item(invItem* p,int mode)
|
|
{
|
|
int i, j, index = 0;
|
|
invItem* itm;
|
|
|
|
for(i = 0; i < SizeY; i ++){
|
|
for(j = 0; j < SizeX; j ++){
|
|
if(matrix[index] -> flags & AS_BUSY_CELL && matrix[index] -> item == p)
|
|
matrix[index] -> remove_item();
|
|
index ++;
|
|
}
|
|
}
|
|
items -> dconnect((iListElement*)p);
|
|
|
|
if(!mode){
|
|
itm = (invItem*)items -> last;
|
|
while(itm){
|
|
if(itm -> dropCount > p -> dropCount)
|
|
itm -> dropCount --;
|
|
itm = (invItem*)itm -> prev;
|
|
}
|
|
}
|
|
}
|
|
|
|
invItem* invMatrix::get_item(int x,int y)
|
|
{
|
|
int index = x + y * SizeX;
|
|
if(matrix[index] -> flags & AS_BUSY_CELL)
|
|
return matrix[index] -> item;
|
|
else
|
|
return NULL;
|
|
}
|
|
|
|
invItem* invMatrix::get_area_item(int x,int y,invItem* it)
|
|
{
|
|
int i,index,ix,iy;
|
|
invItem* p = NULL;
|
|
|
|
for(i = 0; i < it -> ShapeLen; i ++){
|
|
ix = x + it -> ShapeX[i];
|
|
iy = y + it -> ShapeY[i];
|
|
|
|
if((y & 0x01) && (it -> ShapeY[i] & 0x01))
|
|
ix ++;
|
|
|
|
if(ix < 0 || ix >= SizeX || iy < 0 || iy >= SizeY)
|
|
return NULL;
|
|
|
|
index = ix + iy * SizeX;
|
|
if(matrix[index] -> flags & AS_BUSY_CELL){
|
|
if(!p){
|
|
p = matrix[index] -> item;
|
|
}
|
|
else {
|
|
if(matrix[index] -> item != p){
|
|
return NULL;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return p;
|
|
}
|
|
|
|
void invMatrixCell::put_item(invItem* p)
|
|
{
|
|
item = p;
|
|
flags |= AS_BUSY_CELL;
|
|
}
|
|
|
|
void invMatrixCell::remove_item(void)
|
|
{
|
|
item = NULL;
|
|
flags &= ~AS_BUSY_CELL;
|
|
}
|
|
|
|
aButton::aButton(void)
|
|
{
|
|
anchor = 0;
|
|
fname = NULL;
|
|
frameSeq = NULL;
|
|
|
|
ID = 0;
|
|
ControlID = 0;
|
|
|
|
type = flags = 0;
|
|
PosX = PosY = 0;
|
|
SizeX = SizeY = 0;
|
|
|
|
promptData = NULL;
|
|
|
|
curCount = activeCount = 0;
|
|
|
|
eventCode = 0;
|
|
eventData = 0;
|
|
|
|
numFrames = 0;
|
|
cur_frame = 0;
|
|
|
|
scankey = new aKeyObj;
|
|
}
|
|
|
|
aButton::~aButton(void)
|
|
{
|
|
delete scankey;
|
|
|
|
if(fname) {
|
|
delete[] fname;
|
|
}
|
|
|
|
if(frameSeq) {
|
|
delete[] frameSeq;
|
|
}
|
|
|
|
if(promptData) {
|
|
delete[] promptData;
|
|
}
|
|
|
|
type = flags = 0;
|
|
PosX = PosY = 0;
|
|
SizeX = SizeY = 0;
|
|
|
|
numFrames = 0;
|
|
cur_frame = 0;
|
|
}
|
|
|
|
void aButton::press(void)
|
|
{
|
|
set_redraw();
|
|
if(!(flags & B_ACTIVE)){
|
|
curCount = 0;
|
|
flags |= B_ACTIVE;
|
|
}
|
|
if(flags & B_PRESSED){
|
|
cur_frame --;
|
|
if(cur_frame <= 0){
|
|
cur_frame = 0;
|
|
flags ^= B_ACTIVE;
|
|
flags ^= B_PRESSED;
|
|
}
|
|
}
|
|
else {
|
|
cur_frame ++;
|
|
if(cur_frame >= numFrames){
|
|
cur_frame = numFrames - 1;
|
|
if(!(flags & B_UNPRESS))
|
|
flags ^= B_ACTIVE;
|
|
flags ^= B_PRESSED;
|
|
}
|
|
}
|
|
}
|
|
|
|
void aButton::set_fname(char* p)
|
|
{
|
|
int sz = strlen(p) + 1;
|
|
if(fname)
|
|
delete fname;
|
|
fname = new char[sz + 1];
|
|
strcpy(fname,p);
|
|
}
|
|
|
|
void aButton::init(void)
|
|
{
|
|
int i,key;
|
|
load_frames();
|
|
if(ControlID){
|
|
scankey -> free_list();
|
|
for(i = 0; i < iKEY_OBJECT_SIZE; i ++){
|
|
key = iGetControlCode(ControlID,i);
|
|
if(key) scankey -> add_key(key);
|
|
}
|
|
}
|
|
}
|
|
|
|
void aButton::load_frames(void)
|
|
{
|
|
int sz;
|
|
short sx,sy,s;
|
|
XStream fh;
|
|
|
|
if(!(flags & B_FRAMES_LOADED)){
|
|
fh.open(fname,XS_IN);
|
|
fh > sx > sy > s;
|
|
sz = sx * sy * s;
|
|
|
|
SizeX = sx;
|
|
SizeY = sy;
|
|
|
|
numFrames = s;
|
|
|
|
frameSeq = new char[sz];
|
|
fh.read(frameSeq,sz);
|
|
fh.close();
|
|
|
|
flags |= B_FRAMES_LOADED;
|
|
|
|
layout(this, XGR_MAXX, XGR_MAXY);
|
|
}
|
|
}
|
|
|
|
void aButton::free_frames(void)
|
|
{
|
|
if(flags & B_FRAMES_LOADED){
|
|
delete[] frameSeq;
|
|
flags ^= B_FRAMES_LOADED;
|
|
}
|
|
}
|
|
|
|
void aButton::finit(void)
|
|
{
|
|
free_frames();
|
|
}
|
|
|
|
void actIntDispatcher::add_locdata(aciLocationInfo* p)
|
|
{
|
|
locationList -> connect(p);
|
|
}
|
|
|
|
void actIntDispatcher::add_menu(fncMenu* p)
|
|
{
|
|
menuList -> connect((iListElement*)p);
|
|
}
|
|
|
|
void actIntDispatcher::add_imenu(fncMenu* p)
|
|
{
|
|
i_menuList -> connect((iListElement*)p);
|
|
}
|
|
|
|
void actIntDispatcher::add_ind(aIndData* p)
|
|
{
|
|
indList -> connect((iListElement*)p);
|
|
}
|
|
|
|
void actIntDispatcher::add_item(invItem* p)
|
|
{
|
|
itemList -> connect((iListElement*)p);
|
|
}
|
|
|
|
void actIntDispatcher::add_iitem(invItem* p)
|
|
{
|
|
i_itemList -> connect((iListElement*)p);
|
|
}
|
|
|
|
void actIntDispatcher::add_matrix(invMatrix* m)
|
|
{
|
|
matrixList -> connect((iListElement*)m);
|
|
}
|
|
|
|
void actIntDispatcher::add_imatrix(invMatrix* m)
|
|
{
|
|
i_matrixList -> connect((iListElement*)m);
|
|
}
|
|
|
|
fncMenuItem::fncMenuItem(void)
|
|
{
|
|
flags = 0;
|
|
fnc_code = -1;
|
|
scankey = new aKeyObj;
|
|
|
|
PosX = PosY = 0;
|
|
SizeX = SizeY = 0;
|
|
font = 0;
|
|
|
|
space = I_STR_SPACE;
|
|
submenuID = -1;
|
|
|
|
name = NULL;
|
|
name_len = 0;
|
|
|
|
eventPtr = NULL;
|
|
}
|
|
|
|
fncMenuItem::~fncMenuItem(void)
|
|
{
|
|
if(!(flags & FM_CLONE)){
|
|
delete scankey;
|
|
|
|
if(eventPtr)
|
|
delete eventPtr;
|
|
|
|
if(name)
|
|
delete[] name;
|
|
}
|
|
}
|
|
|
|
void fncMenuItem::add_key(int key)
|
|
{
|
|
scankey -> add_key(key);
|
|
}
|
|
|
|
void aButton::add_key(int key)
|
|
{
|
|
scankey -> add_key(key);
|
|
}
|
|
|
|
void fncMenuItem::init_name(const char* p)
|
|
{
|
|
int sz = strlen(p) + 1;
|
|
|
|
if(!name_len || sz > name_len){
|
|
if(name_len) delete name;
|
|
name = new char[sz];
|
|
name_len = sz;
|
|
}
|
|
strcpy(name,p);
|
|
}
|
|
|
|
fncMenu::fncMenu(void)
|
|
{
|
|
anchor = 0;
|
|
ibs = NULL;
|
|
bml = NULL;
|
|
bml_name = NULL;
|
|
ibs_name = NULL;
|
|
|
|
upMenu = subMenu = NULL;
|
|
upMenuItem = NULL;
|
|
|
|
fncCode = -1;
|
|
|
|
prefix = NULL;
|
|
PrefixX = PrefixY = 0;
|
|
PrefixDelta = 0;
|
|
|
|
postfix = NULL;
|
|
|
|
iScreenOwner = NULL;
|
|
|
|
flags = 0;
|
|
vSpace = I_STR_SPACE;
|
|
|
|
bCol = -1;
|
|
|
|
VItems = FM_NUM_V_ITEMS;
|
|
itemY = 0;
|
|
|
|
activeCount = 0;
|
|
curCount = 0;
|
|
|
|
type = 0;
|
|
curFunction = 0;
|
|
|
|
scankey = new aKeyObj;
|
|
up_key = new aKeyObj;
|
|
down_key = new aKeyObj;
|
|
|
|
up_obj = new fncMenuItem;
|
|
down_obj = new fncMenuItem;
|
|
|
|
up_obj -> init_name("\x1E");
|
|
down_obj -> init_name("\x1F");
|
|
|
|
trigger = NULL;
|
|
trigger_code = -1;
|
|
|
|
items = new iList;
|
|
inactive_items = new iList;
|
|
|
|
PosX = PosY = 0;
|
|
SizeX = SizeY = 0;
|
|
|
|
firstItem = NULL;
|
|
curItem = NULL;
|
|
}
|
|
|
|
fncMenu::~fncMenu(void)
|
|
{
|
|
fncMenuItem* p,*p1;
|
|
|
|
if(!(flags & FM_SUBMENU)){
|
|
if(ibs) delete ibs;
|
|
if(bml) delete bml;
|
|
if(bml_name) delete[] bml_name;
|
|
if(ibs_name) delete[] ibs_name;
|
|
}
|
|
|
|
if(upMenuItem) delete upMenuItem;
|
|
|
|
delete scankey;
|
|
delete up_key;
|
|
delete down_key;
|
|
|
|
delete up_obj;
|
|
delete down_obj;
|
|
|
|
p = (fncMenuItem*)items -> last;
|
|
while(p){
|
|
p1 = (fncMenuItem*)p -> prev;
|
|
if(!(p -> flags & FM_NO_DELETE))
|
|
delete p;
|
|
p = p1;
|
|
}
|
|
delete items;
|
|
p = (fncMenuItem*)inactive_items -> last;
|
|
while(p){
|
|
p1 = (fncMenuItem*)p -> prev;
|
|
if(!(p -> flags & FM_NO_DELETE))
|
|
delete p;
|
|
p = p1;
|
|
}
|
|
delete inactive_items;
|
|
flags = 0;
|
|
}
|
|
|
|
InfoPanel::InfoPanel(void)
|
|
{
|
|
anchor = 0;
|
|
ibs = NULL;
|
|
bml = NULL;
|
|
bml_name = NULL;
|
|
ibs_name = NULL;
|
|
|
|
bCol = -1;
|
|
|
|
iScreenOwner = NULL;
|
|
|
|
interf_type = INF_PANEL;
|
|
|
|
MaxStr = 3;
|
|
|
|
SizeX = SizeY = 0;
|
|
OffsX = OffsY = 0;
|
|
|
|
flags = 0;
|
|
vSpace = I_STR_SPACE;
|
|
hSpace = I_STR_SPACE;
|
|
|
|
font = 0;
|
|
type = 0;
|
|
|
|
items = new iList;
|
|
item_pool = new iList;
|
|
}
|
|
|
|
CounterPanel::CounterPanel(void)
|
|
{
|
|
anchor = 0;
|
|
ibs = NULL;
|
|
ibs_name = NULL;
|
|
|
|
ID = CREDITS_COUNTER;
|
|
|
|
iScreenOwner = NULL;
|
|
|
|
color = 30;
|
|
|
|
SizeX = SizeY = 0;
|
|
|
|
MaxLen = 6;
|
|
|
|
last_value = -1;
|
|
|
|
PosX = PosY = 0;
|
|
SizeX = SizeY = 0;
|
|
|
|
flags = 0;
|
|
hSpace = I_STR_SPACE;
|
|
|
|
font = 0;
|
|
|
|
xconv = new XBuffer;
|
|
|
|
type = CP_INT;
|
|
}
|
|
|
|
InfoPanel::~InfoPanel(void)
|
|
{
|
|
if(ibs) delete ibs;
|
|
if(bml) delete bml;
|
|
if(bml_name) delete bml_name;
|
|
if(ibs_name) delete[] ibs_name;
|
|
|
|
InfoPanelItem* p,*p1;
|
|
|
|
p = (InfoPanelItem*)items -> last;
|
|
while(p){
|
|
p1 = (InfoPanelItem*)p -> prev;
|
|
delete p;
|
|
p = p1;
|
|
}
|
|
delete items;
|
|
|
|
p = (InfoPanelItem*)item_pool -> last;
|
|
while(p){
|
|
p1 = (InfoPanelItem*)p -> prev;
|
|
delete p;
|
|
p = p1;
|
|
}
|
|
delete item_pool;
|
|
|
|
flags = 0;
|
|
}
|
|
|
|
CounterPanel::~CounterPanel(void)
|
|
{
|
|
if(ibs) delete ibs;
|
|
if(ibs_name) delete[] ibs_name;
|
|
|
|
delete xconv;
|
|
|
|
flags = 0;
|
|
}
|
|
|
|
void InfoPanel::add_items(int num,char** ptr,int fnt,int col)
|
|
{
|
|
int i;
|
|
for(i = 0; i < num; i ++){
|
|
add_item(ptr[i],fnt,col);
|
|
}
|
|
}
|
|
|
|
void InfoPanel::add_item(const char* ptr,int fnt,int col)
|
|
{
|
|
InfoPanelItem* p;
|
|
if(item_pool -> Size){
|
|
p = (InfoPanelItem*)item_pool -> last;
|
|
item_pool -> dconnect((iListElement*)p);
|
|
}
|
|
else {
|
|
p = new InfoPanelItem;
|
|
}
|
|
p -> init_id(ptr);
|
|
p -> font = fnt;
|
|
p -> color = col;
|
|
items -> connect((iListElement*)p);
|
|
}
|
|
|
|
void fncMenu::add_key(int key)
|
|
{
|
|
scankey -> add_key(key);
|
|
}
|
|
|
|
void fncMenu::add_item(fncMenuItem* p)
|
|
{
|
|
items -> connect((iListElement*)p);
|
|
if(flags & FM_RANGE_FONT) p -> flags |= FM_RANGE_FONT;
|
|
}
|
|
|
|
void invMatrix::redraw_matrix(void)
|
|
{
|
|
int i,j,x0,y0,x = 0,y = 0,col = 0,col1 = 0,index = 0;
|
|
|
|
int dx = aCellSize;
|
|
int dx2 = aCellSize >> 1;
|
|
int dx4 = aCellSize >> 2;
|
|
|
|
int ssx = ScreenSizeX + aCellSize;
|
|
int ssy = ScreenSizeY + aCellSize;
|
|
int ssz = ssx * ssy;
|
|
|
|
unsigned char* p,*scr_buf;
|
|
p = new unsigned char[(dx + 1) * (dx + 1)];
|
|
|
|
if(aciBufRedrawFlag){
|
|
scr_buf = new unsigned char[ssz];
|
|
memset(scr_buf,0,ssz);
|
|
}
|
|
|
|
for(i = 0; i < SizeY; i ++){
|
|
if(i & 0x01){
|
|
x += dx2;
|
|
}
|
|
for(j = 0; j < SizeX; j ++){
|
|
if(matrix[index] -> type && !(matrix[index] -> flags & AS_BUSY_CELL)){
|
|
memcpy(p,aCellFrame,(dx + 1) * (dx + 1));
|
|
|
|
if(matrix[index] -> slotType == -1){
|
|
col = aciCurColorScheme[INV_FLOOR_COL_ITM];
|
|
col1 = aciCurColorScheme[INV_CELL_COL_ITM];
|
|
}
|
|
else {
|
|
col = aciCurColorScheme[matrix[index] -> slotType * 4 + INV_FLOOR_COL_ITM];
|
|
col1 = aciCurColorScheme[matrix[index] -> slotType * 4 + INV_CELL_COL_ITM];
|
|
}
|
|
|
|
swap_buf_col(1,col1,dx + 1,dx + 1,p);
|
|
swap_buf_col(2,col,dx + 1,dx + 1,p);
|
|
|
|
x0 = x + ScreenX;
|
|
y0 = y + ScreenY;
|
|
|
|
if(aciBufRedrawFlag)
|
|
mem_putspr_h(x,y,dx + 1,dx + 1,ssx,ssy,p,scr_buf);
|
|
else
|
|
XGR_PutSpr(x0,y0,dx + 1,dx + 1,p,XGR_HIDDEN_FON);
|
|
}
|
|
x += aCellSize;
|
|
index ++;
|
|
}
|
|
x = 0;
|
|
y += aCellSize - dx4;
|
|
}
|
|
|
|
x = 0;
|
|
y = 0;
|
|
index = 0;
|
|
|
|
for(i = 0; i < SizeY; i ++){
|
|
if(i & 0x01){
|
|
x += dx2;
|
|
}
|
|
for(j = 0; j < SizeX; j ++){
|
|
if(matrix[index] -> type && (matrix[index] -> flags & AS_BUSY_CELL)){
|
|
memcpy(p,aCellFrame,(dx + 1) * (dx + 1));
|
|
|
|
if(matrix[index] -> slotType == -1){
|
|
col = aciCurColorScheme[INV_BFLOOR_COL_ITM];
|
|
col1 = aciCurColorScheme[INV_BCELL_COL_ITM];
|
|
}
|
|
else {
|
|
col = aciCurColorScheme[matrix[index] -> slotType * 4 + INV_BFLOOR_COL_ITM];
|
|
col1 = aciCurColorScheme[matrix[index] -> slotType * 4 + INV_BCELL_COL_ITM];
|
|
}
|
|
|
|
swap_buf_col(1,col1,dx + 1,dx + 1,p);
|
|
swap_buf_col(2,col,dx + 1,dx + 1,p);
|
|
|
|
x0 = x + ScreenX;
|
|
y0 = y + ScreenY;
|
|
|
|
if(aciBufRedrawFlag)
|
|
mem_putspr_h(x,y,dx + 1,dx + 1,ssx,ssy,p,scr_buf);
|
|
else
|
|
XGR_PutSpr(x0,y0,dx + 1,dx + 1,p,XGR_HIDDEN_FON);
|
|
}
|
|
x += aCellSize;
|
|
index ++;
|
|
}
|
|
x = 0;
|
|
y += aCellSize - dx4;
|
|
}
|
|
|
|
delete[] p;
|
|
if(aciBufRedrawFlag){
|
|
put_buf2col(800 + ScreenX,ScreenY,ssx,ssy,scr_buf,300,0);
|
|
delete[] scr_buf;
|
|
}
|
|
}
|
|
|
|
#define SHADOW_COL 103
|
|
void invMatrix::redraw_shadow_cells(void)
|
|
{
|
|
int i,j,x0,y0,x = 0,y = 0,col = 0,col1 = 0,index = 0;
|
|
|
|
int dx = aCellSize;
|
|
int dx2 = aCellSize >> 1;
|
|
int dx4 = aCellSize >> 2;
|
|
|
|
unsigned char* p;
|
|
p = new unsigned char[(dx + 1) * (dx + 1)];
|
|
|
|
for(i = 0; i < SizeY; i ++){
|
|
if(i & 0x01){
|
|
x += dx2;
|
|
}
|
|
for(j = 0; j < SizeX; j ++){
|
|
if(matrix[index] -> type && !(matrix[index] -> flags & AS_IN_SHADOW) && (matrix[index] -> flags & AS_REDRAW_CELL) && !(matrix[index] -> flags & AS_BUSY_CELL)){
|
|
memcpy(p,aCellFrame,(dx + 1) * (dx + 1));
|
|
|
|
if(matrix[index] -> slotType == -1){
|
|
col = aciCurColorScheme[INV_FLOOR_COL_ITM];
|
|
col1 = aciCurColorScheme[INV_CELL_COL_ITM];
|
|
}
|
|
else {
|
|
col = aciCurColorScheme[matrix[index] -> slotType * 4 + INV_FLOOR_COL_ITM];
|
|
col1 = aciCurColorScheme[matrix[index] -> slotType * 4 + INV_CELL_COL_ITM];
|
|
}
|
|
|
|
swap_buf_col(1,col1,dx + 1,dx + 1,p);
|
|
swap_buf_col(2,col,dx + 1,dx + 1,p);
|
|
|
|
x0 = x + ScreenX;
|
|
y0 = y + ScreenY;
|
|
|
|
if(aciBufRedrawFlag)
|
|
put_buf2col(800 + x0,y0,dx + 1,dx + 1,p,300,0);
|
|
else
|
|
XGR_PutSpr(x0,y0,dx + 1,dx + 1,p,XGR_HIDDEN_FON);
|
|
}
|
|
x += aCellSize;
|
|
index ++;
|
|
}
|
|
x = 0;
|
|
y += aCellSize - dx4;
|
|
}
|
|
|
|
x = 0;
|
|
y = 0;
|
|
index = 0;
|
|
|
|
for(i = 0; i < SizeY; i ++){
|
|
if(i & 0x01){
|
|
x += dx2;
|
|
}
|
|
for(j = 0; j < SizeX; j ++){
|
|
if(matrix[index] -> type && !(matrix[index] -> flags & AS_IN_SHADOW) && (matrix[index] -> flags & AS_REDRAW_CELL) && (matrix[index] -> flags & AS_BUSY_CELL)){
|
|
memcpy(p,aCellFrame,(dx + 1) * (dx + 1));
|
|
|
|
if(matrix[index] -> slotType == -1){
|
|
col = aciCurColorScheme[INV_BFLOOR_COL_ITM];
|
|
col1 = aciCurColorScheme[INV_BCELL_COL_ITM];
|
|
}
|
|
else {
|
|
col = aciCurColorScheme[matrix[index] -> slotType * 4 + INV_BFLOOR_COL_ITM];
|
|
col1 = aciCurColorScheme[matrix[index] -> slotType * 4 + INV_BCELL_COL_ITM];
|
|
}
|
|
|
|
swap_buf_col(1,col1,dx + 1,dx + 1,p);
|
|
swap_buf_col(2,col,dx + 1,dx + 1,p);
|
|
|
|
x0 = x + ScreenX;
|
|
y0 = y + ScreenY;
|
|
|
|
matrix[index] -> item -> flags |= INV_ITEM_REDRAW;
|
|
|
|
if(aciBufRedrawFlag)
|
|
put_buf2col(800 + x0,y0,dx + 1,dx + 1,p,300,0);
|
|
else
|
|
XGR_PutSpr(x0,y0,dx + 1,dx + 1,p,XGR_HIDDEN_FON);
|
|
}
|
|
x += aCellSize;
|
|
index ++;
|
|
}
|
|
x = 0;
|
|
y += aCellSize - dx4;
|
|
}
|
|
|
|
x = 0;
|
|
y = 0;
|
|
index = 0;
|
|
|
|
for(i = 0; i < SizeY; i ++){
|
|
if(i & 0x01){
|
|
x += dx2;
|
|
}
|
|
for(j = 0; j < SizeX; j ++){
|
|
if(matrix[index] -> type && (matrix[index] -> flags & AS_IN_SHADOW) && !(matrix[index] -> flags & AS_BUSY_CELL)){
|
|
matrix[index] -> flags &= ~AS_REDRAW_CELL;
|
|
memcpy(p,aCellFrame,(dx + 1) * (dx + 1));
|
|
|
|
if(matrix[index] -> slotType == -1){
|
|
col = aciCurColorScheme[INV_FLOOR_COL_ITM];
|
|
}
|
|
else {
|
|
col = aciCurColorScheme[matrix[index] -> slotType * 4 + INV_FLOOR_COL_ITM];
|
|
}
|
|
col1 = aciCurColorScheme[INV_CELL_SELECT_COL];
|
|
|
|
swap_buf_col(1,col1,dx + 1,dx + 1,p);
|
|
swap_buf_col(2,col,dx + 1,dx + 1,p);
|
|
|
|
x0 = x + ScreenX;
|
|
y0 = y + ScreenY;
|
|
|
|
if(matrix[index] -> flags & AS_BUSY_CELL)
|
|
matrix[index] -> item -> flags |= INV_ITEM_REDRAW;
|
|
|
|
if(aciBufRedrawFlag)
|
|
put_buf2col(800 + x0,y0,dx + 1,dx + 1,p,300,0);
|
|
else
|
|
XGR_PutSpr(x0,y0,dx + 1,dx + 1,p,XGR_HIDDEN_FON);
|
|
}
|
|
x += aCellSize;
|
|
index ++;
|
|
}
|
|
x = 0;
|
|
y += aCellSize - dx4;
|
|
}
|
|
|
|
x = 0;
|
|
y = 0;
|
|
index = 0;
|
|
|
|
for(i = 0; i < SizeY; i ++){
|
|
if(i & 0x01){
|
|
x += dx2;
|
|
}
|
|
for(j = 0; j < SizeX; j ++){
|
|
if(matrix[index] -> type && (matrix[index] -> flags & AS_IN_SHADOW) && (matrix[index] -> flags & AS_BUSY_CELL)){
|
|
matrix[index] -> flags &= ~AS_REDRAW_CELL;
|
|
memcpy(p,aCellFrame,(dx + 1) * (dx + 1));
|
|
|
|
if(matrix[index] -> slotType == -1){
|
|
col = aciCurColorScheme[INV_BFLOOR_COL_ITM];
|
|
}
|
|
else {
|
|
col = aciCurColorScheme[matrix[index] -> slotType * 4 + INV_BFLOOR_COL_ITM];
|
|
}
|
|
col1 = aciCurColorScheme[INV_CELL_SELECT_COL];
|
|
|
|
swap_buf_col(1,col1,dx + 1,dx + 1,p);
|
|
swap_buf_col(2,col,dx + 1,dx + 1,p);
|
|
|
|
x0 = x + ScreenX;
|
|
y0 = y + ScreenY;
|
|
|
|
if(matrix[index] -> flags & AS_BUSY_CELL)
|
|
matrix[index] -> item -> flags |= INV_ITEM_REDRAW;
|
|
|
|
if(aciBufRedrawFlag)
|
|
put_buf2col(800 + x0,y0,dx + 1,dx + 1,p,300,0);
|
|
else
|
|
XGR_PutSpr(x0,y0,dx + 1,dx + 1,p,XGR_HIDDEN_FON);
|
|
}
|
|
x += aCellSize;
|
|
index ++;
|
|
}
|
|
x = 0;
|
|
y += aCellSize - dx4;
|
|
}
|
|
|
|
x = 0;
|
|
y = 0;
|
|
index = 0;
|
|
|
|
for(i = 0; i < SizeY; i ++){
|
|
if(i & 0x01){
|
|
x += dx2;
|
|
}
|
|
for(j = 0; j < SizeX; j ++){
|
|
if(matrix[index] -> type && ((matrix[index] -> flags & AS_IN_SHADOW) || (matrix[index] -> flags & AS_REDRAW_CELL))){
|
|
matrix[index] -> flags &= ~AS_REDRAW_CELL;
|
|
|
|
x0 = x + ScreenX;
|
|
y0 = y + ScreenY;
|
|
|
|
if(aciBufRedrawFlag)
|
|
put_map(800 + x0,y0,dx + 1,dx + 1);
|
|
else
|
|
XGR_Flush(x0,y0,dx + 1,dx + 1);
|
|
}
|
|
x += aCellSize;
|
|
index ++;
|
|
}
|
|
x = 0;
|
|
y += aCellSize - dx4;
|
|
}
|
|
|
|
delete[] p;
|
|
|
|
invItem* itm = (invItem*)items -> last;
|
|
while(itm){
|
|
if(itm -> flags & INV_ITEM_REDRAW){
|
|
itm -> redraw(ScreenX,ScreenY,1,1);
|
|
itm -> flags &= ~INV_ITEM_REDRAW;
|
|
}
|
|
itm = (invItem*)itm -> prev;
|
|
}
|
|
}
|
|
|
|
void invMatrix::clear_shadow_cells(void)
|
|
{
|
|
int i,j,index = 0;
|
|
for(i = 0; i < SizeY; i ++){
|
|
for(j = 0; j < SizeX; j ++){
|
|
if(matrix[index] -> type && (matrix[index] -> flags & AS_IN_SHADOW)){
|
|
matrix[index] -> flags ^= AS_IN_SHADOW;
|
|
matrix[index] -> flags |= AS_REDRAW_CELL;
|
|
}
|
|
index ++;
|
|
}
|
|
}
|
|
}
|
|
|
|
void invMatrix::redraw_items(void)
|
|
{
|
|
invItem* p = (invItem*)items -> last;
|
|
|
|
while(p){
|
|
p -> redraw(ScreenX,ScreenY,1);
|
|
p = (invItem*)p -> prev;
|
|
}
|
|
}
|
|
|
|
void invMatrix::get_item_coords(invItem* p,int& x,int &y,int &sx,int &sy)
|
|
{
|
|
int _x,_y,_sx,_sy;
|
|
p -> get_coords(ScreenX,ScreenY,_x,_y,_sx,_sy);
|
|
|
|
x = _x;
|
|
y = _y;
|
|
sx = _sx;
|
|
sy = _sy;
|
|
}
|
|
|
|
void invMatrix::redraw(void)
|
|
{
|
|
redraw_matrix();
|
|
redraw_items();
|
|
|
|
if(aciBufRedrawFlag)
|
|
put_map(800 + ScreenX,ScreenY,ScreenSizeX,ScreenSizeY);
|
|
|
|
flags &= ~IM_REDRAW;
|
|
}
|
|
|
|
void CounterPanel::flush(void)
|
|
{
|
|
if(iScreenOwner) return;
|
|
|
|
if(ibs)
|
|
XGR_Flush(ibs -> PosX,ibs -> PosY,ibs -> SizeX,ibs -> SizeY);
|
|
else
|
|
XGR_Flush(PosX,PosY,SizeX,SizeY);
|
|
|
|
flags &= ~CP_FLUSH;
|
|
}
|
|
|
|
void invMatrix::flush(void)
|
|
{
|
|
int x;
|
|
#ifdef _ACI_BOUND_TEST_
|
|
XGR_Rectangle(ScreenX,ScreenY,ScreenSizeX,ScreenSizeY,aciCurColorScheme[INV_NUM_ITM_COL],aciCurColorScheme[INV_NUM_ITM_COL],XGR_OUTLINED);
|
|
#endif
|
|
if(aciBufRedrawFlag){
|
|
x = ScreenX - iScreenOffs + 800;
|
|
XGR_Flush(x,ScreenY,ScreenSizeX,ScreenSizeY);
|
|
}
|
|
else
|
|
XGR_Flush(ScreenX,ScreenY,ScreenSizeX,ScreenSizeY);
|
|
|
|
flags &= ~IM_FLUSH;
|
|
}
|
|
|
|
void aIndData::flush(int dx,int dy)
|
|
{
|
|
int x,y;
|
|
if(dx == -1){
|
|
XGR_Flush(PosX,PosY,SizeX,SizeY);
|
|
}
|
|
else {
|
|
switch(CornerNum){
|
|
case IND_UP_LEFT:
|
|
x = dx;
|
|
y = dy;
|
|
break;
|
|
case IND_UP_RIGHT:
|
|
x = XGR_MAXX - dx - SizeX;
|
|
y = dy;
|
|
break;
|
|
case IND_DN_RIGHT:
|
|
x = XGR_MAXX - dx - SizeX;
|
|
y = XGR_MAXY - dy - SizeY;
|
|
break;
|
|
case IND_DN_LEFT:
|
|
x = dx;
|
|
y = XGR_MAXY - dy - SizeY;
|
|
break;
|
|
}
|
|
XGR_Flush(x,y,SizeX,SizeY);
|
|
}
|
|
flags &= ~IND_FLUSH;
|
|
}
|
|
|
|
void invMatrix::init(void)
|
|
{
|
|
int i,sz = SizeX * SizeY;
|
|
if(!ScreenSizeX) ScreenSizeX = SizeX * aCellSize + (aCellSize >> 1) + 1;
|
|
if(!ScreenSizeY) ScreenSizeY = SizeY * aCellSize - ((SizeY - 1) * (aCellSize >> 2)) + 1;
|
|
maxLoad = 0;
|
|
for(i = 0; i < sz; i ++){
|
|
if(matrix[i] -> type != AS_NO_CELL) maxLoad ++;
|
|
}
|
|
}
|
|
|
|
void aButton::redraw(void)
|
|
{
|
|
int index = cur_frame * SizeX * SizeY;
|
|
char* ptr = frameSeq + index;
|
|
|
|
XGR_PutSpr(PosX,PosY,SizeX,SizeY,ptr,XGR_HIDDEN_FON);
|
|
flags &= ~B_REDRAW;
|
|
}
|
|
|
|
void actIntDispatcher::ind_redraw(void)
|
|
{
|
|
aIndData* p;
|
|
|
|
if(flags & AS_FULLSCR)
|
|
return;
|
|
|
|
p = (aIndData*)indList -> last;
|
|
while(p){
|
|
p -> redraw();
|
|
p = (aIndData*)p -> prev;
|
|
}
|
|
}
|
|
|
|
void actIntDispatcher::redraw(void)
|
|
{
|
|
fncMenu* p;
|
|
aButton* b;
|
|
invMatrix* m;
|
|
CounterPanel* cp;
|
|
InfoPanel* iPl;
|
|
|
|
if(flags & AS_FULLSCR)
|
|
return;
|
|
|
|
aci_tmp ++;
|
|
if(aci_tmp > 64) aci_tmp = 0;
|
|
|
|
iPl = (InfoPanel*)infoPanels -> last;
|
|
while(iPl){
|
|
if(!(iPl -> flags & IP_NO_REDRAW)){
|
|
if(iPl -> interf_type == INT_PANEL){
|
|
iPl -> set_redraw();
|
|
}
|
|
else {
|
|
switch(curMode){
|
|
case AS_INFO_MODE:
|
|
if(iPl -> interf_type == INF_PANEL){
|
|
iPl -> set_redraw();
|
|
}
|
|
break;
|
|
case AS_INV_MODE:
|
|
if(iPl -> interf_type == INV_PANEL){
|
|
iPl -> set_redraw();
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
iPl = (InfoPanel*)iPl -> prev;
|
|
}
|
|
if(curMode == AS_INFO_MODE){
|
|
p = (fncMenu*)menuList -> last;
|
|
while(p){
|
|
if(!(p -> flags & FM_ACTIVE) && p -> curFunction && !(p -> flags & FM_SUBMENU) && !(p -> flags & FM_HIDDEN))
|
|
p -> set_redraw();
|
|
|
|
if((p -> flags & FM_ACTIVE) && !p -> trigger){
|
|
p -> curCount --;
|
|
if(p -> curCount <= 0){
|
|
if(!(p -> flags & FM_SUBMENU)){
|
|
p -> flags &= ~FM_ACTIVE;
|
|
p -> set_redraw();
|
|
init_menus();
|
|
init_submenu(p);
|
|
p -> curCount = p -> activeCount;
|
|
SOUND_SELECT();
|
|
}
|
|
else {
|
|
if(p -> activeCount)
|
|
p -> go2upmenu();
|
|
}
|
|
}
|
|
}
|
|
|
|
p = (fncMenu*)p -> prev;
|
|
}
|
|
}
|
|
|
|
cp = (CounterPanel*)intCounters -> last;
|
|
while(cp){
|
|
if(*cp -> value_ptr != cp -> last_value)
|
|
cp -> set_redraw();
|
|
cp = (CounterPanel*)cp -> prev;
|
|
}
|
|
switch(curMode){
|
|
case AS_INFO_MODE:
|
|
cp = (CounterPanel*)infCounters -> last;
|
|
while(cp){
|
|
if(*cp -> value_ptr != cp -> last_value)
|
|
cp -> set_redraw();
|
|
cp = (CounterPanel*)cp -> prev;
|
|
}
|
|
break;
|
|
case AS_INV_MODE:
|
|
cp = (CounterPanel*)invCounters -> last;
|
|
while(cp){
|
|
if(*cp -> value_ptr != cp -> last_value)
|
|
cp -> set_redraw();
|
|
cp = (CounterPanel*)cp -> prev;
|
|
}
|
|
break;
|
|
}
|
|
if(!(flags & AS_FULL_REDRAW)){
|
|
XGR_MouseObj.flags &= ~XGM_PROMPT_ACTIVE;
|
|
XGR_Obj.fill(0);
|
|
for(int i = 0; i < curIbs -> backs.size(); i++) {
|
|
curIbs -> backs[i] -> show(0);
|
|
}
|
|
if(curMode == AS_INV_MODE && curMatrix && curMatrix -> back){
|
|
curMatrix -> back -> show();
|
|
}
|
|
flags |= AS_FULL_FLUSH;
|
|
cp = (CounterPanel*)intCounters -> last;
|
|
while(cp){
|
|
cp -> redraw();
|
|
cp = (CounterPanel*)cp -> prev;
|
|
}
|
|
b = (aButton*)intButtons -> last;
|
|
while(b){
|
|
b -> redraw();
|
|
b = (aButton*)b -> prev;
|
|
}
|
|
switch(curMode){
|
|
case AS_INV_MODE:
|
|
b = (aButton*)invButtons -> last;
|
|
while(b){
|
|
b -> redraw();
|
|
b = (aButton*)b -> prev;
|
|
}
|
|
if(curMatrix){
|
|
curMatrix -> redraw();
|
|
}
|
|
if(iP){
|
|
iP -> redraw();
|
|
}
|
|
cp = (CounterPanel*)invCounters -> last;
|
|
while(cp){
|
|
cp -> redraw();
|
|
cp = (CounterPanel*)cp -> prev;
|
|
}
|
|
break;
|
|
case AS_INFO_MODE:
|
|
b = (aButton*)infButtons -> last;
|
|
while(b){
|
|
b -> redraw();
|
|
b = (aButton*)b -> prev;
|
|
}
|
|
p = (fncMenu*)menuList -> last;
|
|
while(p){
|
|
if(!(p -> flags & FM_SUBMENU) || (p -> flags & FM_ACTIVE))
|
|
p -> redraw();
|
|
else
|
|
p -> flags &= ~FM_REDRAW;
|
|
|
|
p = (fncMenu*)p -> prev;
|
|
}
|
|
cp = (CounterPanel*)infCounters -> last;
|
|
while(cp){
|
|
cp -> redraw();
|
|
cp = (CounterPanel*)cp -> prev;
|
|
}
|
|
break;
|
|
}
|
|
flags |= AS_FULL_REDRAW;
|
|
}
|
|
b = (aButton*)intButtons -> last;
|
|
while(b){
|
|
if(b -> flags & B_REDRAW){
|
|
b -> redraw();
|
|
b -> set_flush();
|
|
}
|
|
b = (aButton*)b -> prev;
|
|
}
|
|
if(curMode == AS_INV_MODE){
|
|
b = (aButton*)invButtons -> last;
|
|
while(b){
|
|
if(b -> flags & B_REDRAW){
|
|
b -> redraw();
|
|
b -> set_flush();
|
|
}
|
|
b = (aButton*)b -> prev;
|
|
}
|
|
}
|
|
|
|
if(curMode == AS_INFO_MODE){
|
|
b = (aButton*)infButtons -> last;
|
|
while(b){
|
|
if(b -> flags & B_REDRAW){
|
|
b -> redraw();
|
|
b -> set_flush();
|
|
}
|
|
b = (aButton*)b -> prev;
|
|
}
|
|
}
|
|
|
|
if(curMode == AS_INV_MODE && curMatrix){
|
|
m = curMatrix;
|
|
if(m -> flags & IM_REDRAW){
|
|
m -> redraw();
|
|
m -> set_flush();
|
|
}
|
|
}
|
|
|
|
if(curMode == AS_INFO_MODE){
|
|
p = (fncMenu*)menuList -> last;
|
|
while(p){
|
|
if(p -> flags & FM_REDRAW){
|
|
p -> redraw();
|
|
p -> set_flush();
|
|
}
|
|
p = (fncMenu*)p -> prev;
|
|
}
|
|
}
|
|
if(iP && curMode == AS_INV_MODE){
|
|
if(iP -> flags & IP_REDRAW){
|
|
iP -> redraw();
|
|
iP -> set_flush();
|
|
}
|
|
}
|
|
cp = (CounterPanel*)intCounters -> last;
|
|
while(cp){
|
|
if(cp -> flags & CP_REDRAW){
|
|
cp -> redraw();
|
|
cp -> set_flush();
|
|
}
|
|
cp = (CounterPanel*)cp -> prev;
|
|
}
|
|
if(curMode == AS_INFO_MODE){
|
|
cp = (CounterPanel*)infCounters -> last;
|
|
while(cp){
|
|
if(cp -> flags & CP_REDRAW){
|
|
cp -> redraw();
|
|
cp -> set_flush();
|
|
}
|
|
cp = (CounterPanel*)cp -> prev;
|
|
}
|
|
}
|
|
if(curMode == AS_INV_MODE){
|
|
cp = (CounterPanel*)invCounters -> last;
|
|
while(cp){
|
|
if(cp -> flags & CP_REDRAW){
|
|
cp -> redraw();
|
|
cp -> set_flush();
|
|
}
|
|
cp = (CounterPanel*)cp -> prev;
|
|
}
|
|
}
|
|
|
|
iPl = (InfoPanel*)infoPanels -> last;
|
|
while(iPl){
|
|
if(iPl -> flags & IP_REDRAW){
|
|
iPl -> redraw();
|
|
iPl -> set_flush();
|
|
}
|
|
iPl = (InfoPanel*)iPl -> prev;
|
|
}
|
|
}
|
|
|
|
void actIntDispatcher::text_redraw(){
|
|
if(Pause > 1 && NetworkON){
|
|
if(GameQuantReturnValue || acsQuant()){
|
|
Pause = 0;
|
|
}
|
|
flags |= AS_FULL_FLUSH;
|
|
}
|
|
|
|
if(flags & AS_TEXT_MODE){
|
|
ScrTextData -> redraw();
|
|
ScrTextData -> Quant();
|
|
}
|
|
if(curPrompt -> NumStr) {
|
|
if (flags & AS_FULLSCR || !curIbs) {
|
|
curPrompt->redraw(0, 0, XGR_MAXX, XGR_MAXY);
|
|
} else {
|
|
int offsetX = (XGR_MAXX - curIbs->bSizeX) / 2;
|
|
curPrompt -> redraw(curIbs -> PosX + offsetX,curIbs -> PosY,curIbs -> SizeX,curIbs -> SizeY);
|
|
}
|
|
curPrompt -> quant();
|
|
}
|
|
if(flags & AS_CHAT_MODE){
|
|
iChatQuant();
|
|
}
|
|
else {
|
|
if(aciRacingFlag){
|
|
aciShowRacingPlace();
|
|
}
|
|
}
|
|
if(Pause > 1 && NetworkON){
|
|
if(GameQuantReturnValue || acsQuant()){
|
|
Pause = 0;
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
|
|
void actIntDispatcher::i_redraw(void)
|
|
{
|
|
fncMenu* p;
|
|
CounterPanel* cp;
|
|
InfoPanel* ip;
|
|
|
|
if(flags & AS_ISCREEN_INV_MODE){
|
|
cp = (CounterPanel*)i_Counters -> last;
|
|
while(cp){
|
|
if(*cp -> value_ptr != cp -> last_value)
|
|
cp -> set_redraw();
|
|
cp = (CounterPanel*)cp -> prev;
|
|
}
|
|
}
|
|
|
|
if(!(flags & AS_FULL_REDRAW)){
|
|
if(flags & AS_ISCREEN_INV_MODE){
|
|
cp = (CounterPanel*)i_Counters -> last;
|
|
while(cp){
|
|
cp -> redraw();
|
|
cp = (CounterPanel*)cp -> prev;
|
|
}
|
|
if(curMatrix){
|
|
curMatrix -> redraw();
|
|
}
|
|
if(secondMatrix){
|
|
secondMatrix -> redraw();
|
|
}
|
|
if(iP){
|
|
iP -> redraw();
|
|
}
|
|
p = (fncMenu*)i_menuList -> last;
|
|
while(p){
|
|
if(!(p -> flags & FM_LOCATION_MENU) && p -> flags & FM_ACTIVE)
|
|
p -> redraw();
|
|
p = (fncMenu*)p -> prev;
|
|
}
|
|
}
|
|
else {
|
|
if(qMenu) qMenu -> redraw();
|
|
p = (fncMenu*)i_menuList -> last;
|
|
while(p){
|
|
if(p -> flags & FM_LOCATION_MENU && p -> flags & FM_ACTIVE)
|
|
p -> redraw();
|
|
p = (fncMenu*)p -> prev;
|
|
}
|
|
}
|
|
ip = (InfoPanel*)i_infoPanels -> last;
|
|
while(ip){
|
|
ip -> redraw();
|
|
ip = (InfoPanel*)ip -> prev;
|
|
}
|
|
flags |= AS_FULL_REDRAW;
|
|
flags |= AS_FULL_FLUSH;
|
|
}
|
|
|
|
if(flags & AS_ISCREEN_INV_MODE){
|
|
if(curMatrix && curMatrix -> flags & IM_REDRAW){
|
|
curMatrix -> redraw();
|
|
curMatrix -> set_flush();
|
|
}
|
|
|
|
if(secondMatrix && secondMatrix -> flags & IM_REDRAW){
|
|
secondMatrix -> redraw();
|
|
secondMatrix -> set_flush();
|
|
}
|
|
|
|
if(iP){
|
|
if(iP -> flags & IP_REDRAW){
|
|
iP -> redraw();
|
|
iP -> set_flush();
|
|
}
|
|
}
|
|
cp = (CounterPanel*)i_Counters -> last;
|
|
while(cp){
|
|
if(cp -> flags & CP_REDRAW){
|
|
cp -> redraw();
|
|
cp -> set_flush();
|
|
}
|
|
cp = (CounterPanel*)cp -> prev;
|
|
}
|
|
p = (fncMenu*)i_menuList -> last;
|
|
while(p){
|
|
if(!(p -> flags & FM_LOCATION_MENU) && p -> flags & FM_ACTIVE){
|
|
p -> redraw();
|
|
p -> set_flush();
|
|
}
|
|
p = (fncMenu*)p -> prev;
|
|
}
|
|
}
|
|
else {
|
|
if(qMenu && qMenu -> flags & FMC_REDRAW) qMenu -> redraw();
|
|
p = (fncMenu*)i_menuList -> last;
|
|
while(p){
|
|
if(p -> flags & FM_LOCATION_MENU && p -> flags & FM_ACTIVE){
|
|
p -> redraw();
|
|
p -> set_flush();
|
|
}
|
|
p = (fncMenu*)p -> prev;
|
|
}
|
|
}
|
|
|
|
ip = (InfoPanel*)i_infoPanels -> last;
|
|
while(ip){
|
|
if(ip -> flags & IP_REDRAW){
|
|
ip -> redraw();
|
|
ip -> set_flush();
|
|
}
|
|
ip = (InfoPanel*)ip -> prev;
|
|
}
|
|
}
|
|
|
|
void actIntDispatcher::flush(void)
|
|
{
|
|
fncMenu* p;
|
|
aButton* b;
|
|
invMatrix* m;
|
|
aIndData* ind;
|
|
CounterPanel* cp;
|
|
InfoPanel* iPl;
|
|
int emode = ExclusiveLog ? XGR_EXCLUSIVE : 0;
|
|
|
|
if(iKeyPressed(iKEY_EXIT)){
|
|
i_slake_pal(actIntPal,32);
|
|
acsHandleExtEvent(ACS_GLOBAL_EXIT);
|
|
aciPrepareEndImage();
|
|
GameQuantReturnValue = RTO_SHOW_IMAGE_ID;
|
|
XGR_MouseHide();
|
|
/*if(XGR_MAXX != 800){
|
|
if(XGR_ReInit(800,600,emode)) ErrH.Abort("Error video initialization");
|
|
}*/
|
|
XGR_Flip();
|
|
return;
|
|
}
|
|
|
|
if(flags & AS_FULLSCR){
|
|
ind = (aIndData*)indList -> last;
|
|
while(ind){
|
|
ind -> redraw(IND_DATA_OFFS,IND_DATA_OFFS);
|
|
ind -> flush(IND_DATA_OFFS,IND_DATA_OFFS);
|
|
ind = (aIndData*)ind -> prev;
|
|
}
|
|
if(flags & AS_EVINCE_PALETTE){
|
|
i_evince_pal(actIntPal,16);
|
|
PalIterLock = 0;
|
|
flags ^= AS_EVINCE_PALETTE;
|
|
}
|
|
return;
|
|
}
|
|
|
|
ind = (aIndData*)indList -> last;
|
|
while(ind){
|
|
ind -> redraw();
|
|
if(!(flags & AS_FULL_FLUSH)) ind -> flush();
|
|
ind = (aIndData*)ind -> prev;
|
|
}
|
|
|
|
|
|
if(flags & AS_FULL_FLUSH){
|
|
flags &= ~AS_FULL_FLUSH;
|
|
XGR_Flush(0,0,XGR_MAXX,XGR_MAXY);
|
|
}
|
|
|
|
cp = (CounterPanel*)intCounters -> last;
|
|
while(cp){
|
|
if(cp -> flags & CP_FLUSH){
|
|
cp -> flush();
|
|
}
|
|
cp = (CounterPanel*)cp -> prev;
|
|
}
|
|
cp = (CounterPanel*)infCounters -> last;
|
|
while(cp){
|
|
if(cp -> flags & CP_FLUSH){
|
|
cp -> flush();
|
|
}
|
|
cp = (CounterPanel*)cp -> prev;
|
|
}
|
|
cp = (CounterPanel*)invCounters -> last;
|
|
while(cp){
|
|
if(cp -> flags & CP_FLUSH){
|
|
cp -> flush();
|
|
}
|
|
cp = (CounterPanel*)cp -> prev;
|
|
}
|
|
if(curMatrix){
|
|
m = curMatrix;
|
|
if(m -> flags & IM_FLUSH){
|
|
m -> flush();
|
|
}
|
|
if(m -> flags & IM_REDRAW_SHADOW){
|
|
m -> redraw_shadow_cells();
|
|
m -> flags &= ~IM_REDRAW_SHADOW;
|
|
}
|
|
}
|
|
|
|
p = (fncMenu*)menuList -> last;
|
|
while(p){
|
|
if(p -> flags & FM_FLUSH){
|
|
p -> flush();
|
|
}
|
|
p = (fncMenu*)p -> prev;
|
|
}
|
|
|
|
b = (aButton*)intButtons -> last;
|
|
while(b){
|
|
if(b -> flags & B_FLUSH){
|
|
b -> flush();
|
|
}
|
|
if(b -> flags & B_ACTIVE){
|
|
b -> press();
|
|
}
|
|
if(b -> activeCount && b -> flags & B_PRESSED){
|
|
if(b -> curCount >= b -> activeCount){
|
|
b -> press();
|
|
send_event(b -> eventCode,b -> eventData);
|
|
}
|
|
else
|
|
b -> curCount ++;
|
|
}
|
|
b = (aButton*)b -> prev;
|
|
}
|
|
b = (aButton*)invButtons -> last;
|
|
while(b){
|
|
if(b -> flags & B_FLUSH){
|
|
b -> flush();
|
|
}
|
|
if(b -> flags & B_ACTIVE){
|
|
b -> press();
|
|
}
|
|
if(curMode == AS_INV_MODE){
|
|
if(b -> activeCount && b -> flags & B_PRESSED){
|
|
if(b -> curCount >= b -> activeCount){
|
|
b -> press();
|
|
send_event(b -> eventCode,b -> eventData);
|
|
}
|
|
else
|
|
b -> curCount ++;
|
|
}
|
|
}
|
|
b = (aButton*)b -> prev;
|
|
}
|
|
b = (aButton*)infButtons -> last;
|
|
while(b){
|
|
if(b -> flags & B_FLUSH){
|
|
b -> flush();
|
|
}
|
|
if(b -> flags & B_ACTIVE){
|
|
b -> press();
|
|
}
|
|
if(curMode == AS_INFO_MODE){
|
|
if(b -> activeCount && b -> flags & B_PRESSED){
|
|
if(b -> curCount >= b -> activeCount){
|
|
b -> press();
|
|
send_event(b -> eventCode,b -> eventData);
|
|
}
|
|
else
|
|
b -> curCount ++;
|
|
}
|
|
}
|
|
b = (aButton*)b -> prev;
|
|
}
|
|
if(iP && iP -> flags & IP_FLUSH)
|
|
iP -> flush();
|
|
|
|
iPl = (InfoPanel*)infoPanels -> last;
|
|
while(iPl){
|
|
if(iPl -> flags & IP_FLUSH){
|
|
iPl -> flush();
|
|
}
|
|
iPl = (InfoPanel*)iPl -> prev;
|
|
}
|
|
|
|
if(flags & AS_EVINCE_PALETTE){
|
|
i_evince_pal(actIntPal,16);
|
|
PalIterLock = 0;
|
|
flags ^= AS_EVINCE_PALETTE;
|
|
}
|
|
}
|
|
|
|
void actIntDispatcher::pal_flush() {
|
|
if(flags & AS_EVINCE_PALETTE){
|
|
i_evince_pal(actIntPal,16);
|
|
PalIterLock = 0;
|
|
flags ^= AS_EVINCE_PALETTE;
|
|
}
|
|
}
|
|
|
|
void actIntDispatcher::i_flush(void)
|
|
{
|
|
invMatrix* m;
|
|
CounterPanel* cp;
|
|
|
|
if(!(flags & AS_ISCREEN_INV_MODE))
|
|
return;
|
|
|
|
if(flags & AS_FULL_FLUSH){
|
|
flags &= ~AS_FULL_FLUSH;
|
|
XGR_Flush(0,0,XGR_MAXX,XGR_MAXY);
|
|
}
|
|
|
|
cp = (CounterPanel*)i_Counters -> last;
|
|
while(cp){
|
|
if(cp -> flags & CP_FLUSH){
|
|
cp -> flush();
|
|
}
|
|
cp = (CounterPanel*)cp -> prev;
|
|
}
|
|
|
|
if(curMatrix){
|
|
m = curMatrix;
|
|
if(m -> flags & IM_FLUSH){
|
|
m -> flush();
|
|
}
|
|
if(m -> flags & IM_REDRAW_SHADOW){
|
|
m -> redraw_shadow_cells();
|
|
m -> flush();
|
|
m -> flags &= ~IM_REDRAW_SHADOW;
|
|
}
|
|
}
|
|
|
|
if(secondMatrix){
|
|
m = secondMatrix;
|
|
if(m -> flags & IM_FLUSH){
|
|
m -> flush();
|
|
}
|
|
if(m -> flags & IM_REDRAW_SHADOW){
|
|
m -> redraw_shadow_cells();
|
|
m -> flush();
|
|
m -> flags &= ~IM_REDRAW_SHADOW;
|
|
}
|
|
}
|
|
/*
|
|
m = (invMatrix*)i_matrixList -> last;
|
|
while(m){
|
|
if(m -> flags & IM_FLUSH){
|
|
m -> flush();
|
|
}
|
|
if(m -> flags & IM_REDRAW_SHADOW){
|
|
m -> redraw_shadow_cells();
|
|
}
|
|
m = (invMatrix*)m -> prev;
|
|
}
|
|
*/
|
|
if(iP && iP -> flags & IP_FLUSH)
|
|
iP -> flush();
|
|
}
|
|
|
|
invMatrix* actIntDispatcher::get_matrix(int tp)
|
|
{
|
|
invMatrix* p = (invMatrix*)matrixList -> last;
|
|
while(p){
|
|
if(p -> type == tp)
|
|
return p;
|
|
p = (invMatrix*)p -> prev;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
invMatrix* actIntDispatcher::get_imatrix(int tp)
|
|
{
|
|
invMatrix* p = (invMatrix*)i_matrixList -> last;
|
|
while(p){
|
|
if(p -> type == tp)
|
|
return p;
|
|
p = (invMatrix*)p -> prev;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
invItem* actIntDispatcher::get_item(int id)
|
|
{
|
|
invItem* p = (invItem*)itemList -> last;
|
|
while(p){
|
|
if(p -> ID == id)
|
|
return p;
|
|
p = (invItem*)p -> prev;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
aciLocationInfo* actIntDispatcher::get_locdata(int id)
|
|
{
|
|
aciLocationInfo* p = (aciLocationInfo*)locationList -> last;
|
|
while(p){
|
|
if(p -> ID == id)
|
|
return p;
|
|
p = (aciLocationInfo*)p -> prev;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
invItem* actIntDispatcher::get_iitem(int id)
|
|
{
|
|
invItem* p = (invItem*)i_itemList -> last;
|
|
while(p){
|
|
if(p -> ID == id)
|
|
return p;
|
|
p = (invItem*)p -> prev;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
aIndData* actIntDispatcher::get_ind(int id)
|
|
{
|
|
aIndData* p = (aIndData*)indList -> last;
|
|
while(p){
|
|
if(p -> ID == id)
|
|
return p;
|
|
p = (aIndData*)p -> prev;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
void actIntDispatcher::init(void)
|
|
{
|
|
fncMenu* it;
|
|
invItem* itm;
|
|
invMatrix* p;
|
|
aButton* b;
|
|
aIndData* ind;
|
|
CounterPanel* cp;
|
|
InfoPanel* ip;
|
|
aciBitmapMenu* bm;
|
|
|
|
ibsObject* ibs;
|
|
bmlObject* bml;
|
|
|
|
aciCurColorScheme = aciColorSchemes[SCH_DEFAULT];
|
|
if(iP) {
|
|
layout(iP, XGR_MAXX, XGR_MAXY);
|
|
iP -> init();
|
|
}
|
|
|
|
ip = (InfoPanel*)infoPanels -> last;
|
|
while(ip){
|
|
layout(ip, XGR_MAXX, XGR_MAXY);
|
|
ip -> init();
|
|
ip = (InfoPanel*)ip -> prev;
|
|
}
|
|
|
|
bm = (aciBitmapMenu*)b_menuList -> last;
|
|
while(bm){
|
|
bm -> init();
|
|
bm = (aciBitmapMenu*)bm -> prev;
|
|
}
|
|
|
|
if(wMap) wMap -> init();
|
|
|
|
aciSet_aMouse();
|
|
|
|
ind = (aIndData*)indList -> last;
|
|
while(ind){
|
|
ind -> init();
|
|
ind = (aIndData*)ind -> prev;
|
|
}
|
|
|
|
cp = (CounterPanel*)intCounters -> last;
|
|
while(cp){
|
|
layout(cp, XGR_MAXX, XGR_MAXY);
|
|
cp -> init();
|
|
cp = (CounterPanel*)cp -> prev;
|
|
}
|
|
cp = (CounterPanel*)infCounters -> last;
|
|
while(cp){
|
|
layout(cp, XGR_MAXX, XGR_MAXY);
|
|
cp -> init();
|
|
cp = (CounterPanel*)cp -> prev;
|
|
}
|
|
cp = (CounterPanel*)invCounters -> last;
|
|
while(cp){
|
|
layout(cp, XGR_MAXX, XGR_MAXY);
|
|
cp -> init();
|
|
cp = (CounterPanel*)cp -> prev;
|
|
}
|
|
|
|
p = (invMatrix*)matrixList -> last;
|
|
while(p){
|
|
p -> init();
|
|
layout(p, XGR_MAXX, XGR_MAXY);
|
|
p -> back -> load();
|
|
// TODO: move to resource file
|
|
p -> back -> OffsX = 10;
|
|
p -> back -> anchor = WIDGET_ANCHOR_RIGHT;
|
|
|
|
layout(p -> back, XGR_MAXX, XGR_MAXY);
|
|
p = (invMatrix*)p -> prev;
|
|
}
|
|
|
|
#ifdef _ACI_SKIP_SHOP_
|
|
if(!curMatrix){
|
|
curMatrix = alloc_matrix(curMatrixID);
|
|
}
|
|
#endif
|
|
|
|
ibs = (ibsObject*)ibsList -> last;
|
|
while(ibs){
|
|
for(int i = 0; i < ibs -> backObjIDs.size(); i++) {
|
|
ibs -> backs.push_back(get_back_bml(ibs -> backObjIDs[i]));
|
|
ibs -> backs[i] -> load(NULL, 1);
|
|
layout(ibs -> backs[i], XGR_MAXX, XGR_MAXY);
|
|
}
|
|
ibs = (ibsObject*)ibs -> prev;
|
|
}
|
|
curIbs = get_ibs(curIbsID);
|
|
load_ibs();
|
|
|
|
if(wMap -> world_ids[CurrentWorld] != -1 && map_names[wMap -> world_ids[CurrentWorld]]){
|
|
mapObj -> free();
|
|
mapObj -> load(map_names[wMap -> world_ids[CurrentWorld]],1);
|
|
}
|
|
else {
|
|
ErrH.Abort("Map BMP not found...");
|
|
}
|
|
|
|
itm = (invItem*)itemList -> last;
|
|
while(itm){
|
|
itm -> init();
|
|
itm = (invItem*)itm -> prev;
|
|
}
|
|
|
|
it = (fncMenu*)menuList -> last;
|
|
while(it){
|
|
it -> init();
|
|
layout(it, XGR_MAXX, XGR_MAXY);
|
|
it = (fncMenu*)it -> prev;
|
|
}
|
|
|
|
b = (aButton*)intButtons -> last;
|
|
while(b){
|
|
b -> init();
|
|
layout(b, XGR_MAXX, XGR_MAXY);
|
|
b = (aButton*)b -> prev;
|
|
}
|
|
b = (aButton*)invButtons -> last;
|
|
while(b){
|
|
b -> init();
|
|
layout(b, XGR_MAXX, XGR_MAXY);
|
|
b = (aButton*)b -> prev;
|
|
}
|
|
b = (aButton*)infButtons -> last;
|
|
while(b){
|
|
b -> init();
|
|
layout(b, XGR_MAXX, XGR_MAXY);
|
|
b = (aButton*)b -> prev;
|
|
}
|
|
init_menus();
|
|
|
|
build_cell_frame();
|
|
|
|
if(flags & AS_FULLSCR){
|
|
XGR_MouseSetPromptData(NULL);
|
|
XGR_MouseHide();
|
|
}
|
|
else {
|
|
switch(curMode){
|
|
case AS_INV_MODE:
|
|
XGR_MouseSetPromptData(invPrompt);
|
|
break;
|
|
case AS_INFO_MODE:
|
|
XGR_MouseSetPromptData(infPrompt);
|
|
break;
|
|
}
|
|
}
|
|
XGR_MouseObj.PromptColor = 160 | (1 << 16);
|
|
aciPrevJumpCount = -1;
|
|
}
|
|
|
|
void actIntDispatcher::i_init(void)
|
|
{
|
|
int i;
|
|
|
|
invMatrix* p;
|
|
CounterPanel* cp;
|
|
invItem* itm;
|
|
aciLocationInfo* locData;
|
|
fncMenu* m;
|
|
|
|
XGR_GetPal(actIntPal);
|
|
i_slake_pal(actIntPal,32);
|
|
|
|
int emode = ExclusiveLog ? XGR_EXCLUSIVE : 0;
|
|
|
|
/*if(XGR_MAXX != 800){
|
|
if(XGR_ReInit(800,600,emode)) ErrH.Abort("Error video initialization");
|
|
}*/
|
|
XGR_Flip();
|
|
LoadingMessage(1);
|
|
|
|
aci_curLocationID = get_locdata_id(aci_curLocationName);
|
|
locData = get_locdata(aci_curLocationID);
|
|
|
|
if(!locData)
|
|
ErrH.Abort("Location info not found...",XERR_USER,aci_curLocationID);
|
|
|
|
aci_ivMapName = locData -> mapName;
|
|
aci_iScreenID = locData -> screenID;
|
|
|
|
curLocData = locData;
|
|
locData -> prepare();
|
|
|
|
memcpy(aci_iscrPal,iscrPal,768);
|
|
XStream fh(locData -> palName,XS_IN);
|
|
fh.read(iscrPal,768);
|
|
fh.close();
|
|
|
|
for(i = 0; i < 16; i ++){
|
|
iscrPal[i * 3] = i * 4;
|
|
iscrPal[i * 3 + 1] = i * 4;
|
|
iscrPal[i * 3 + 2] = i * 4;
|
|
}
|
|
|
|
ipal_init(iscrPal);
|
|
aciShowLocationPicture();
|
|
|
|
finit();
|
|
|
|
aciSet_iMouse();
|
|
|
|
aci_CellSize = aCellSize;
|
|
aCellSize = iCellSize;
|
|
|
|
secondMatrix = NULL;
|
|
flags &= ~AS_ISCREEN_INV_MODE;
|
|
|
|
if(iscr_iP) iscr_iP -> init();
|
|
|
|
m = (fncMenu*)i_menuList -> last;
|
|
while(m){
|
|
m -> init();
|
|
m = (fncMenu*)m -> prev;
|
|
}
|
|
|
|
m = (fncMenu*)menuList -> last;
|
|
while(m){
|
|
if(m -> flags & FM_LOCATION_MENU)
|
|
m -> flags &= ~FM_ACTIVE;
|
|
m = (fncMenu*)m -> prev;
|
|
}
|
|
|
|
cp = (CounterPanel*)i_Counters -> last;
|
|
while(cp){
|
|
cp -> init();
|
|
cp = (CounterPanel*)cp -> prev;
|
|
}
|
|
|
|
p = (invMatrix*)i_matrixList -> last;
|
|
while(p){
|
|
p -> init();
|
|
p = (invMatrix*)p -> prev;
|
|
}
|
|
|
|
itm = (invItem*)i_itemList -> last;
|
|
while(itm){
|
|
itm -> init();
|
|
itm = (invItem*)itm -> prev;
|
|
}
|
|
|
|
if(!curMatrix && GGamerMechos){
|
|
p = get_matrix(GGamerMechos -> type);
|
|
curMatrix = alloc_matrix(GGamerMechos -> type);
|
|
p -> clone(curMatrix);
|
|
}
|
|
|
|
if(curMatrix){
|
|
if(flags & AS_INV_MOVE_ITEM){
|
|
flags ^= AS_INV_MOVE_ITEM;
|
|
if(!curMatrix -> auto_put_item(curItem)){
|
|
aciSendEvent2itmdsp(ACI_DROP_ITEM,curItem -> item_ptr);
|
|
restore_mouse_cursor();
|
|
free_item(curItem);
|
|
}
|
|
}
|
|
i_curMatrix = alloc_matrix(curMatrix -> type,1);
|
|
trade_items(i_curMatrix,1);
|
|
|
|
free_matrix(curMatrix);
|
|
curMatrix = i_curMatrix;
|
|
|
|
}
|
|
else {
|
|
a_curMatrix = NULL;
|
|
i_curMatrix = NULL;
|
|
}
|
|
|
|
qMenu = new fncMenuSet;
|
|
|
|
ascr_iP = iP;
|
|
iP = iscr_iP;
|
|
|
|
build_cell_frame();
|
|
|
|
aciInitInfoPanels();
|
|
aciInitEvLineID();
|
|
aciInitShopItems();
|
|
|
|
aciCurColorScheme = aciColorSchemes[SCH_ISCREEN];
|
|
|
|
flags |= AS_ISCREEN;
|
|
flags &= ~AS_FULL_REDRAW;
|
|
|
|
prevWorld = CurrentWorld;
|
|
CurrentWorld = -1;
|
|
|
|
aciBufRedrawFlag = 1;
|
|
PalIterLock = 1;
|
|
|
|
dgD -> startSession(aci_curLocationName);
|
|
|
|
LoadResourceSOUND(curLocData -> soundResPath,0);
|
|
|
|
aciML_D -> init_data_set(aci_curLocationID);
|
|
aciML_D -> init();
|
|
aciPutTreasureItem();
|
|
aciML_D -> startup();
|
|
}
|
|
|
|
void actIntDispatcher::finit(void)
|
|
{
|
|
fncMenu* it;
|
|
invItem* itm;
|
|
aButton* b;
|
|
aIndData* ind;
|
|
CounterPanel* cp;
|
|
InfoPanel* ip;
|
|
aciBitmapMenu* bm;
|
|
|
|
XGR_MouseSetPromptData(NULL);
|
|
|
|
if(iP) iP -> finit();
|
|
|
|
ip = (InfoPanel*)infoPanels -> last;
|
|
while(ip){
|
|
ip -> finit();
|
|
ip = (InfoPanel*)ip -> prev;
|
|
}
|
|
|
|
bm = (aciBitmapMenu*)b_menuList -> last;
|
|
while(bm){
|
|
bm -> finit();
|
|
bm = (aciBitmapMenu*)bm -> prev;
|
|
}
|
|
|
|
ind = (aIndData*)indList -> last;
|
|
while(ind){
|
|
ind -> finit();
|
|
ind = (aIndData*)ind -> prev;
|
|
}
|
|
|
|
cp = (CounterPanel*)intCounters -> last;
|
|
while(cp){
|
|
cp -> finit();
|
|
cp = (CounterPanel*)cp -> prev;
|
|
}
|
|
cp = (CounterPanel*)infCounters -> last;
|
|
while(cp){
|
|
cp -> finit();
|
|
cp = (CounterPanel*)cp -> prev;
|
|
}
|
|
cp = (CounterPanel*)invCounters -> last;
|
|
while(cp){
|
|
cp -> finit();
|
|
cp = (CounterPanel*)cp -> prev;
|
|
}
|
|
|
|
free_ibs();
|
|
mapObj -> free();
|
|
|
|
itm = (invItem*)itemList -> last;
|
|
while(itm){
|
|
itm -> finit();
|
|
itm = (invItem*)itm -> prev;
|
|
}
|
|
|
|
it = (fncMenu*)menuList -> last;
|
|
while(it){
|
|
it -> finit();
|
|
it = (fncMenu*)it -> prev;
|
|
}
|
|
|
|
b = (aButton*)intButtons -> last;
|
|
while(b){
|
|
b -> finit();
|
|
b = (aButton*)b -> prev;
|
|
}
|
|
b = (aButton*)invButtons -> last;
|
|
while(b){
|
|
b -> finit();
|
|
b = (aButton*)b -> prev;
|
|
}
|
|
b = (aButton*)infButtons -> last;
|
|
while(b){
|
|
b -> finit();
|
|
b = (aButton*)b -> prev;
|
|
}
|
|
|
|
free_cell_frame();
|
|
}
|
|
|
|
void actIntDispatcher::i_finit(void)
|
|
{
|
|
CounterPanel* cp;
|
|
invItem* itm;
|
|
fncMenu* m;
|
|
|
|
aciBufRedrawFlag = 0;
|
|
aCellSize = aci_CellSize;
|
|
CurrentWorld = prevWorld;
|
|
|
|
aciChangeWorld(CurrentWorld);
|
|
aciPrepareWorldsMenu();
|
|
|
|
flags &= ~AS_ISCREEN;
|
|
if(iscr_iP) iscr_iP -> finit();
|
|
|
|
aciML_D -> finit();
|
|
|
|
aciSet_aMouse();
|
|
restore_mouse_cursor();
|
|
|
|
if(!(flags & AS_FULLSCR))
|
|
XGR_MouseShow();
|
|
|
|
dgD -> endSession();
|
|
SoundEscaveOff();
|
|
|
|
delete qMenu;
|
|
qMenu = NULL;
|
|
|
|
if(flags & AS_INV_MOVE_ITEM){
|
|
aciSell_Item(curItem);
|
|
restore_mouse_cursor();
|
|
|
|
curItem = NULL;
|
|
flags ^= AS_INV_MOVE_ITEM;
|
|
}
|
|
|
|
m = (fncMenu*)i_menuList -> last;
|
|
while(m){
|
|
m -> finit();
|
|
m = (fncMenu*)m -> prev;
|
|
}
|
|
|
|
cp = (CounterPanel*)i_Counters -> last;
|
|
while(cp){
|
|
cp -> finit();
|
|
cp = (CounterPanel*)cp -> prev;
|
|
}
|
|
|
|
itm = (invItem*)i_itemList -> last;
|
|
while(itm){
|
|
itm -> finit();
|
|
itm = (invItem*)itm -> prev;
|
|
}
|
|
|
|
free_cell_frame();
|
|
|
|
iscr_iP = iP;
|
|
iP = ascr_iP;
|
|
|
|
init();
|
|
aMS_init();
|
|
|
|
if(curMatrix){
|
|
a_curMatrix = alloc_matrix(curMatrix -> type);
|
|
trade_items(a_curMatrix,0);
|
|
|
|
free_matrix(curMatrix);
|
|
curMatrix = a_curMatrix;
|
|
|
|
clean_menus();
|
|
prepare_menus();
|
|
|
|
aciInitItmTextQueue();
|
|
}
|
|
aciPrevJumpCount = -1;
|
|
iKeyClear();
|
|
}
|
|
|
|
|
|
void fncMenuItem::init(void)
|
|
{
|
|
if(flags & FM_RANGE_FONT)
|
|
SizeX = aStrLen32((unsigned char*)name,font,space);
|
|
else
|
|
SizeX = aStrLen((unsigned char*)name,font,space);
|
|
SizeY = aScrFonts[font] -> SizeY;
|
|
}
|
|
|
|
void InfoPanel::init(void)
|
|
{
|
|
if(bml_name){
|
|
if(!bml) bml = new bmlObject;
|
|
bml -> load(bml_name);
|
|
bml -> OffsX = (short)PosX;
|
|
bml -> OffsX = (short)PosY;
|
|
|
|
}
|
|
if(ibs_name){
|
|
if(!ibs) ibs = new ibsObject;
|
|
ibs -> load(ibs_name);
|
|
ibs -> PosX = (short)PosX;
|
|
ibs -> PosY = (short)PosY;
|
|
// TODO:
|
|
// ibs -> recalc_geometry();
|
|
// SideX = SizeX / 2;
|
|
// SideY = SizeY / 2;
|
|
//
|
|
// CenterX = PosX + SideX;
|
|
// CenterY = PosY + SideY;
|
|
}
|
|
}
|
|
|
|
void InfoPanel::finit(void)
|
|
{
|
|
if(bml_name)
|
|
bml -> free();
|
|
if(ibs_name)
|
|
ibs -> free();
|
|
}
|
|
|
|
void InfoPanel::free_list(void)
|
|
{
|
|
InfoPanelItem* p,*p1;
|
|
|
|
p = (InfoPanelItem*)items -> last;
|
|
while(p){
|
|
p1 = (InfoPanelItem*)p -> prev;
|
|
items -> dconnect((iListElement*)p);
|
|
item_pool -> connect((iListElement*)p);
|
|
p = p1;
|
|
}
|
|
items -> init_list();
|
|
}
|
|
|
|
void fncMenu::init(void)
|
|
{
|
|
if(!(flags & FM_SUBMENU)){
|
|
if(bml_name){
|
|
if(!bml) bml = new bmlObject;
|
|
bml -> load(bml_name);
|
|
bml -> OffsX = (short)PosX;
|
|
bml -> OffsY = (short)PosY;
|
|
bml -> change_color(0, aciCurColorScheme[ACI_BACK_COL]);
|
|
}
|
|
if(ibs_name){
|
|
if(!ibs) ibs = new ibsObject;
|
|
ibs -> load(ibs_name);
|
|
ibs -> PosX = (short)PosX;
|
|
ibs -> PosY = (short)PosY;
|
|
ibs -> CenterX = ibs -> PosX + ibs -> SideX;
|
|
ibs -> CenterY = ibs -> PosY + ibs -> SideY;
|
|
}
|
|
}
|
|
init_objects();
|
|
}
|
|
|
|
void fncMenu::init_objects(void)
|
|
{
|
|
int i,sx = 0;
|
|
fncMenuItem* p;
|
|
|
|
p = (fncMenuItem*)items -> first;
|
|
for(i = 0; i < items -> Size; i ++){
|
|
p -> init();
|
|
p -> PosX = (SizeX - p -> SizeX)/2;
|
|
if(flags & FM_NO_ALIGN && sx < p -> SizeX) sx = p -> SizeX;
|
|
p = (fncMenuItem*)p -> next;
|
|
}
|
|
|
|
if(flags & FM_NO_ALIGN){
|
|
SizeX = sx;
|
|
p = (fncMenuItem*)items -> first;
|
|
for(i = 0; i < items -> Size; i ++){
|
|
p -> PosX = (SizeX - p -> SizeX)/2;
|
|
p = (fncMenuItem*)p -> next;
|
|
}
|
|
}
|
|
|
|
up_obj -> init();
|
|
up_obj -> PosX = (SizeX - up_obj -> SizeX)/2;
|
|
up_obj -> PosY = FM_OFFSET;
|
|
|
|
down_obj -> init();
|
|
down_obj -> PosX = (SizeX - down_obj -> SizeX)/2;
|
|
down_obj -> PosY = SizeY - down_obj -> SizeY - FM_OFFSET;
|
|
}
|
|
|
|
void fncMenu::finit(void)
|
|
{
|
|
if(!(flags & FM_SUBMENU)){
|
|
if(bml_name){
|
|
bml -> free();
|
|
}
|
|
if(ibs_name){
|
|
ibs -> free();
|
|
}
|
|
}
|
|
}
|
|
|
|
void fncMenuItem::redraw(int bsx,int bsy,unsigned char* buf,int x,int y)
|
|
{
|
|
int col,col_sz;
|
|
#ifdef _ACI_BML_FONTS_
|
|
if(!(flags & FM_RANGE_FONT)){
|
|
if(flags & FM_SELECTED)
|
|
col = (aciCurColorScheme[FM_SELECT_BORDER_COL] << 8) | aciCurColorScheme[FM_SELECT_COL];
|
|
else
|
|
col = (aciCurColorScheme[FM_UNSELECT_BORDER_COL] << 8) | aciCurColorScheme[FM_UNSELECT_COL];
|
|
}
|
|
else {
|
|
if(flags & FM_SELECTED){
|
|
col = aciCurColorScheme[FM_SELECT_START];
|
|
col_sz = aciCurColorScheme[FM_SELECT_SIZE];
|
|
}
|
|
else {
|
|
col = (aciCurColorScheme[FM_SELECT_START] << 16) | aciCurColorScheme[FM_UNSELECT_START];
|
|
col_sz = (aciCurColorScheme[FM_SELECT_SIZE] << 16) | aciCurColorScheme[FM_UNSELECT_SIZE];
|
|
}
|
|
}
|
|
#else
|
|
col = (flags & FM_SELECTED) ? aciCurColorScheme[FM_SELECT_COL] : aciCurColorScheme[FM_UNSELECT_COL];
|
|
#endif
|
|
if(flags & FM_RANGE_FONT)
|
|
aPutStr32(x,y,font,col,col_sz,name,bsx,buf,space);
|
|
else
|
|
aPutStr(x,y,font,col,(unsigned char*)name,bsx,buf,space);
|
|
}
|
|
|
|
void fncMenuItem::redraw_str(int bsx,int bsy,unsigned char* buf,int x,int y,unsigned char* str)
|
|
{
|
|
int col;
|
|
#ifdef _ACI_BML_FONTS_
|
|
col = (aciCurColorScheme[FM_SELECT_BORDER_COL] << 8) | aciCurColorScheme[FM_SELECT_COL];
|
|
#else
|
|
col = aciCurColorScheme[FM_SELECT_COL];
|
|
#endif
|
|
aPutStr(x,y,font,col,str,bsx,buf,space);
|
|
}
|
|
|
|
void fncMenu::redraw(void)
|
|
{
|
|
int i,b_col,sx,sy;
|
|
unsigned char* buf;
|
|
fncMenuItem* p = firstItem;
|
|
iScreenObject* obj;
|
|
|
|
flags &= ~FM_REDRAW;
|
|
if(!(flags & FM_ACTIVE)){
|
|
if(!curFunction && bml){
|
|
bml -> show();
|
|
}
|
|
else
|
|
redraw_fnc(PosX,PosY,SizeX,SizeY,curFunction);
|
|
}
|
|
else {
|
|
init_redraw();
|
|
|
|
if(!iScreenOwner){
|
|
buf = new unsigned char[SizeX * SizeY];
|
|
}
|
|
else {
|
|
if(!(iScreenOwner -> flags & EL_DATA_LOADED))
|
|
return;
|
|
obj = (iScreenObject*)iScreenOwner -> owner;
|
|
obj -> flags |= OBJ_MUST_REDRAW;
|
|
if(!bCol)
|
|
obj -> flags |= OBJ_CLEAR_FON;
|
|
buf = (unsigned char*)iScreenOwner -> fdata;
|
|
|
|
sx = iScreenOwner -> SizeX;
|
|
sy = iScreenOwner -> SizeY;
|
|
}
|
|
|
|
if(!(flags & FM_NO_ALIGN)){
|
|
b_col = (bCol == -1) ? aciCurColorScheme[ACI_BACK_COL] : bCol;
|
|
memset(buf,b_col,SizeX * SizeY);
|
|
}
|
|
|
|
if(items -> Size){
|
|
if(prefix){
|
|
curItem -> redraw_str(SizeX,SizeY,buf,PrefixX,PrefixY,prefix);
|
|
if(postfix)
|
|
curItem -> redraw_str(SizeX,SizeY,buf,PrefixX + PrefixSX + curItem -> SizeX + FM_PREFIX_DELTA * 2,PrefixY,postfix);
|
|
}
|
|
if(VItems < items -> Size){
|
|
if(flags & FM_RANGE_FONT){
|
|
up_obj -> flags |= FM_RANGE_FONT;
|
|
down_obj -> flags |= FM_RANGE_FONT;
|
|
}
|
|
if(!(flags & FM_NO_ALIGN)){
|
|
up_obj -> redraw(SizeX,SizeY,buf,up_obj -> PosX + PrefixDelta,up_obj -> PosY);
|
|
down_obj -> redraw(SizeX,SizeY,buf,down_obj -> PosX + PrefixDelta,down_obj -> PosY);
|
|
}
|
|
else {
|
|
up_obj -> redraw(sx,sy,buf,up_obj -> PosX + PrefixDelta + PosX,up_obj -> PosY + PosY);
|
|
down_obj -> redraw(sx,sy,buf,down_obj -> PosX + PrefixDelta + PosX,down_obj -> PosY + PosY);
|
|
}
|
|
}
|
|
if(!(flags & FM_NO_ALIGN)){
|
|
for(i = 0; i < VItems; i ++){
|
|
if(p == curItem)
|
|
p -> flags |= FM_SELECTED;
|
|
else
|
|
p -> flags &= ~FM_SELECTED;
|
|
|
|
p -> redraw(SizeX,SizeY,buf,p -> PosX + PrefixDelta,p -> PosY);
|
|
p = (fncMenuItem*)p -> next;
|
|
if(p == firstItem) i = VItems;
|
|
}
|
|
}
|
|
else {
|
|
for(i = 0; i < VItems; i ++){
|
|
if(p == curItem)
|
|
p -> flags |= FM_SELECTED;
|
|
else
|
|
p -> flags &= ~FM_SELECTED;
|
|
|
|
p -> redraw(sx,sy,buf,p -> PosX + PrefixDelta + PosX,p -> PosY + PosY);
|
|
p = (fncMenuItem*)p -> next;
|
|
if(p == firstItem) i = VItems;
|
|
}
|
|
}
|
|
if(!iScreenOwner){
|
|
XGR_PutSpr(PosX,PosY,SizeX,SizeY,buf,XGR_BLACK_FON);
|
|
delete[] buf;
|
|
}
|
|
}
|
|
}
|
|
if(ibs) ibs -> show();
|
|
|
|
if(flags & FM_OFF){
|
|
flags &= ~(FM_ACTIVE | FM_OFF);
|
|
}
|
|
}
|
|
|
|
void InfoPanel::redraw(void)
|
|
{
|
|
int i,x,y,fnt,col,col1 = 0,col_sz,tmp1,tmp2;
|
|
unsigned char* buf;
|
|
iScreenObject* obj;
|
|
InfoPanelItem* p = (InfoPanelItem*)items -> first;
|
|
|
|
if(!iScreenOwner){
|
|
buf = new unsigned char[SizeX * SizeY];
|
|
}
|
|
else {
|
|
if(!(iScreenOwner -> flags & EL_DATA_LOADED))
|
|
return;
|
|
obj = (iScreenObject*)iScreenOwner -> owner;
|
|
obj -> flags |= OBJ_MUST_REDRAW;
|
|
if(!bCol)
|
|
obj -> flags |= OBJ_CLEAR_FON;
|
|
buf = (unsigned char*)iScreenOwner -> fdata;
|
|
}
|
|
|
|
int b_col = (bCol == -1) ? aciCurColorScheme[ACI_BACK_COL] : bCol;
|
|
memset(buf,b_col,SizeX * SizeY);
|
|
|
|
if(!(flags & IP_RANGE_FONT))
|
|
y = OffsY + ((SizeY - items -> Size * (aScrFonts[font] -> SizeY + vSpace)) >> 1);
|
|
else
|
|
y = OffsY + ((SizeY - items -> Size * (aScrFonts32[font] -> SizeY + vSpace)) >> 1);
|
|
|
|
for(i = 0; i < items -> Size; i ++){
|
|
if(p -> font == -1)
|
|
fnt = font;
|
|
else
|
|
fnt = p -> font;
|
|
|
|
#ifdef _ACI_BML_FONTS_
|
|
col1 = (aciCurColorScheme[FM_SELECT_BORDER_COL] << 8) | aciCurColorScheme[FM_SELECT_COL];
|
|
if(p -> color == -1){
|
|
if(!(flags & IP_RANGE_FONT)){
|
|
col = (aciCurColorScheme[FM_UNSELECT_BORDER_COL] << 8) | aciCurColorScheme[FM_UNSELECT_COL];
|
|
col |= (col1 << 16);
|
|
}
|
|
else {
|
|
col = (aciCurColorScheme[FM_SELECT_START] << 16) | aciCurColorScheme[FM_UNSELECT_START];
|
|
col_sz = (aciCurColorScheme[FM_SELECT_SIZE] << 16) | aciCurColorScheme[FM_UNSELECT_SIZE];
|
|
}
|
|
}
|
|
else {
|
|
if(!(flags & IP_RANGE_FONT)){
|
|
col = col1;
|
|
}
|
|
else {
|
|
if(p -> color & (~0xFFFF)){
|
|
tmp1 = p -> color & 0xFF;
|
|
tmp2 = (p -> color >> 8) & 0xFF;
|
|
col = (tmp2 << 16) | tmp1;
|
|
|
|
tmp1 = (p -> color >> 16) & 0xFF;
|
|
tmp2 = (p -> color >> 24) & 0xFF;
|
|
col_sz = (tmp2 << 16) | tmp1;
|
|
}
|
|
else {
|
|
col = (aciCurColorScheme[FM_SELECT_START] << 16) | aciCurColorScheme[FM_SELECT_START];
|
|
col_sz = (aciCurColorScheme[FM_SELECT_SIZE] << 16) | aciCurColorScheme[FM_SELECT_SIZE];
|
|
}
|
|
}
|
|
}
|
|
#else
|
|
if(p -> color == -1)
|
|
col = aciCurColorScheme[FM_UNSELECT_COL];
|
|
else
|
|
col = aciCurColorScheme[FM_SELECT_COL];
|
|
#endif
|
|
|
|
if(flags & IP_NO_ALIGN){
|
|
x = OffsX;
|
|
}
|
|
else {
|
|
if(!(flags & IP_RANGE_FONT))
|
|
x = OffsX + ((SizeX - aStrLen((unsigned char*)p->ID_ptr.c_str(), font,hSpace)) >> 1);
|
|
else
|
|
x = OffsX + ((SizeX - aStrLen32((void*)p->ID_ptr.c_str(), font,hSpace)) >> 1);
|
|
}
|
|
if(y < 0) ErrH.Abort("InfoPanel overflow...");
|
|
if(!(flags & IP_RANGE_FONT)){
|
|
aPutStr(x,y,fnt,col,(unsigned char*)p->ID_ptr.c_str(),SizeX,buf,hSpace);
|
|
}
|
|
else {
|
|
aPutStr32(x,y,fnt,col,col_sz, (void*)p->ID_ptr.c_str(),SizeX,buf,hSpace);
|
|
}
|
|
|
|
if(!(flags & IP_RANGE_FONT))
|
|
y += aScrFonts[font] -> SizeY + vSpace;
|
|
else
|
|
y += aScrFonts32[font] -> SizeY + vSpace;
|
|
|
|
p = (InfoPanelItem*)p -> next;
|
|
}
|
|
if(!iScreenOwner){
|
|
XGR_PutSpr(PosX,PosY,SizeX,SizeY,buf,XGR_BLACK_FON);
|
|
delete[] buf;
|
|
}
|
|
|
|
if(ibs) ibs -> show();
|
|
flags &= ~IP_REDRAW;
|
|
}
|
|
|
|
void fncMenu::flush(void)
|
|
{
|
|
if(iScreenOwner) return;
|
|
|
|
if(bml)
|
|
XGR_Flush(bml -> OffsX,bml -> OffsY,bml -> SizeX,bml -> SizeY);
|
|
else
|
|
XGR_Flush(PosX,PosY,SizeX,SizeY);
|
|
flags &= ~FM_FLUSH;
|
|
}
|
|
|
|
void InfoPanel::flush(void)
|
|
{
|
|
if(iScreenOwner) return;
|
|
|
|
if(bml)
|
|
XGR_Flush(bml -> OffsX,bml -> OffsY,bml -> SizeX,bml -> SizeY);
|
|
else
|
|
XGR_Flush(PosX,PosY,SizeX,SizeY);
|
|
flags &= ~IP_FLUSH;
|
|
}
|
|
|
|
void aButton::flush(void)
|
|
{
|
|
XGR_Flush(PosX,PosY,SizeX,SizeY);
|
|
flags &= ~B_FLUSH;
|
|
}
|
|
|
|
aKeyObj::aKeyObj(void)
|
|
{
|
|
codes = new iList;
|
|
}
|
|
|
|
aKeyObj::~aKeyObj(void)
|
|
{
|
|
iScanCode* p,*p1;
|
|
p = (iScanCode*)codes -> last;
|
|
while(p){
|
|
p1 = (iScanCode*)p -> prev;
|
|
delete p;
|
|
p = p1;
|
|
}
|
|
delete codes;
|
|
}
|
|
|
|
void aKeyObj::free_list(void)
|
|
{
|
|
iScanCode* p,*p1;
|
|
p = (iScanCode*)codes -> last;
|
|
while(p){
|
|
p1 = (iScanCode*)p -> prev;
|
|
delete p;
|
|
p = p1;
|
|
}
|
|
codes -> init_list();
|
|
}
|
|
|
|
int aKeyObj::check(int k)
|
|
{
|
|
iScanCode* p = (iScanCode*)codes -> last;
|
|
while(p){
|
|
if(p -> code == k)
|
|
return 1;
|
|
p = (iScanCode*)p -> prev;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
void aKeyObj::add_key(int k)
|
|
{
|
|
iScanCode* p = new iScanCode;
|
|
p -> code = k;
|
|
codes -> connect((iListElement*)p);
|
|
}
|
|
|
|
void actIntDispatcher::KeyQuant(void)
|
|
{
|
|
int k;
|
|
aButton* bt;
|
|
fncMenu* m;
|
|
|
|
aciBitmapMenu* bm;
|
|
|
|
#ifdef _DEBUG
|
|
int i;
|
|
invMatrix* temp;
|
|
invItem* temp_item;
|
|
|
|
XBuffer* shotBufBMP;
|
|
XBuffer* shotBufPAL;
|
|
#endif
|
|
|
|
if(aciKeyboardLocked && !(flags & AS_CHAT_MODE)) return;
|
|
|
|
if(flags & AS_LOCKED){
|
|
if(flags & AS_CHAT_MODE){
|
|
while(KeyBuf -> size) iChatKeyQuant(KeyBuf -> get());
|
|
if(flags & aMS_LEFT_PRESS || flags & aMS_RIGHT_PRESS){
|
|
iChatMouseQuant(XGR_MouseObj.PosX + XGR_MouseObj.SpotX,XGR_MouseObj.PosY + XGR_MouseObj.SpotY,1);
|
|
}
|
|
}
|
|
flags &= ~aMS_PRESS;
|
|
KeyBuf -> clear();
|
|
return;
|
|
}
|
|
|
|
if(flags & AS_FULLSCR)
|
|
flags &= ~aMS_PRESS;
|
|
|
|
inv_mouse_move_quant();
|
|
|
|
if(flags & aMS_MOVED){
|
|
flags &= ~aMS_MOVED;
|
|
if(curMode == AS_INFO_MODE){
|
|
m = (fncMenu*)menuList -> last;
|
|
while(m){
|
|
if(!(m -> flags & FM_HIDDEN) && m -> check_xy(iMouseX,iMouseY)){
|
|
if(m -> flags & FM_ACTIVE){
|
|
m -> change(iMouseX,iMouseY,1);
|
|
}
|
|
}
|
|
m = (fncMenu*)m -> prev;
|
|
}
|
|
}
|
|
}
|
|
|
|
if(flags & aMS_PRESS){
|
|
if(flags & aMS_LEFT_PRESS){
|
|
flags &= ~aMS_LEFT_PRESS;
|
|
|
|
if(!(flags & AS_INV_MOVE_ITEM)){
|
|
bt = (aButton*)intButtons -> last;
|
|
while(bt){
|
|
if(!(bt -> flags & B_ACTIVE)){
|
|
if(bt -> check_xy(iMouseX,iMouseY)){
|
|
bt -> press();
|
|
SOUND_SELECT();
|
|
send_event(bt -> eventCode,bt -> eventData);
|
|
}
|
|
}
|
|
bt = (aButton*)bt -> prev;
|
|
}
|
|
}
|
|
switch(curMode){
|
|
case AS_INV_MODE:
|
|
if(!(flags & AS_INV_MOVE_ITEM)){
|
|
bt = (aButton*)invButtons -> last;
|
|
while(bt){
|
|
if(!(bt -> flags & B_ACTIVE)){
|
|
if(bt -> check_xy(iMouseX,iMouseY)){
|
|
bt -> press();
|
|
SOUND_SELECT();
|
|
send_event(bt -> eventCode,bt -> eventData);
|
|
}
|
|
}
|
|
bt = (aButton*)bt -> prev;
|
|
}
|
|
}
|
|
inv_mouse_quant_l();
|
|
break;
|
|
case AS_INFO_MODE:
|
|
bt = (aButton*)infButtons -> last;
|
|
while(bt){
|
|
if(!(bt -> flags & B_ACTIVE)){
|
|
if(bt -> check_xy(iMouseX,iMouseY)){
|
|
bt -> press();
|
|
SOUND_SELECT();
|
|
send_event(bt -> eventCode,bt -> eventData);
|
|
}
|
|
}
|
|
bt = (aButton*)bt -> prev;
|
|
}
|
|
m = (fncMenu*)menuList -> last;
|
|
while(m){
|
|
if(!(m -> flags & FM_HIDDEN) && !(m -> flags & FM_LOCK) && m -> check_xy(iMouseX,iMouseY)){
|
|
if(m -> flags & FM_ACTIVE){
|
|
if(m -> change(iMouseX,iMouseY)){
|
|
init_menus();
|
|
if(!(m -> flags & FM_SUBMENU)){
|
|
init_submenu(m);
|
|
m -> curCount = m -> activeCount;
|
|
}
|
|
SOUND_SELECT();
|
|
}
|
|
}
|
|
else {
|
|
if(m -> curFunction == FMENU_CAMERAS){
|
|
bm = get_bmenu(BMENU_CAMERAS_MENU);
|
|
if(!bm) return;
|
|
bm -> change(iMouseX - m -> PosX,iMouseY - m -> PosY);
|
|
}
|
|
else {
|
|
if(!m -> trigger && !(m -> flags & FM_SUBMENU)){
|
|
if(!(m -> flags & FM_LOCK)){
|
|
m -> flags |= FM_ACTIVE;
|
|
m -> curCount = m -> activeCount;
|
|
m -> set_redraw();
|
|
SOUND_SELECT();
|
|
}
|
|
else {
|
|
m -> flags &= ~FM_LOCK;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
m = (fncMenu*)m -> prev;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
if(flags & aMS_RIGHT_PRESS){
|
|
flags &= ~aMS_RIGHT_PRESS;
|
|
switch(curMode){
|
|
case AS_INV_MODE:
|
|
inv_mouse_quant_r();
|
|
break;
|
|
case AS_INFO_MODE:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
while(KeyBuf -> size){
|
|
k = sdlEventToCode(KeyBuf->get());
|
|
if(flags & AS_TEXT_MODE){
|
|
if(iCheckKeyID(iKEY_SKIP_TEXT,k)){
|
|
if(!ScrTextData -> NextPage()){
|
|
aciTextEndFlag = 1;
|
|
send_event(EV_LEAVE_TEXT_MODE);
|
|
}
|
|
}
|
|
}
|
|
|
|
if(iCheckKeyID(iKEY_FULLSCREEN,k)){
|
|
send_event(EV_FULLSCR_CHANGE);
|
|
}
|
|
|
|
if(NetworkON){
|
|
if(iCheckKeyID(iKEY_FRAG_INFO,k)){
|
|
aciShowFrags();
|
|
}
|
|
if(iCheckKeyID(iKEY_CHAT,k)){
|
|
send_event(EV_ENTER_CHAT);
|
|
}
|
|
}
|
|
|
|
if(!(flags & AS_FULLSCR)){
|
|
if(iCheckKeyID(iKEY_REDUCE_VIEW,k)){
|
|
if(curMode != AS_INV_MODE){
|
|
send_event(EV_CHANGE_SCREEN,1);
|
|
}
|
|
}
|
|
if(iCheckKeyID(iKEY_ENLARGE_VIEW,k)){
|
|
if(curMode != AS_INV_MODE){
|
|
send_event(EV_CHANGE_SCREEN,3);
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
if(iCheckKeyID(iKEY_INVENTORY,k)){
|
|
if(curMode != AS_INV_MODE)
|
|
send_event(EV_SET_MODE,AS_INV_MODE);
|
|
send_event(EV_FULLSCR_CHANGE);
|
|
}
|
|
}
|
|
|
|
if(!NetworkON)
|
|
aciCHandler(k);
|
|
|
|
if(!(flags & AS_FULLSCR)){
|
|
bt = (aButton*)intButtons -> last;
|
|
while(bt){
|
|
if(!(bt -> flags & B_ACTIVE)){
|
|
if(bt -> scankey -> check(k)){
|
|
bt -> press();
|
|
SOUND_SELECT();
|
|
send_event(bt -> eventCode,bt -> eventData);
|
|
}
|
|
}
|
|
bt = (aButton*)bt -> prev;
|
|
}
|
|
switch(curMode){
|
|
case AS_INV_MODE:
|
|
bt = (aButton*)invButtons -> last;
|
|
while(bt){
|
|
if(!(bt -> flags & B_ACTIVE)){
|
|
if(bt -> scankey -> check(k)){
|
|
bt -> press();
|
|
SOUND_SELECT();
|
|
send_event(bt -> eventCode,bt -> eventData);
|
|
}
|
|
}
|
|
bt = (aButton*)bt -> prev;
|
|
}
|
|
break;
|
|
case AS_INFO_MODE:
|
|
bt = (aButton*)infButtons -> last;
|
|
while(bt){
|
|
if(!(bt -> flags & B_ACTIVE)){
|
|
if(bt -> scankey -> check(k)){
|
|
bt -> press();
|
|
SOUND_SELECT();
|
|
send_event(bt -> eventCode,bt -> eventData);
|
|
}
|
|
}
|
|
bt = (aButton*)bt -> prev;
|
|
}
|
|
m = (fncMenu*)menuList -> last;
|
|
while(m){
|
|
if(m -> flags & FM_ACTIVE && m -> up_key -> check(k)){
|
|
m -> step_up();
|
|
m -> set_redraw();
|
|
SOUND_SELECT();
|
|
}
|
|
if(m -> flags & FM_ACTIVE && m -> down_key -> check(k)){
|
|
m -> step_down();
|
|
m -> set_redraw();
|
|
SOUND_SELECT();
|
|
}
|
|
m = (fncMenu*)m -> prev;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
m = (fncMenu*)menuList -> last;
|
|
while(m){
|
|
m -> flags &= ~FM_LOCK;
|
|
m = (fncMenu*)m -> prev;
|
|
}
|
|
}
|
|
|
|
void actIntDispatcher::iKeyQuant(void)
|
|
{
|
|
fncMenu* m;
|
|
if(flags & AS_ISCREEN_INV_MODE){
|
|
inv_mouse_imove_quant();
|
|
if(flags & aMS_MOVED){
|
|
flags &= ~aMS_MOVED;
|
|
m = (fncMenu*)i_menuList -> last;
|
|
while(m){
|
|
if(!(m -> flags & FM_HIDDEN) && m -> check_xy(iMouseX,iMouseY)){
|
|
if(m -> flags & FM_ACTIVE){
|
|
m -> change(iMouseX,iMouseY,1);
|
|
if(m -> type == SHOP_ITEMS_MENU_ID)
|
|
aciSetShopItem(m -> curFunction);
|
|
}
|
|
}
|
|
m = (fncMenu*)m -> prev;
|
|
}
|
|
}
|
|
if(flags & aMS_PRESS){
|
|
if(flags & aMS_LEFT_PRESS){
|
|
flags &= ~aMS_LEFT_PRESS;
|
|
inv_mouse_quant_l();
|
|
}
|
|
if(flags & aMS_RIGHT_PRESS){
|
|
flags &= ~aMS_RIGHT_PRESS;
|
|
inv_mouse_quant_r();
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
if(flags & aMS_MOVED){
|
|
flags &= ~aMS_MOVED;
|
|
m = (fncMenu*)menuList -> last;
|
|
while(m){
|
|
if(!(m -> flags & FM_HIDDEN) && m -> check_xy(iMouseX,iMouseY)){
|
|
if(m -> flags & FM_ACTIVE){
|
|
m -> change(iMouseX,iMouseY,1);
|
|
}
|
|
}
|
|
m = (fncMenu*)m -> prev;
|
|
}
|
|
if(iMouseLPressFlag){
|
|
if(qMenu && qMenu -> flags & FMC_DATA_INIT && qMenu -> check_xy(iMouseX,iMouseY) && qMenu -> check_xy(iMousePrevX,iMousePrevY)){
|
|
qMenu -> shift((iMouseX - iMousePrevX) * 4);
|
|
}
|
|
}
|
|
}
|
|
if(flags & aMS_PRESS){
|
|
if(flags & aMS_LEFT_PRESS){
|
|
if(qMenu && qMenu -> flags & FMC_DATA_INIT){
|
|
qMenu -> key_trap(iMouseX,iMouseY);
|
|
}
|
|
m = (fncMenu*)i_menuList -> last;
|
|
while(m){
|
|
if(m -> check_xy(iMouseX,iMouseY)){
|
|
if(m -> flags & FM_ACTIVE){
|
|
m -> change(iMouseX,iMouseY);
|
|
SOUND_SELECT();
|
|
}
|
|
}
|
|
m = (fncMenu*)m -> prev;
|
|
}
|
|
flags &= ~aMS_LEFT_PRESS;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void actIntDispatcher::iKeyTrap(int cd)
|
|
{
|
|
fncMenu* m;
|
|
if(!NetworkON) aciCHandler(cd);
|
|
if(!(flags & AS_ISCREEN_INV_MODE)){
|
|
m = (fncMenu*)i_menuList -> last;
|
|
while(m){
|
|
if(m -> flags & FM_LOCATION_MENU && m -> flags & FM_ACTIVE && m -> up_key -> check(cd)){
|
|
m -> step_up();
|
|
m -> set_redraw();
|
|
SOUND_SELECT();
|
|
}
|
|
if(m -> flags & FM_ACTIVE && m -> down_key -> check(cd)){
|
|
m -> step_down();
|
|
m -> set_redraw();
|
|
SOUND_SELECT();
|
|
}
|
|
m = (fncMenu*)m -> prev;
|
|
}
|
|
}
|
|
}
|
|
|
|
void actIntDispatcher::send_event(int cd,int dt,actintItemData* p)
|
|
{
|
|
if(cd == EV_CHANGE_MODE || cd == EV_SET_MODE){
|
|
if(!(flags & AS_CHANGE_MODE)){
|
|
flags |= AS_CHANGE_MODE;
|
|
events -> put(cd,dt,p);
|
|
}
|
|
}
|
|
else
|
|
events -> put(cd,dt,p);
|
|
}
|
|
|
|
void actIntDispatcher::EventQuant(void)
|
|
{
|
|
actEvent* p;
|
|
fncMenu* m;
|
|
calc_load();
|
|
aciSetTimePanel();
|
|
aciCurFrame ++;
|
|
|
|
// aciUpdateCurCredits(aciCurCredits);
|
|
|
|
if(aciItmTextQueueSize && !(flags & AS_TEXT_MODE)) aciReadItmText();
|
|
|
|
if(iChatExit){
|
|
iChatExit = 0;
|
|
send_event(EV_LEAVE_CHAT);
|
|
}
|
|
|
|
aciTextColBright += aciTextColBrightDelta;
|
|
if(aciTextColBright < 0){
|
|
aciTextColBright = 0;
|
|
aciTextColBrightDelta = 1;
|
|
}
|
|
if(aciTextColBright > 64){
|
|
aciTextColBright = 64;
|
|
aciTextColBrightDelta = -1;
|
|
}
|
|
|
|
if(wMap){
|
|
wMap -> quant();
|
|
}
|
|
|
|
while(events -> size){
|
|
p = events -> get();
|
|
switch(p -> code){
|
|
case EV_NEXT_PHRASE:
|
|
aciNextPhrase();
|
|
break;
|
|
case EV_CHANGE_MODE:
|
|
change_mode();
|
|
break;
|
|
case EV_SET_MODE:
|
|
if(p -> data != curMode)
|
|
change_mode();
|
|
break;
|
|
case EV_ACTIVATE_MENU:
|
|
if(curMode == AS_INFO_MODE){
|
|
m = get_menu(p -> data);
|
|
if(!m)
|
|
ErrH.Abort("Bad event data...");
|
|
if(m -> trigger){
|
|
if(m -> trigger -> flags & B_PRESSED)
|
|
m -> flags &= ~FM_ACTIVE;
|
|
else
|
|
m -> flags |= FM_ACTIVE;
|
|
}
|
|
else
|
|
m -> flags ^= FM_ACTIVE;
|
|
m -> curItem = m -> get_fnc_item(m -> curFunction);
|
|
if(m -> VItems < m -> items -> Size)
|
|
m -> firstItem = m -> curItem;
|
|
else
|
|
m -> firstItem = (fncMenuItem*)m -> items -> first;
|
|
|
|
m -> set_redraw();
|
|
}
|
|
break;
|
|
case ACI_PUT_ITEM:
|
|
put_item(p -> ptr);
|
|
break;
|
|
case ACI_DROP_ITEM:
|
|
remove_item(p -> ptr);
|
|
break;
|
|
case EV_CHANGE_SCREEN:
|
|
if(curScrMode != p -> data){
|
|
prevScrMode = curScrMode;
|
|
curScrMode = p -> data;
|
|
change_screen(p -> data);
|
|
}
|
|
break;
|
|
case EV_FULLSCR_CHANGE:
|
|
flags ^= AS_FULLSCR;
|
|
if(flags & AS_FULLSCR){
|
|
set_fullscreen(true);
|
|
}
|
|
else {
|
|
flags &= ~AS_TEXT_MODE;
|
|
set_fullscreen(false);
|
|
}
|
|
break;
|
|
case EV_ACTIVATE_IINV:
|
|
flags |= AS_ISCREEN_INV_MODE;
|
|
break;
|
|
case EV_DEACTIVATE_IINV:
|
|
flags &= ~AS_ISCREEN_INV_MODE;
|
|
break;
|
|
case EV_ACTIVATE_MATRIX:
|
|
secondMatrix = alloc_matrix(aci_SecondMatrixID,1);
|
|
secondMatrix -> ScreenX += 400;
|
|
if(curMatrix){
|
|
backupMatrix = alloc_matrix(curMatrix -> type,1);
|
|
curMatrix -> backup(backupMatrix);
|
|
}
|
|
aciShowScMatrix();
|
|
break;
|
|
case EV_DEACTIVATE_MATRIX:
|
|
aciBuyItem();
|
|
aciSwapMatrices();
|
|
aciInitShopAvi();
|
|
break;
|
|
case EV_EVINCE_PALETTE:
|
|
flags |= AS_EVINCE_PALETTE;
|
|
break;
|
|
case EV_INIT_MATRIX_OBJ:
|
|
aci_setMatrixBorder();
|
|
aci_setScMatrixBorder();
|
|
break;
|
|
case EV_INIT_SC_MATRIX_OBJ:
|
|
aci_setScMatrixBorder();
|
|
break;
|
|
case EV_REDRAW:
|
|
flags &= ~AS_FULL_REDRAW;
|
|
break;
|
|
case EV_CANCEL_MATRIX:
|
|
aciCancelMatrix();
|
|
break;
|
|
case EV_AUTO_MOVE_ITEMS:
|
|
aciAutoMoveItems();
|
|
break;
|
|
case EV_SET_MECH_NAME:
|
|
aciSetMechName();
|
|
break;
|
|
case EV_NEXT_SHOP_AVI:
|
|
aciNextShopItem();
|
|
aciInitShopAvi();
|
|
break;
|
|
case EV_PREV_SHOP_AVI:
|
|
aciPrevShopItem();
|
|
aciInitShopAvi();
|
|
break;
|
|
case EV_CHANGE_AVI_LIST:
|
|
aciChangeList();
|
|
aciInitShopAvi();
|
|
break;
|
|
case EV_BUY_ITEM:
|
|
aciBuyItem();
|
|
aciInitShopAvi();
|
|
break;
|
|
case EV_SET_ITM_PICKUP:
|
|
aciPickupItems ^= 1;
|
|
break;
|
|
case EV_SET_WPN_PICKUP:
|
|
aciPickupDevices ^= 1;
|
|
break;
|
|
case EV_ACTIVATE_SHOP_MENU:
|
|
aciInitShopList();
|
|
break;
|
|
case EV_CHOOSE_SHOP_ITEM:
|
|
aciChooseShopItem();
|
|
break;
|
|
case EV_SHOW_QUESTS:
|
|
aciBuildQuestList();
|
|
break;
|
|
case EV_ASK_QUEST:
|
|
aciAskQuestion();
|
|
break;
|
|
case EV_GET_BLOCK_PHRASE:
|
|
aciShowBlockPhrase();
|
|
break;
|
|
case EV_TRY_2_ENTER:
|
|
aciActionEvent();
|
|
break;
|
|
case EV_GET_CIRT:
|
|
aciSendEvent2itmdsp(ACI_ACTIVATE_ITEM,p -> ptr);
|
|
break;
|
|
case ACI_PUT_IN_SLOT:
|
|
put_in_slot(p -> ptr);
|
|
break;
|
|
case EV_GET_ELEECH:
|
|
aciGetEleech();
|
|
break;
|
|
case EV_GET_RUBOX:
|
|
aciGetRubox();
|
|
break;
|
|
case EV_LOCK_ISCREEN:
|
|
iScrDisp -> lock_events();
|
|
break;
|
|
case EV_UNLOCK_ISCREEN:
|
|
iScrDisp -> unlock_events();
|
|
break;
|
|
case EV_ISCR_KEYTRAP:
|
|
iScrDisp -> key_trap(p -> data);
|
|
break;
|
|
case EV_SELL_MOVE_ITEM:
|
|
aciSellMoveItem();
|
|
break;
|
|
case EV_CHANGE_AVI_INDEX:
|
|
aciChangeAviIndex();
|
|
aciInitShopAvi();
|
|
break;
|
|
case EV_START_SPEECH:
|
|
// aciStartSpeech();
|
|
break;
|
|
case EV_TELEPORT:
|
|
if(wMap){
|
|
aciWorldIndex = wMap -> world_ptr[p -> data] -> uvsID;
|
|
aciPrevJumpCount = -1;
|
|
if(!(flags & AS_FULLSCR)){
|
|
flags &= ~AS_TEXT_MODE;
|
|
set_fullscreen(true);
|
|
}
|
|
lock();
|
|
}
|
|
break;
|
|
case EV_INIT_BUTTONS:
|
|
aciInitShopButtons();
|
|
break;
|
|
case EV_ENTER_TEXT_MODE:
|
|
case ACI_SHOW_TEXT:
|
|
if(!(flags & AS_FULLSCR)){
|
|
set_fullscreen(true);
|
|
}
|
|
ScrTextData -> color = aciTEXT_COLOR;
|
|
flags |= AS_TEXT_MODE;
|
|
break;
|
|
case EV_LEAVE_TEXT_MODE:
|
|
case ACI_HIDE_TEXT:
|
|
if(flags & AS_FULLSCR){
|
|
set_fullscreen(false);
|
|
}
|
|
ScrTextData -> clear();
|
|
flags &= ~AS_TEXT_MODE;
|
|
break;
|
|
case ACI_LOCK_INTERFACE:
|
|
if(!(flags & AS_FULLSCR)){
|
|
flags &= ~AS_TEXT_MODE;
|
|
set_fullscreen(true);
|
|
}
|
|
lock();
|
|
break;
|
|
case ACI_UNLOCK_INTERFACE:
|
|
if(flags & AS_FULLSCR){
|
|
set_fullscreen(false);
|
|
}
|
|
unlock(); // logical, functional blocking
|
|
break;
|
|
case EV_PROTRACTOR_EVENT:
|
|
aciProtractorEvent = p -> data;
|
|
break;
|
|
case EV_MECH_MESSIAH_EVENT:
|
|
aciMechMessiahEvent = p -> data;
|
|
break;
|
|
case EV_PAUSE_AML:
|
|
aciML_Pause();
|
|
break;
|
|
case EV_RESUME_AML:
|
|
aciML_Resume();
|
|
break;
|
|
case EV_ENTER_CHAT:
|
|
if(!(flags & AS_FULLSCR)){
|
|
flags &= ~AS_TEXT_MODE;
|
|
set_fullscreen(true);
|
|
}
|
|
lock();
|
|
iChatInit();
|
|
flags |= AS_CHAT_MODE;
|
|
break;
|
|
case EV_ITEM_TEXT:
|
|
aciSendEvent2itmdsp(ACI_SHOW_ITEM_TEXT,p -> ptr);
|
|
break;
|
|
case EV_LEAVE_CHAT:
|
|
if(flags & AS_FULLSCR){
|
|
set_fullscreen(false);
|
|
}
|
|
unlock();
|
|
iChatFinit();
|
|
flags &= ~AS_CHAT_MODE;
|
|
break;
|
|
case EV_INIT_AVI_OBJECT:
|
|
aciInitAviObject();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
void actIntDispatcher::set_fullscreen(bool isEnabled) {
|
|
if(isEnabled){
|
|
flags |= AS_FULLSCR;
|
|
set_map_to_fullscreen();
|
|
XGR_Obj.clear_2d_surface();
|
|
XGR_MouseSetPromptData(NULL);
|
|
XGR_MouseHide();
|
|
} else {
|
|
flags &= ~AS_FULL_REDRAW;
|
|
flags &= ~AS_FULLSCR;
|
|
set_map_to_ibs(curIbs);
|
|
XGR_MouseShow();
|
|
if(curMode == AS_INV_MODE){
|
|
XGR_MouseSetPromptData(invPrompt);
|
|
}
|
|
else {
|
|
if(curMode == AS_INFO_MODE){
|
|
XGR_MouseSetPromptData(infPrompt);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void actIntDispatcher::change_mode(void)
|
|
{
|
|
//std::cout<<"actIntDispatcher::change_mode"<<std::endl;
|
|
aButton* b;
|
|
fncMenu* p;
|
|
switch(curMode){
|
|
case AS_INV_MODE:
|
|
if(flags & AS_INV_MOVE_ITEM) break;
|
|
curMode = AS_INFO_MODE;
|
|
XGR_MouseSetPromptData(infPrompt);
|
|
change_screen(prevScrMode);
|
|
curScrMode = prevScrMode;
|
|
|
|
p = (fncMenu*)menuList -> last;
|
|
while(p){
|
|
p -> set_redraw();
|
|
p -> set_flush();
|
|
p = (fncMenu*)p -> prev;
|
|
}
|
|
b = (aButton*)infButtons -> last;
|
|
while(b){
|
|
b -> set_redraw();
|
|
b -> set_flush();
|
|
b = (aButton*)b -> prev;
|
|
}
|
|
break;
|
|
case AS_INFO_MODE:
|
|
curMode = AS_INV_MODE;
|
|
XGR_MouseSetPromptData(invPrompt);
|
|
prevScrMode = curScrMode;
|
|
curScrMode = INVSCR_MODE;
|
|
change_screen(INVSCR_MODE);
|
|
|
|
curMatrix -> set_redraw();
|
|
curMatrix -> set_flush();
|
|
b = (aButton*)invButtons -> last;
|
|
|
|
while(b){
|
|
b -> set_redraw();
|
|
b -> set_flush();
|
|
b = (aButton*)b -> prev;
|
|
}
|
|
break;
|
|
}
|
|
flags &= ~AS_CHANGE_MODE;
|
|
}
|
|
|
|
void CounterPanel::set_flush(void)
|
|
{
|
|
flags |= CP_FLUSH;
|
|
}
|
|
|
|
void invMatrix::set_flush(void)
|
|
{
|
|
flags |= IM_FLUSH;
|
|
}
|
|
|
|
void fncMenu::set_flush(void)
|
|
{
|
|
flags |= FM_FLUSH;
|
|
}
|
|
|
|
void InfoPanel::set_flush(void)
|
|
{
|
|
flags |= IP_FLUSH;
|
|
}
|
|
|
|
void aButton::set_flush(void)
|
|
{
|
|
flags |= B_FLUSH;
|
|
}
|
|
|
|
void aIndData::set_flush(void)
|
|
{
|
|
flags |= IND_FLUSH;
|
|
}
|
|
|
|
void CounterPanel::set_redraw(void)
|
|
{
|
|
flags |= CP_REDRAW;
|
|
}
|
|
|
|
void invMatrix::set_redraw(void)
|
|
{
|
|
flags |= IM_REDRAW;
|
|
}
|
|
|
|
void fncMenu::set_redraw(void)
|
|
{
|
|
flags |= FM_REDRAW;
|
|
}
|
|
|
|
void InfoPanel::set_redraw(void)
|
|
{
|
|
flags |= IP_REDRAW;
|
|
}
|
|
|
|
void aButton::set_redraw(void)
|
|
{
|
|
flags |= B_REDRAW;
|
|
}
|
|
|
|
void aIndData::set_redraw(void)
|
|
{
|
|
flags |= IND_REDRAW;
|
|
}
|
|
|
|
actEventHeap::actEventHeap(void)
|
|
{
|
|
int i;
|
|
table = new actEvent*[AS_MAX_EVENT];
|
|
mem_heap = new char[AS_MAX_EVENT * sizeof(actEvent)];
|
|
for(i = 0; i < AS_MAX_EVENT; i ++){
|
|
table[i] = (actEvent*)(mem_heap + sizeof(actEvent) * i);
|
|
}
|
|
clear();
|
|
}
|
|
|
|
actEventHeap::~actEventHeap(void)
|
|
{
|
|
delete[] table;
|
|
delete[] mem_heap;
|
|
}
|
|
|
|
void actEventHeap::put(int cd,int dt,actintItemData* p)
|
|
{
|
|
if(size < AS_MAX_EVENT){
|
|
table[last_index] -> code = cd;
|
|
table[last_index] -> data = dt;
|
|
table[last_index] -> ptr = p;
|
|
|
|
last_index ++;
|
|
if(last_index >= AS_MAX_EVENT)
|
|
last_index = 0;
|
|
size ++;
|
|
}
|
|
else
|
|
ErrH.Abort("Event buffer overflow...");
|
|
}
|
|
|
|
actEvent* actEventHeap::get(void)
|
|
{
|
|
actEvent* p;
|
|
if(size){
|
|
p = table[first_index];
|
|
|
|
first_index ++;
|
|
if(first_index >= AS_MAX_EVENT)
|
|
first_index = 0;
|
|
|
|
size --;
|
|
return p;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
void actEventHeap::clear(void)
|
|
{
|
|
size = 0;
|
|
first_index = 0;
|
|
last_index = 0;
|
|
}
|
|
|
|
fncMenu* actIntDispatcher::get_menu(int mn)
|
|
{
|
|
fncMenu* m = (fncMenu*)menuList -> last;
|
|
while(m){
|
|
if(m -> type == mn)
|
|
return m;
|
|
m = (fncMenu*)m -> prev;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
fncMenu* actIntDispatcher::get_imenu(int mn)
|
|
{
|
|
fncMenu* m = (fncMenu*)i_menuList -> last;
|
|
while(m){
|
|
if(m -> type == mn)
|
|
return m;
|
|
m = (fncMenu*)m -> prev;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
void actIntDispatcher::init_menus(void)
|
|
{
|
|
fncMenu* m,*m1;
|
|
fncMenuItem* p,*p1;
|
|
m = (fncMenu*)menuList -> last;
|
|
while(m){
|
|
if(!(m -> flags & FM_SUBMENU)){
|
|
p = (fncMenuItem*)m -> inactive_items -> last;
|
|
while(p){
|
|
p1 = (fncMenuItem*)p -> prev;
|
|
m -> inactive_items -> dconnect((iListElement*)p);
|
|
m -> items -> connect((iListElement*)p);
|
|
p = p1;
|
|
}
|
|
m -> curItem = m -> get_fnc_item(m -> curFunction);
|
|
if(m -> VItems < m -> items -> Size)
|
|
m -> firstItem = m -> curItem;
|
|
else
|
|
m -> firstItem = (fncMenuItem*)m -> items -> first;
|
|
m -> trigger = get_button(m -> trigger_code);
|
|
}
|
|
m = (fncMenu*)m -> prev;
|
|
}
|
|
|
|
m = (fncMenu*)menuList -> last;
|
|
while(m){
|
|
if(!(m -> flags & FM_SUBMENU)){
|
|
p = (fncMenuItem*)m -> items -> last;
|
|
while(p){
|
|
p1 = (fncMenuItem*)p -> prev;
|
|
m1 = (fncMenu*)menuList -> last;
|
|
while(m1){
|
|
if(!(m1 -> flags & FM_SUBMENU)){
|
|
if(m1 != m && m1 -> curFunction && m1 -> curFunction == p -> fnc_code){
|
|
if(m -> curItem == p){
|
|
m -> curItem = (fncMenuItem*)p -> next;
|
|
m -> curFunction = m -> curItem -> fnc_code;
|
|
}
|
|
m -> items -> dconnect((iListElement*)p);
|
|
m -> inactive_items -> connect((iListElement*)p);
|
|
m1 = NULL;
|
|
}
|
|
else
|
|
m1 = (fncMenu*)m1 -> prev;
|
|
}
|
|
else
|
|
m1 = (fncMenu*)m1 -> prev;
|
|
}
|
|
p = p1;
|
|
}
|
|
m -> sort();
|
|
m -> curItem = m -> get_fnc_item(m -> curFunction);
|
|
if(m -> VItems < m -> items -> Size)
|
|
m -> firstItem = m -> curItem;
|
|
else
|
|
m -> firstItem = (fncMenuItem*)m -> items -> first;
|
|
|
|
if(m -> flags & FM_ACTIVE) m -> set_redraw();
|
|
}
|
|
m = (fncMenu*)m -> prev;
|
|
}
|
|
}
|
|
|
|
fncMenuItem* fncMenu::get_fnc_item(int fnc)
|
|
{
|
|
fncMenuItem* p = (fncMenuItem*)items -> last;
|
|
while(p){
|
|
if(p -> fnc_code == fnc)
|
|
return p;
|
|
p = (fncMenuItem*)p -> prev;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
int aButton::check_xy(int x,int y)
|
|
{
|
|
if(x >= PosX && y >= PosY && x <= PosX + SizeX && y <= PosY + SizeY)
|
|
return 1;
|
|
return 0;
|
|
}
|
|
|
|
int fncMenu::check_xy(int x,int y)
|
|
{
|
|
if(x >= PosX && y >= PosY && x <= PosX + SizeX && y <= PosY + SizeY)
|
|
return 1;
|
|
return 0;
|
|
}
|
|
|
|
int fncMenuItem::check_y(int y)
|
|
{
|
|
if(y >= PosY && y <= PosY + SizeY)
|
|
return 1;
|
|
return 0;
|
|
}
|
|
|
|
void fncMenu::step_up(void)
|
|
{
|
|
if(curItem -> prev){
|
|
curItem = (fncMenuItem*)curItem -> prev;
|
|
}
|
|
else {
|
|
curItem = (fncMenuItem*)items -> last;
|
|
}
|
|
|
|
init_redraw();
|
|
while(!(curItem -> flags & FM_VISIBLE)){
|
|
firstItem = (fncMenuItem*)firstItem -> prev;
|
|
if(!firstItem) firstItem = (fncMenuItem*)items -> last;
|
|
init_redraw();
|
|
}
|
|
if(trigger)
|
|
trigger -> curCount = 0;
|
|
|
|
curFunction = curItem -> fnc_code;
|
|
}
|
|
|
|
void fncMenu::step_down(void)
|
|
{
|
|
curItem = (fncMenuItem*)curItem -> next;
|
|
init_redraw();
|
|
while(!(curItem -> flags & FM_VISIBLE)){
|
|
firstItem = (fncMenuItem*)firstItem -> next;
|
|
init_redraw();
|
|
}
|
|
if(trigger)
|
|
trigger -> curCount = 0;
|
|
|
|
curFunction = curItem -> fnc_code;
|
|
}
|
|
|
|
aButton* actIntDispatcher::get_button(int id)
|
|
{
|
|
aButton* p;
|
|
p = (aButton*)intButtons -> last;
|
|
while(p){
|
|
if(p -> ID == id)
|
|
return p;
|
|
p = (aButton*)p -> prev;
|
|
}
|
|
p = (aButton*)invButtons -> last;
|
|
while(p){
|
|
if(p -> ID == id)
|
|
return p;
|
|
p = (aButton*)p -> prev;
|
|
}
|
|
p = (aButton*)infButtons -> last;
|
|
while(p){
|
|
if(p -> ID == id)
|
|
return p;
|
|
p = (aButton*)p -> prev;
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
void fncMenu::init_redraw(void)
|
|
{
|
|
int i,dy = 0,min_y,max_y,max_sy;
|
|
fncMenuItem* p;
|
|
|
|
p = (fncMenuItem*)items -> last;
|
|
if(!p) return;
|
|
while(p){
|
|
p -> flags &= ~FM_VISIBLE;
|
|
p = (fncMenuItem*)p -> prev;
|
|
}
|
|
|
|
if(!prefix){
|
|
p = firstItem;
|
|
for(i = 0; i < VItems; i ++){
|
|
p -> flags |= FM_VISIBLE;
|
|
p -> PosY = dy;
|
|
dy += p -> SizeY + p -> space;
|
|
p = (fncMenuItem*)p -> next;
|
|
if(p == firstItem) i = VItems;
|
|
}
|
|
itemY = (SizeY - dy) / 2;
|
|
|
|
p = firstItem;
|
|
for(i = 0; i < VItems; i ++){
|
|
p -> PosY += itemY;
|
|
p = (fncMenuItem*)p -> next;
|
|
if(p == firstItem) i = VItems;
|
|
}
|
|
}
|
|
else {
|
|
curItem -> PosY = PrefixY;
|
|
curItem -> flags |= FM_VISIBLE;
|
|
if(items -> Size > 2){
|
|
if(curItem -> prev)
|
|
p = (fncMenuItem*)curItem -> prev;
|
|
else
|
|
p = (fncMenuItem*)items -> last;
|
|
|
|
p -> PosY = curItem -> PosY - (p -> space + p -> SizeY);
|
|
p -> flags |= FM_VISIBLE;
|
|
|
|
firstItem = p;
|
|
p = (fncMenuItem*)curItem -> next;
|
|
p -> PosY = curItem -> PosY + (curItem -> space + curItem -> SizeY);
|
|
p -> flags |= FM_VISIBLE;
|
|
}
|
|
else {
|
|
if(items -> Size == 2){
|
|
firstItem = curItem;
|
|
p = (fncMenuItem*)curItem -> next;
|
|
p -> PosY = curItem -> PosY + (curItem -> space + curItem -> SizeY);
|
|
p -> flags |= FM_VISIBLE;
|
|
}
|
|
}
|
|
}
|
|
p = firstItem;
|
|
min_y = max_y = p -> PosY;
|
|
max_sy = p -> SizeY;
|
|
for(i = 0; i < VItems; i ++){
|
|
if(min_y > p -> PosY)
|
|
min_y = p -> PosY;
|
|
if(max_y < p -> PosY){
|
|
max_y = p -> PosY;
|
|
max_sy = p -> SizeY;
|
|
}
|
|
p = (fncMenuItem*)p -> next;
|
|
if(p == firstItem) i = VItems;
|
|
}
|
|
up_obj -> PosY = min_y - ACI_ARROW_OFFS_UP - up_obj -> SizeY;
|
|
down_obj -> PosY = max_y + ACI_ARROW_OFFS_DOWN + max_sy;
|
|
}
|
|
|
|
int fncMenu::change(int x,int y,int mode)
|
|
{
|
|
fncMenuItem* p;
|
|
|
|
x -= PosX;
|
|
y -= PosY;
|
|
|
|
up_obj -> flags &= ~FM_SELECTED;
|
|
down_obj -> flags &= ~FM_SELECTED;
|
|
|
|
init_redraw();
|
|
if(items -> Size > VItems){
|
|
if(x >= 0 && x < SizeX && up_obj -> check_y(y)){
|
|
if(!mode)
|
|
step_up();
|
|
up_obj -> flags |= FM_SELECTED;
|
|
set_redraw();
|
|
if(prefix) set_prefix(prefix);
|
|
init_redraw();
|
|
curCount = activeCount;
|
|
return 0;
|
|
}
|
|
if(x >= 0 && x < SizeX && down_obj -> check_y(y)){
|
|
if(!mode)
|
|
step_down();
|
|
down_obj -> flags |= FM_SELECTED;
|
|
set_redraw();
|
|
if(prefix) set_prefix(prefix);
|
|
init_redraw();
|
|
curCount = activeCount;
|
|
return 0;
|
|
}
|
|
}
|
|
p = (fncMenuItem*)items -> last;
|
|
while(p){
|
|
if(p -> flags & FM_VISIBLE && p -> check_y(y)){
|
|
curItem = p;
|
|
curFunction = p -> fnc_code;
|
|
if(!mode){
|
|
if(!(flags & FM_NO_DEACTIVATE) && !(flags & FM_SUBMENU))
|
|
flags &= ~FM_ACTIVE;
|
|
if(trigger)
|
|
trigger -> press();
|
|
}
|
|
if(prefix) set_prefix(prefix);
|
|
set_redraw();
|
|
init_redraw();
|
|
|
|
if(flags & FM_SUBMENU){
|
|
if(!mode){
|
|
aciHandleSubmenuEvent(type,curItem);
|
|
if(flags & FM_ITEM_MENU || curFunction == FMENU_OFF){
|
|
go2upmenu();
|
|
return 1;
|
|
}
|
|
}
|
|
curCount = activeCount;
|
|
}
|
|
return 1;
|
|
}
|
|
p = (fncMenuItem*)p -> prev;
|
|
}
|
|
|
|
if(!mode){
|
|
if(flags & FM_SUBMENU){
|
|
go2upmenu();
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
void actIntDispatcher::init_submenu(fncMenu* m)
|
|
{
|
|
char* ptr;
|
|
|
|
fncMenu* p = NULL;
|
|
aciBitmapMenu* bm = NULL;
|
|
|
|
if(!m -> curItem) return;
|
|
|
|
if(m -> curItem -> flags & FM_SUBMENU_ITEM){
|
|
p = get_menu(m -> curItem -> submenuID);
|
|
if(!p) ErrH.Abort("init_submenu() failed...");
|
|
|
|
if(m -> curItem -> submenuID == FMENU_TELEPORT_MENU)
|
|
p -> curFunction = FMENU_OFF;
|
|
|
|
m -> init_submenu(p);
|
|
p -> init_curItem();
|
|
p -> curCount = p -> activeCount;
|
|
p -> flags |= FM_LOCK;
|
|
|
|
if(p -> VItems < p -> items -> Size)
|
|
p -> firstItem = p -> curItem;
|
|
else
|
|
p -> firstItem = (fncMenuItem*)p -> items -> first;
|
|
}
|
|
else {
|
|
if(m -> curItem -> flags & FM_BSUBMENU_ITEM){
|
|
bm = get_bmenu(m -> curItem -> submenuID);
|
|
bm -> upMenu = (iListElement*)m;
|
|
if(bm -> activeCount)
|
|
bm -> curCount = bm -> activeCount;
|
|
}
|
|
}
|
|
|
|
switch(m -> curFunction){
|
|
case FMENU_TARGETS:
|
|
if(!p) return;
|
|
ptr = GetCompasTarget();
|
|
if(!ptr)
|
|
p -> curItem = p -> get_obj(aciSTR_OFF);
|
|
else
|
|
p -> curItem = p -> get_obj(ptr);
|
|
|
|
if(p -> VItems < p -> items -> Size)
|
|
p -> firstItem = p -> curItem;
|
|
else
|
|
p -> firstItem = (fncMenuItem*)p -> items -> first;
|
|
break;
|
|
}
|
|
}
|
|
|
|
void fncMenu::init_submenu(fncMenu* p)
|
|
{
|
|
p -> PosX = PosX;
|
|
p -> PosY = PosY;
|
|
|
|
p -> SizeX = SizeX;
|
|
p -> SizeY = SizeY;
|
|
|
|
p -> ibs = ibs;
|
|
p -> bml = bml;
|
|
|
|
p -> flags |= FM_ACTIVE;
|
|
p -> set_redraw();
|
|
|
|
p -> upMenu = this;
|
|
subMenu = p;
|
|
|
|
flags |= FM_HIDDEN;
|
|
}
|
|
|
|
void fncMenu::sort(void)
|
|
{
|
|
int flag = 1;
|
|
fncMenuItem* n,*p,*tmp;
|
|
while(flag){
|
|
flag = 0;
|
|
n = (fncMenuItem*)items -> last;
|
|
p = (fncMenuItem*)n -> prev;
|
|
while(n && p){
|
|
if(n -> fnc_code < p -> fnc_code){
|
|
items -> swap((iListElement*)n,(iListElement*)p);
|
|
tmp = p;
|
|
p = n;
|
|
n = tmp;
|
|
flag = 1;
|
|
}
|
|
n = p;
|
|
if(n)
|
|
p = (fncMenuItem*)n -> prev;
|
|
}
|
|
}
|
|
}
|
|
|
|
int actIntDispatcher::put_item(actintItemData* d)
|
|
{
|
|
int id = d -> type;
|
|
invItem* p = get_item(id),*p1;
|
|
if(!p){
|
|
std::cout<<"actIntDispatcher::put_item Item data not present... "<<XERR_USER<<" id:"<<id<<std::endl;
|
|
}
|
|
|
|
p1 = alloc_item();
|
|
p -> clone(p1);
|
|
|
|
if(!curMatrix -> auto_put_item(p1)){
|
|
aciSendEvent2itmdsp(ACI_DROP_ITEM,d);
|
|
free_item(p1);
|
|
std::cout<<"actIntDispatcher::put_item !curMatrix -> auto_put_item(p1) id:"<<id<<std::endl;
|
|
return 0;
|
|
}
|
|
p1 -> item_ptr = d;
|
|
d -> actintOwner = p1;
|
|
|
|
if(!(flags & AS_ISCREEN)){
|
|
if(p1 -> slotType != -1){
|
|
id = curMatrix -> get_item_slot(p1);
|
|
if(id != -1)
|
|
aciSendEvent2itmdsp(ACI_ACTIVATE_ITEM,d,id);
|
|
else
|
|
aciSendEvent2itmdsp(ACI_DEACTIVATE_ITEM,d);
|
|
}
|
|
if(p1 -> menu){
|
|
add_menu_item((fncMenu*)p1 -> menu);
|
|
}
|
|
}
|
|
if(curMode == AS_INV_MODE)
|
|
curMatrix -> set_redraw();
|
|
|
|
return 1;
|
|
}
|
|
|
|
int actIntDispatcher::put_item_auto(invItem* p1)
|
|
{
|
|
if(!curMatrix -> auto_put_item(p1)){
|
|
return 0;
|
|
}
|
|
p1 -> item_ptr = NULL;
|
|
|
|
if(!(flags & AS_ISCREEN)){
|
|
if(p1 -> menu){
|
|
add_menu_item((fncMenu*)p1 -> menu);
|
|
}
|
|
}
|
|
else {
|
|
if(p1 -> uvsDataPtr){
|
|
((uvsActInt*)p1 -> uvsDataPtr) -> pos_x = p1 -> MatrixX;
|
|
((uvsActInt*)p1 -> uvsDataPtr) -> pos_y = p1 -> MatrixY;
|
|
}
|
|
}
|
|
if(curMode == AS_INV_MODE)
|
|
curMatrix -> set_redraw();
|
|
|
|
return 1;
|
|
}
|
|
|
|
int actIntDispatcher::put_item_xy(invItem* p,int x,int y,int sflag)
|
|
{
|
|
int id = 0;
|
|
actintItemData* d;
|
|
invMatrix* m = (sflag) ? secondMatrix : curMatrix;
|
|
if(m -> check_fit(x,y,p)){
|
|
m -> put_item(x,y,p);
|
|
m -> clear_shadow_cells();
|
|
m -> set_redraw();
|
|
if(flags & AS_INV_MOVE_ITEM)
|
|
restore_mouse_cursor();
|
|
flags &= ~AS_INV_MOVE_ITEM;
|
|
if(p -> item_ptr && p -> slotType != -1){
|
|
id = m -> get_item_slot(p);
|
|
d = p -> item_ptr;
|
|
if(!(flags & AS_ISCREEN)){
|
|
if(id != -1)
|
|
aciSendEvent2itmdsp(ACI_ACTIVATE_ITEM,d,id);
|
|
else
|
|
aciSendEvent2itmdsp(ACI_DEACTIVATE_ITEM,d);
|
|
}
|
|
}
|
|
if(!(flags & AS_ISCREEN) && p -> menu){
|
|
add_menu_item((fncMenu*)p -> menu);
|
|
}
|
|
if(flags & AS_ISCREEN){
|
|
if(p -> uvsDataPtr){
|
|
((uvsActInt*)p -> uvsDataPtr) -> pos_x = p -> MatrixX;
|
|
((uvsActInt*)p -> uvsDataPtr) -> pos_y = p -> MatrixY;
|
|
}
|
|
}
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
void actIntDispatcher::remove_item(actintItemData* d)
|
|
{
|
|
invItem* p = (invItem*)d -> actintOwner;
|
|
curMatrix -> remove_item(p);
|
|
|
|
if(p -> menu){
|
|
remove_menu_item((fncMenu*)p -> menu);
|
|
}
|
|
free_item(p);
|
|
|
|
if(curMode == AS_INV_MODE)
|
|
curMatrix -> set_redraw();
|
|
}
|
|
|
|
void actIntDispatcher::inv_mouse_quant_l(void)
|
|
{
|
|
int x,y,index;
|
|
|
|
int mx = iMouseX;
|
|
int my = iMouseY;
|
|
|
|
if(flags & AS_ISCREEN) mx += iScreenOffs - 800;
|
|
|
|
if(curMatrix && curMatrix -> check_xy(mx,my)){
|
|
if(flags & AS_INV_MOVE_ITEM){
|
|
x = iMouseX - curMatrix -> ScreenX - (curItem -> ShapeSizeX >> 1) + curItem -> ShapeCenterX;
|
|
y = iMouseY - curMatrix -> ScreenY - (curItem -> ShapeSizeY >> 1) + curItem -> ShapeCenterY;
|
|
|
|
if(flags & AS_ISCREEN)
|
|
x += iScreenOffs - 800;
|
|
|
|
y /= aCellSize - (aCellSize >> 2);
|
|
|
|
if(y & 0x01) x -= (aCellSize >> 1);
|
|
x /= aCellSize;
|
|
}
|
|
else {
|
|
x = iMouseX - curMatrix -> ScreenX;
|
|
y = iMouseY - curMatrix -> ScreenY;
|
|
|
|
if(flags & AS_ISCREEN)
|
|
x += iScreenOffs - 800;
|
|
|
|
y /= aCellSize - (aCellSize >> 2);
|
|
|
|
if(y & 0x01) x -= (aCellSize >> 1);
|
|
x /= aCellSize;
|
|
}
|
|
index = x + y * curMatrix -> SizeX;
|
|
|
|
if(x >= 0 && x < curMatrix -> SizeX && y >= 0 && y < curMatrix -> SizeY){
|
|
if(flags & AS_INV_MOVE_ITEM){
|
|
if(curMatrix -> check_fit(x,y,curItem)){
|
|
if(flags & AS_ISCREEN && curItem -> flags & INV_ITEM_NO_PAY){
|
|
if(!aciCheckItemCredits()) return;
|
|
aciPay4Item(curItem);
|
|
}
|
|
put_item_xy(curItem,x,y);
|
|
SOUND_DROP();
|
|
}
|
|
else {
|
|
change_items(x,y);
|
|
SOUND_PICK();
|
|
}
|
|
}
|
|
else {
|
|
if(curMatrix -> matrix[index] -> flags & AS_BUSY_CELL){
|
|
set_move_item(index);
|
|
SOUND_PICK();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
if(!(flags & AS_ISCREEN)){
|
|
if(flags & AS_INV_MOVE_ITEM){
|
|
aciSendEvent2itmdsp(ACI_DROP_ITEM,curItem -> item_ptr);
|
|
restore_mouse_cursor();
|
|
if(curItem -> menu){
|
|
remove_menu_item((fncMenu*)curItem -> menu);
|
|
}
|
|
free_item(curItem);
|
|
flags &= ~AS_INV_MOVE_ITEM;
|
|
}
|
|
}
|
|
else {
|
|
if(secondMatrix && secondMatrix -> check_xy(mx,my)){
|
|
if(flags & AS_INV_MOVE_ITEM){
|
|
x = iMouseX - secondMatrix -> ScreenX - (curItem -> ShapeSizeX >> 1) + curItem -> ShapeCenterX;
|
|
y = iMouseY - secondMatrix -> ScreenY - (curItem -> ShapeSizeY >> 1) + curItem -> ShapeCenterY;
|
|
|
|
x += iScreenOffs - 800;
|
|
|
|
y /= aCellSize - (aCellSize >> 2);
|
|
|
|
if(y & 0x01) x -= (aCellSize >> 1);
|
|
x /= aCellSize;
|
|
}
|
|
else {
|
|
x = iMouseX - secondMatrix -> ScreenX;
|
|
y = iMouseY - secondMatrix -> ScreenY;
|
|
|
|
x += iScreenOffs - 800;
|
|
|
|
y /= aCellSize - (aCellSize >> 2);
|
|
|
|
if(y & 0x01) x -= (aCellSize >> 1);
|
|
x /= aCellSize;
|
|
}
|
|
index = x + y * secondMatrix -> SizeX;
|
|
|
|
if(x >= 0 && x < secondMatrix -> SizeX && y >= 0 && y < secondMatrix -> SizeY){
|
|
if(flags & AS_INV_MOVE_ITEM){
|
|
if(secondMatrix -> check_fit(x,y,curItem)){
|
|
put_item_xy(curItem,x,y,1);
|
|
SOUND_DROP();
|
|
}
|
|
else {
|
|
change_items(x,y,1);
|
|
SOUND_PICK();
|
|
}
|
|
}
|
|
else {
|
|
if(secondMatrix -> matrix[index] -> flags & AS_BUSY_CELL){
|
|
set_move_item(index,1);
|
|
SOUND_PICK();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void actIntDispatcher::inv_mouse_quant_r(void)
|
|
{
|
|
int x,y,index;
|
|
invItem* p = NULL;
|
|
|
|
int mx = iMouseX;
|
|
int my = iMouseY;
|
|
|
|
if(flags & AS_ISCREEN) mx += iScreenOffs - 800;
|
|
|
|
if(curMatrix && curMatrix -> check_xy(mx,my)){
|
|
if(flags & AS_INV_MOVE_ITEM){
|
|
x = iMouseX - curMatrix -> ScreenX - (curItem -> ShapeSizeX >> 1) + curItem -> ShapeCenterX;
|
|
y = iMouseY - curMatrix -> ScreenY - (curItem -> ShapeSizeY >> 1) + curItem -> ShapeCenterY;
|
|
|
|
if(flags & AS_ISCREEN)
|
|
x += iScreenOffs - 800;
|
|
|
|
y /= aCellSize - (aCellSize >> 2);
|
|
|
|
if(y & 0x01) x -= (aCellSize >> 1);
|
|
x /= aCellSize;
|
|
}
|
|
else {
|
|
x = iMouseX - curMatrix -> ScreenX;
|
|
y = iMouseY - curMatrix -> ScreenY;
|
|
|
|
if(flags & AS_ISCREEN)
|
|
x += iScreenOffs - 800;
|
|
|
|
y /= aCellSize - (aCellSize >> 2);
|
|
|
|
if(y & 0x01) x -= (aCellSize >> 1);
|
|
x /= aCellSize;
|
|
}
|
|
index = x + y * curMatrix -> SizeX;
|
|
|
|
if(x >= 0 && x < curMatrix -> SizeX && y >= 0 && y < curMatrix -> SizeY){
|
|
if(flags & AS_INV_MOVE_ITEM){
|
|
if(curMatrix -> check_fit(x,y,curItem)){
|
|
if(flags & AS_ISCREEN && curItem -> flags & INV_ITEM_NO_PAY){
|
|
if(!aciCheckItemCredits()) return;
|
|
aciPay4Item(curItem);
|
|
}
|
|
put_item_xy(curItem,x,y);
|
|
SOUND_DROP();
|
|
}
|
|
}
|
|
else {
|
|
if(!(flags & AS_ISCREEN)){
|
|
if(curMatrix -> matrix[index] -> flags & AS_BUSY_CELL){
|
|
p = curMatrix -> matrix[index] -> item;
|
|
if(p -> EvCode){
|
|
send_event(p -> EvCode,0,p -> item_ptr);
|
|
SOUND_DROP();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
if(!(flags & AS_ISCREEN)){
|
|
if(flags & AS_INV_MOVE_ITEM){
|
|
aciSendEvent2itmdsp(ACI_DROP_ITEM,curItem -> item_ptr);
|
|
restore_mouse_cursor();
|
|
if(curItem -> menu){
|
|
remove_menu_item((fncMenu*)curItem -> menu);
|
|
}
|
|
free_item(curItem);
|
|
flags &= ~AS_INV_MOVE_ITEM;
|
|
}
|
|
}
|
|
else {
|
|
if(secondMatrix){
|
|
if(flags & AS_INV_MOVE_ITEM){
|
|
x = iMouseX - secondMatrix -> ScreenX - (curItem -> ShapeSizeX >> 1) + curItem -> ShapeCenterX;
|
|
y = iMouseY - secondMatrix -> ScreenY - (curItem -> ShapeSizeY >> 1) + curItem -> ShapeCenterY;
|
|
|
|
x += iScreenOffs - 800;
|
|
|
|
y /= aCellSize - (aCellSize >> 2);
|
|
|
|
if(y & 0x01) x -= (aCellSize >> 1);
|
|
x /= aCellSize;
|
|
}
|
|
else {
|
|
x = iMouseX - secondMatrix -> ScreenX;
|
|
y = iMouseY - secondMatrix -> ScreenY;
|
|
|
|
x += iScreenOffs - 800;
|
|
|
|
y /= aCellSize - (aCellSize >> 2);
|
|
|
|
if(y & 0x01) x -= (aCellSize >> 1);
|
|
x /= aCellSize;
|
|
}
|
|
index = x + y * secondMatrix -> SizeX;
|
|
|
|
if(x >= 0 && x < secondMatrix -> SizeX && y >= 0 && y < secondMatrix -> SizeY){
|
|
if(flags & AS_INV_MOVE_ITEM){
|
|
if(secondMatrix -> check_fit(x,y,curItem)){
|
|
put_item_xy(curItem,x,y,1);
|
|
}
|
|
SOUND_DROP();
|
|
}
|
|
else {
|
|
if(secondMatrix -> matrix[index] -> flags & AS_BUSY_CELL){
|
|
p = secondMatrix -> matrix[index] -> item;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
bmlObject* actIntDispatcher::get_back_bml(int id)
|
|
{
|
|
bmlObject* p = (bmlObject*)backList -> last;
|
|
while(p){
|
|
if(p -> ID == id)
|
|
return p;
|
|
p = (bmlObject*)p -> prev;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
ibsObject* actIntDispatcher::get_ibs(int id)
|
|
{
|
|
ibsObject* p = (ibsObject*)ibsList -> last;
|
|
while(p){
|
|
if(p -> ID == id)
|
|
return p;
|
|
p = (ibsObject*)p -> prev;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
void actIntDispatcher::change_ibs(int id)
|
|
{
|
|
if(curIbs){
|
|
curIbs -> free();
|
|
// if(curIbs -> back) curIbs -> back -> free();
|
|
}
|
|
curIbs = get_ibs(id);
|
|
if(!curIbs) ErrH.Abort("IBS object not present",XERR_USER,id);
|
|
load_ibs();
|
|
}
|
|
|
|
void actIntDispatcher::next_ibs(void)
|
|
{
|
|
if(curIbs){
|
|
curIbs -> free();
|
|
for(int i = 0; i < curIbs -> backs.size(); i++){
|
|
curIbs -> backs[i] -> free();
|
|
}
|
|
}
|
|
curIbs = (ibsObject*)curIbs -> next;
|
|
if(!curIbs) ErrH.Abort("IBS object not present");
|
|
load_ibs();
|
|
}
|
|
|
|
void actIntDispatcher::load_ibs(void)
|
|
{
|
|
if(!curIbs)
|
|
ErrH.Abort("curIBS object not present");
|
|
|
|
curIbsID = curIbs -> ID;
|
|
curIbs -> load();
|
|
init_inds();
|
|
}
|
|
|
|
void actIntDispatcher::free_ibs(void)
|
|
{
|
|
if(!curIbs)
|
|
ErrH.Abort("curIBS object not present");
|
|
|
|
curIbs -> free();
|
|
}
|
|
|
|
void actIntDispatcher::set_move_item(int index,int sflag)
|
|
{
|
|
|
|
invMatrix* m = (sflag) ? secondMatrix : curMatrix;
|
|
|
|
invItem* p = m -> matrix[index] -> item;
|
|
|
|
m -> remove_item(p);
|
|
|
|
m -> put_item_shadow(p -> MatrixX,p -> MatrixY,p);
|
|
|
|
m -> set_redraw();
|
|
curItem = p;
|
|
set_mouse_cursor(p -> frame,p -> ScreenSizeX,p -> ScreenSizeY);
|
|
if(!(flags & AS_ISCREEN)){
|
|
if(p -> slotType != -1)
|
|
aciSendEvent2itmdsp(ACI_DEACTIVATE_ITEM,p -> item_ptr);
|
|
}
|
|
else {
|
|
if(p -> uvsDataPtr){
|
|
((uvsActInt*)p -> uvsDataPtr) -> pos_x = -1;
|
|
((uvsActInt*)p -> uvsDataPtr) -> pos_y = -1;
|
|
|
|
p -> MatrixX = p -> MatrixY = -1;
|
|
}
|
|
}
|
|
if(iP){
|
|
iP -> free_list();
|
|
iP -> add_item(curItem->ID_ptr.c_str(),-1,aciCurColorScheme[FM_SELECT_COL]);
|
|
if(!(flags & AS_ISCREEN)){
|
|
iP -> add_items(curItem -> numComments,curItem -> comments);
|
|
if(curItem -> pTemplate)
|
|
iP -> add_item(aciGetItemLoad(curItem,0));
|
|
}
|
|
else {
|
|
iP -> add_items(curItem -> numComments,curItem -> comments);
|
|
if(curItem -> pTemplate)
|
|
iP -> add_item(aciGetItemLoad(curItem,1));
|
|
if(!uvsCurrentWorldUnable)
|
|
iP -> add_item(aciGetPrice((iListElement*)curItem,ITEMS_MODE,1));
|
|
}
|
|
iP -> set_redraw();
|
|
}
|
|
flags |= AS_INV_MOVE_ITEM;
|
|
}
|
|
|
|
void actIntDispatcher::change_items(int x,int y,int sflag)
|
|
{
|
|
actintItemData* d;
|
|
int id;
|
|
|
|
invMatrix* m = (sflag) ? secondMatrix : curMatrix;
|
|
|
|
invItem* p = m -> get_area_item(x,y,curItem);
|
|
if(!p) return;
|
|
|
|
m -> remove_item(p);
|
|
if(!m -> check_fit(x,y,curItem)){
|
|
m -> put_item(p -> MatrixX,p -> MatrixY,p);
|
|
return;
|
|
}
|
|
if(flags & AS_ISCREEN && curItem -> flags & INV_ITEM_NO_PAY){
|
|
if(!aciCheckItemCredits()){
|
|
m -> put_item(p -> MatrixX,p -> MatrixY,p);
|
|
return;
|
|
}
|
|
aciPay4Item(curItem);
|
|
}
|
|
m -> put_item(x,y,curItem);
|
|
m -> set_redraw();
|
|
|
|
if(!(flags & AS_ISCREEN)){
|
|
if(p -> slotType != -1)
|
|
aciSendEvent2itmdsp(ACI_DEACTIVATE_ITEM,p -> item_ptr);
|
|
}
|
|
|
|
if(curItem -> slotType != -1){
|
|
if(!(flags & AS_ISCREEN)){
|
|
id = m -> get_item_slot(curItem);
|
|
d = curItem -> item_ptr;
|
|
if(id != -1)
|
|
aciSendEvent2itmdsp(ACI_ACTIVATE_ITEM,d,id);
|
|
else
|
|
aciSendEvent2itmdsp(ACI_DEACTIVATE_ITEM,d);
|
|
}
|
|
}
|
|
|
|
m -> clear_shadow_cells();
|
|
|
|
flags |= aMS_MOVED;
|
|
|
|
if(!(flags & AS_ISCREEN)){
|
|
if(p -> menu)
|
|
remove_menu_item((fncMenu*)p -> menu);
|
|
if(curItem -> menu)
|
|
add_menu_item((fncMenu*)curItem -> menu);
|
|
}
|
|
else {
|
|
if(curItem -> uvsDataPtr){
|
|
((uvsActInt*)curItem -> uvsDataPtr) -> pos_x = curItem -> MatrixX;
|
|
((uvsActInt*)curItem -> uvsDataPtr) -> pos_y = curItem -> MatrixY;
|
|
}
|
|
if(p -> uvsDataPtr){
|
|
((uvsActInt*)p -> uvsDataPtr) -> pos_x = -1;
|
|
((uvsActInt*)p -> uvsDataPtr) -> pos_y = -1;
|
|
|
|
p -> MatrixX = p -> MatrixY = -1;
|
|
}
|
|
}
|
|
|
|
curItem = p;
|
|
|
|
if(iP){
|
|
iP -> free_list();
|
|
iP -> add_item(curItem->ID_ptr.c_str(),-1,aciCurColorScheme[FM_SELECT_COL]);
|
|
if(!(flags & AS_ISCREEN)){
|
|
iP -> add_items(curItem -> numComments,curItem -> comments);
|
|
if(curItem -> pTemplate)
|
|
iP -> add_item(aciGetItemLoad(curItem,0));
|
|
}
|
|
else {
|
|
iP -> add_items(curItem -> numComments,curItem -> comments);
|
|
if(curItem -> pTemplate)
|
|
iP -> add_item(aciGetItemLoad(curItem,1));
|
|
if(!uvsCurrentWorldUnable)
|
|
iP -> add_item(aciGetPrice((iListElement*)curItem,ITEMS_MODE,1));
|
|
}
|
|
iP -> set_redraw();
|
|
}
|
|
|
|
set_mouse_cursor(p -> frame,p -> ScreenSizeX,p -> ScreenSizeY);
|
|
// inv_mouse_move_quant();
|
|
}
|
|
|
|
void aIndData::alloc_mem(void)
|
|
{
|
|
int i;
|
|
|
|
if(check_points) {
|
|
delete[] check_points;
|
|
}
|
|
if(value) {
|
|
delete[] value;
|
|
}
|
|
if(value_ptr) {
|
|
delete[] value_ptr;
|
|
}
|
|
if(max_value) {
|
|
delete[] max_value;
|
|
}
|
|
if(colors) {
|
|
delete[] colors;
|
|
}
|
|
|
|
check_points = new int[NumVals];
|
|
value = new int[NumVals];
|
|
value_ptr = new int*[NumVals];
|
|
max_value = new int*[NumVals];
|
|
colors = new int[NumVals];
|
|
|
|
check_points[0] = 0;
|
|
|
|
for(i = 0; i < NumVals; i ++){
|
|
value[i] = -1;
|
|
colors[i] = 0;
|
|
}
|
|
}
|
|
|
|
void aIndData::init(void)
|
|
{
|
|
int i;
|
|
SizeX = aIndArrowBML -> SizeX;
|
|
SizeY = aIndArrowBML -> SizeY;
|
|
|
|
if(pict_buf) {
|
|
delete[] pict_buf;
|
|
}
|
|
pict_buf = new char[SizeX * SizeY];
|
|
|
|
if(bml) bml -> load();
|
|
|
|
for(i = 0; i < NumVals; i ++)
|
|
value[i] = -1;
|
|
|
|
switch(ID){
|
|
case IND_N0:
|
|
case IND_N1:
|
|
value_ptr[0] = &aci_tmp;
|
|
max_value[0] = &aci_tmp_max;
|
|
colors[0] = aciCurColorScheme[IND_N0_COL];
|
|
break;
|
|
case IND_SPIRAL:
|
|
value_ptr[0] = &aciCurJumpCount;
|
|
max_value[0] = &aciMaxJumpCount;
|
|
colors[0] = ACI_IND_SPIRAL_COL | (ACI_IND_SPIRAL_SIZE << 16);
|
|
flags |= IND_SHOW_VALUES;
|
|
break;
|
|
case IND_NRG:
|
|
value_ptr[1] = &aciCurEnergy;
|
|
max_value[1] = &aciMaxEnergy;
|
|
|
|
value_ptr[0] = &aciCurArmor;
|
|
max_value[0] = &aciMaxArmor;
|
|
|
|
check_points[0] = 0;
|
|
check_points[1] = 64;
|
|
|
|
colors[0] = ACI_IND_NRG0_COL | (ACI_IND_NRG0_SIZE << 16);
|
|
colors[1] = ACI_IND_NRG1_COL | (ACI_IND_NRG1_SIZE << 16);
|
|
break;
|
|
case IND_JUMP:
|
|
value_ptr[0] = &aciCurJumpImpulse;
|
|
max_value[0] = &aciMaxJumpImpulse;
|
|
colors[0] = ACI_IND_JUMP_COL | (ACI_IND_JUMP_SIZE << 16);
|
|
break;
|
|
case IND_LOAD:
|
|
value_ptr[0] = &aciCurLoad;
|
|
max_value[0] = &aciMaxLoad;
|
|
colors[0] = ACI_IND_LOAD_COL | (ACI_IND_LOAD_SIZE << 16);
|
|
break;
|
|
case IND_WPN:
|
|
value_ptr[0] = &aciCurWpnResource;
|
|
max_value[0] = &aciMaxWpnResource;
|
|
colors[0] = aciCurColorScheme[IND_WPN_COL];
|
|
break;
|
|
case IND_DVC:
|
|
value_ptr[0] = &aciCurDvcResource;
|
|
max_value[0] = &aciMaxDvcResource;
|
|
colors[0] = ACI_IND_DVC_COL | (ACI_IND_DVC_SIZE << 16);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void aIndData::finit(void)
|
|
{
|
|
if(pict_buf){
|
|
delete[] pict_buf;
|
|
pict_buf = NULL;
|
|
}
|
|
if(bml) bml -> free();
|
|
}
|
|
|
|
void aciWorldMap::init(void)
|
|
{
|
|
int i;
|
|
for(i = 0; i < AS_MAX_WORLD; i ++){
|
|
world_ptr[i] = get_world(i);
|
|
}
|
|
if(!redraw_buf) redraw_buf = new unsigned char[SizeX * SizeY];
|
|
calc_shapes();
|
|
remap_coords();
|
|
}
|
|
|
|
aciWorldInfo* aciWorldMap::get_world(int id)
|
|
{
|
|
aciWorldInfo* p = (aciWorldInfo*)world_list -> last;
|
|
while(p){
|
|
if(p -> ID == id) return p;
|
|
p = (aciWorldInfo*)p -> prev;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
aciWorldInfo* aciWorldMap::get_world_p(char* ptr)
|
|
{
|
|
aciWorldInfo* p = (aciWorldInfo*)world_list -> last;
|
|
while(p){
|
|
if(p -> name && !strcmp(p -> name,ptr)) return p;
|
|
p = (aciWorldInfo*)p -> prev;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
void aciWorldMap::quant(void)
|
|
{
|
|
if(aciPrevJumpCount != aciCurJumpCount){
|
|
aciWorldLinksOFF();
|
|
if(aciCurJumpCount)
|
|
aciWorldLinksON();
|
|
}
|
|
aciPrevJumpCount = aciCurJumpCount;
|
|
|
|
}
|
|
|
|
void aciWorldMap::redraw(int x,int y)
|
|
{
|
|
quant();
|
|
if(flags & WMAP_REBUILD_PIC)
|
|
build_map();
|
|
// show_jump_count();
|
|
XGR_PutSpr(x,y,SizeX,SizeY,redraw_buf,XGR_BLACK_FON);
|
|
}
|
|
|
|
void aciWorldMap::build_map(void)
|
|
{
|
|
int i;
|
|
aciWorldInfo* p;
|
|
|
|
flags &= ~WMAP_REBUILD_PIC;
|
|
memset(redraw_buf,aciCurColorScheme[ACI_BACK_COL],SizeX * SizeY);
|
|
|
|
aciWorldExploredInfo();
|
|
|
|
p = (aciWorldInfo*)world_list -> last;
|
|
while(p){
|
|
for(i = 0; i < AS_MAX_WORLD; i ++){
|
|
if(i != p -> ID && p -> links[i]) show_link(p -> ID,i);
|
|
}
|
|
p = (aciWorldInfo*)p -> prev;
|
|
}
|
|
|
|
p = (aciWorldInfo*)world_list -> last;
|
|
while(p){
|
|
p -> redraw(SizeX,SizeY,redraw_buf);
|
|
p = (aciWorldInfo*)p -> prev;
|
|
}
|
|
}
|
|
|
|
void aIndData::build_pict(void)
|
|
{
|
|
int ind,v,val,p1,p2,dx,dy,col,col_sz;
|
|
|
|
memset(pict_buf,0,SizeX * SizeY);
|
|
|
|
if(flags & IND_DISABLED){
|
|
dx = (SizeX - aIndBackBML -> SizeX) >> 1;
|
|
dy = (SizeY - aIndBackBML -> SizeY) >> 1;
|
|
aciPutBufSpr(dx,dy,aIndBackBML -> SizeX,aIndBackBML -> SizeY,SizeX,aIndBackBML -> frames + aIndBackBML -> SizeX * aIndBackBML -> SizeY * (aIndBackBML -> Size - 1),pict_buf,ACI_IND_ARROW_START,ACI_IND_ARROW_SIZE);
|
|
}
|
|
else {
|
|
for(ind = NumVals - 1; ind >= 0; ind --){
|
|
p1 = check_points[ind];
|
|
p2 = (ind == NumVals - 1) ? 256 : check_points[ind + 1];
|
|
|
|
p1 = (p1 * (aIndDataBML -> Size - 1)) >> 8;
|
|
p2 = (p2 * (aIndDataBML -> Size - 1)) >> 8;
|
|
|
|
value[ind] = *value_ptr[ind];
|
|
if(value[ind] >= *max_value[ind]) value[ind] = (*max_value[ind]) - 1;
|
|
|
|
if((*max_value[ind]) > 1)
|
|
val = (value[ind] * (p2 - p1)) / ((*max_value[ind]) - 1) + p1;
|
|
else
|
|
val = 0;
|
|
|
|
col = colors[ind] & 0xFFFF;
|
|
col_sz = (colors[ind] >> 16) & 0xFFFF;
|
|
|
|
if(val >= aIndDataBML -> Size) val = aIndDataBML -> Size - 1;
|
|
if(val < 0) val = 0;
|
|
|
|
if(p2 < 0) p2 = 0;
|
|
if(p2 >= aIndDataBML -> Size) p2 = aIndDataBML -> Size - 1;
|
|
|
|
dx = (SizeX - aIndDataBML -> SizeX) >> 1;
|
|
dy = (SizeY - aIndDataBML -> SizeY) >> 1;
|
|
|
|
aciPutBufSpr(dx,dy,aIndDataBML -> SizeX,aIndDataBML -> SizeY,SizeX,aIndDataBML -> frames + aIndDataBML -> SizeX * aIndDataBML -> SizeY * p2,pict_buf,ACI_IND_FON_START,ACI_IND_FON_SIZE);
|
|
aciPutBufSpr(dx,dy,aIndDataBML -> SizeX,aIndDataBML -> SizeY,SizeX,aIndDataBML -> frames + aIndDataBML -> SizeX * aIndDataBML -> SizeY * val,pict_buf,col,col_sz);
|
|
|
|
aciPutBufSpr(0,0,aIndArrowBML -> SizeX,aIndArrowBML -> SizeY,SizeX,aIndArrowBML -> frames + aIndArrowBML -> SizeX * aIndArrowBML -> SizeY * p2,pict_buf,ACI_IND_ARROW_START,ACI_IND_ARROW_SIZE);
|
|
}
|
|
aciPutBufSpr(0,0,aIndArrowBML -> SizeX,aIndArrowBML -> SizeY,SizeX,aIndArrowBML -> frames,pict_buf,ACI_IND_ARROW_START,ACI_IND_ARROW_SIZE);
|
|
|
|
if(flags & IND_SHOW_VALUES){
|
|
for(ind = 0; ind < NumVals; ind ++){
|
|
for(v = 0; v < *max_value[ind]; v ++){
|
|
if((*max_value[ind]) > 1)
|
|
val = (v * aIndArrowBML -> Size) / ((*max_value[ind]) - 1);
|
|
else
|
|
val = 0;
|
|
|
|
if(val < 0) val = 0;
|
|
if(val >= aIndArrowBML -> Size) val = aIndArrowBML -> Size - 1;
|
|
aciPutBufSpr(0,0,aIndArrowBML -> SizeX,aIndArrowBML -> SizeY,SizeX,aIndArrowBML -> frames + aIndArrowBML -> SizeX * aIndArrowBML -> SizeY * val,pict_buf,ACI_IND_ARROW_START,ACI_IND_ARROW_SIZE);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void aIndData::redraw(int dx,int dy)
|
|
{
|
|
int i,x,y;
|
|
for(i = 0; i < NumVals; i ++){
|
|
if(*value_ptr[i] != value[i]){
|
|
build_pict();
|
|
i = NumVals;
|
|
}
|
|
}
|
|
if(dx == -1){
|
|
XGR_PutSpr(PosX,PosY,SizeX,SizeY,pict_buf,XGR_HIDDEN_FON);
|
|
if(bml) bml -> show();
|
|
}
|
|
else {
|
|
switch(CornerNum){
|
|
case IND_UP_LEFT:
|
|
x = dx;
|
|
y = dy;
|
|
break;
|
|
case IND_UP_RIGHT:
|
|
x = XGR_MAXX - dx - SizeX;
|
|
y = dy;
|
|
break;
|
|
case IND_DN_RIGHT:
|
|
x = XGR_MAXX - dx - SizeX;
|
|
y = XGR_MAXY - dy - SizeY;
|
|
break;
|
|
case IND_DN_LEFT:
|
|
x = dx;
|
|
y = XGR_MAXY - dy - SizeY;
|
|
break;
|
|
}
|
|
XGR_PutSpr(x,y,SizeX,SizeY,pict_buf,XGR_HIDDEN_FON);
|
|
}
|
|
}
|
|
|
|
void actIntDispatcher::init_inds(void)
|
|
{
|
|
int lx,ly,rx,ry,cx,cy;
|
|
ibsObject* ibs = curIbs;
|
|
XGR_MousePromptData* pr;
|
|
|
|
lx = 0;
|
|
ly = 0;
|
|
|
|
rx = XGR_MAXX;
|
|
ry = XGR_MAXY;
|
|
|
|
aIndData* p = (aIndData*)indList -> last;
|
|
while(p){
|
|
switch(p -> CornerNum){
|
|
case IND_UP_LEFT:
|
|
p -> PosX = lx + ibs -> indPosX[0];
|
|
p -> PosY = ly + ibs -> indPosY[0];
|
|
break;
|
|
case IND_UP_RIGHT:
|
|
p -> PosX = rx - ibs -> indPosX[1] - p -> SizeX;
|
|
p -> PosY = ly + ibs -> indPosY[1];
|
|
break;
|
|
case IND_DN_LEFT:
|
|
p -> PosX = lx + ibs -> indPosX[2];
|
|
p -> PosY = ry - ibs -> indPosY[2] - p -> SizeY;
|
|
break;
|
|
case IND_DN_RIGHT:
|
|
p -> PosX = rx - ibs -> indPosX[3] - p -> SizeX;
|
|
p -> PosY = ry - ibs -> indPosY[3] - p -> SizeY;
|
|
break;
|
|
}
|
|
if(p -> bml){
|
|
cx = p -> PosX + (p -> SizeX >> 1);
|
|
cy = p -> PosY + (p -> SizeY >> 1);
|
|
p -> bml -> OffsX = cx - (p -> bml -> SizeX >> 1);
|
|
p -> bml -> OffsY = cy - (p -> bml -> SizeY >> 1);
|
|
}
|
|
if(p -> ID == IND_DVC){
|
|
if(curMatrix && !curMatrix -> slot_exist(3)){
|
|
p -> flags |= IND_DISABLED;
|
|
}
|
|
else {
|
|
p -> flags &= ~IND_DISABLED;
|
|
}
|
|
}
|
|
pr = invPrompt -> getData(p -> ID);
|
|
if(pr){
|
|
if(p -> flags & IND_DISABLED){
|
|
pr -> StartX = 0;
|
|
pr -> StartY = 0;
|
|
|
|
pr -> SizeX = 0;
|
|
pr -> SizeY = 0;
|
|
}
|
|
else {
|
|
pr -> StartX = p -> PosX;
|
|
pr -> StartY = p -> PosY;
|
|
|
|
pr -> SizeX = p -> SizeX;
|
|
pr -> SizeY = p -> SizeY;
|
|
}
|
|
}
|
|
pr = infPrompt -> getData(p -> ID);
|
|
if(pr){
|
|
if(p -> flags & IND_DISABLED){
|
|
pr -> StartX = 0;
|
|
pr -> StartY = 0;
|
|
|
|
pr -> SizeX = 0;
|
|
pr -> SizeY = 0;
|
|
}
|
|
else {
|
|
pr -> StartX = p -> PosX;
|
|
pr -> StartY = p -> PosY;
|
|
|
|
pr -> SizeX = p -> SizeX;
|
|
pr -> SizeY = p -> SizeY;
|
|
}
|
|
}
|
|
p = (aIndData*)p -> prev;
|
|
}
|
|
}
|
|
|
|
void invItem::calc_shape_center(void)
|
|
{
|
|
int i,x,y,min_x,min_y,max_x,max_y;
|
|
int cell_sz,cell_sz2,cell_sz4;
|
|
|
|
int* tmpShapeX;
|
|
int* tmpShapeY;
|
|
|
|
x = y = 0;
|
|
min_x = min_y = max_x = max_y = 0;
|
|
|
|
cell_sz = aCellSize;
|
|
cell_sz2 = aCellSize/2;
|
|
cell_sz4 = aCellSize/4;
|
|
|
|
if(ShapeLen){
|
|
tmpShapeX = new int[ShapeLen];
|
|
tmpShapeY = new int[ShapeLen];
|
|
|
|
for(i = 0; i < ShapeLen; i ++){
|
|
tmpShapeX[i] = ShapeX[i] * 2;
|
|
tmpShapeY[i] = ShapeY[i];
|
|
|
|
if(ShapeY[i] & 1)
|
|
tmpShapeX[i] ++;
|
|
|
|
x = tmpShapeX[i];
|
|
y = tmpShapeY[i];
|
|
|
|
if(x < min_x){
|
|
min_x = x;
|
|
}
|
|
if(y < min_y){
|
|
min_y = y;
|
|
}
|
|
|
|
if(x > max_x){
|
|
max_x = x;
|
|
}
|
|
if(y > max_y){
|
|
max_y = y;
|
|
}
|
|
}
|
|
for(i = 0; i < ShapeLen; i ++){
|
|
tmpShapeX[i] -= min_x;
|
|
tmpShapeY[i] -= min_y;
|
|
}
|
|
}
|
|
|
|
ShapeSizeX = cell_sz + (max_x - min_x) * cell_sz2;
|
|
ShapeSizeY = cell_sz + (max_y - min_y) * (cell_sz - cell_sz4);
|
|
|
|
if(ShapeLen){
|
|
ShapeCenterX = (tmpShapeX[0] + 1) * cell_sz2;
|
|
ShapeCenterY = tmpShapeY[0] * (cell_sz - cell_sz4) + cell_sz2;
|
|
|
|
delete[] tmpShapeX;
|
|
delete[] tmpShapeY;
|
|
}
|
|
}
|
|
|
|
/*
|
|
void invItem::calc_shape_center(void)
|
|
{
|
|
int i,x,y,min_x,min_y,min_index_x,min_index_y,max_x,max_y,max_index_x,max_index_y,sy;
|
|
|
|
x = y = 0;
|
|
min_x = min_y = max_x = max_y = 0;
|
|
min_index_x = min_index_y = max_index_x = max_index_y = 0;
|
|
|
|
for(i = 0; i < ShapeLen; i ++){
|
|
x = ShapeX[i];
|
|
y = ShapeY[i];
|
|
|
|
if(x < min_x){
|
|
min_x = x;
|
|
min_index_x = i;
|
|
}
|
|
if(y < min_y){
|
|
min_y = y;
|
|
min_index_y = i;
|
|
}
|
|
|
|
if(x > max_x){
|
|
max_x = x;
|
|
max_index_x = i;
|
|
}
|
|
if(y > max_y){
|
|
max_y = y;
|
|
max_index_y = i;
|
|
}
|
|
}
|
|
|
|
sy = max_y - min_y + 1;
|
|
|
|
ShapeSizeX = (max_x - min_x + 1) * aCellSize;
|
|
ShapeSizeY = aCellSize + (sy - 1) * (aCellSize - (aCellSize >> 2));
|
|
|
|
ShapeCenterX = -min_x * aCellSize + (aCellSize >> 1);
|
|
if(ShapeY[min_index_x] & 0x01) ShapeCenterX -= (aCellSize >> 1);
|
|
ShapeCenterY = -min_y * (aCellSize - (aCellSize >> 2)) + (aCellSize >> 1);
|
|
}
|
|
*/
|
|
|
|
#if defined(_GENERATE_MATRIX_SHAPES_) || defined(_GENERATE_iMATRIX_SHAPES_)
|
|
void invMatrix::generate_shape(void)
|
|
{
|
|
int i,j,x0,y0,sz = SizeX * SizeY,x = 0,y = 0,col = 0,col1 = 0,index = 0;
|
|
int ssx,ssy,ssz;
|
|
|
|
unsigned char pal_buf[768];
|
|
|
|
XStream fh;
|
|
XBuffer XBuf;
|
|
unsigned char* buf;
|
|
|
|
init();
|
|
|
|
ssx = ScreenSizeX + aCellSize;
|
|
ssy = ScreenSizeY + aCellSize;
|
|
ssz = ssx * ssy;
|
|
|
|
XBuf < "actint/temp/m";
|
|
if(internalID < 10) XBuf < "0";
|
|
XBuf <= internalID < ".bmp";
|
|
|
|
for(i = 0; i < 64; i ++){
|
|
pal_buf[i * 3] = pal_buf[i * 3 + 1] = pal_buf[i * 3 + 2] = i;
|
|
}
|
|
|
|
buf = new unsigned char[ssz];
|
|
memset(buf,0,ssz);
|
|
|
|
int dx = aCellSize;
|
|
int dx2 = aCellSize >> 1;
|
|
int dx4 = aCellSize >> 2;
|
|
|
|
unsigned char* p;
|
|
p = new unsigned char[(dx + 1) * (dx + 1)];
|
|
|
|
for(i = 0; i < SizeY; i ++){
|
|
if(i & 0x01){
|
|
x += dx2;
|
|
}
|
|
for(j = 0; j < SizeX; j ++){
|
|
if(matrix[index] -> type){
|
|
memcpy(p,aCellFrame,(dx + 1) * (dx + 1));
|
|
|
|
x0 = x + dx2;
|
|
y0 = y + dx2;
|
|
|
|
mem_putspr(x0,y0,dx + 1,dx + 1,ssx,ssy,p,buf);
|
|
}
|
|
x += aCellSize;
|
|
index ++;
|
|
}
|
|
x = 0;
|
|
y += aCellSize - dx4;
|
|
}
|
|
|
|
delete[] p;
|
|
|
|
smooth_shape_quant(ssx,ssy,buf,0,SHAPE_DEPTH + 83,1);
|
|
for(i = SHAPE_DEPTH - 1; i > 0; i --)
|
|
smooth_shape_quant(ssx,ssy,buf,0,i + 83,i + 1 + 83);
|
|
|
|
swap_buf_col(1,0,ssx,ssy,buf);
|
|
swap_buf_col(2,0,ssx,ssy,buf);
|
|
|
|
for(i = SHAPE_DEPTH; i > 0; i --)
|
|
swap_buf_col(i + 83,SHAPE_DEPTH,ssx,ssy,buf);
|
|
|
|
fh.open(XBuf,XS_OUT);
|
|
fh < (short)ssx < (short)ssy;
|
|
fh.write(buf,ssz);
|
|
fh.close();
|
|
|
|
XBuf.init();
|
|
XBuf < "actint/temp/m";
|
|
if(internalID < 10) XBuf < "0";
|
|
XBuf <= internalID < ".shp";
|
|
|
|
int scr_sx = (actintLowResFlag) ? 640 : 800;
|
|
int scr_sy = (actintLowResFlag) ? 480 : 600;
|
|
|
|
fh.open(XBuf,XS_OUT);
|
|
fh < "X0: " <= (512 - scr_sx/2 + ScreenX + ScreenSizeX/2) < "\r\n";
|
|
fh < "Y0: " <= (512 - scr_sy/2 + ScreenY + ScreenSizeY/2) < "\r\n\r\n";
|
|
|
|
fh < "X1: " <= (1536 - scr_sx/2 + ScreenX + ScreenSizeX/2) < "\r\n";
|
|
fh < "Y1: " <= (512 - scr_sy/2 + ScreenY + ScreenSizeY/2) < "\r\n\r\n";
|
|
|
|
fh < "X2: " <= (512 - scr_sx/2 + ScreenX + ScreenSizeX/2) < "\r\n";
|
|
fh < "Y2: " <= (1536 - scr_sy/2 + ScreenY + ScreenSizeY/2) < "\r\n\r\n";
|
|
|
|
fh < "X3: " <= (1536 - scr_sx/2 + ScreenX + ScreenSizeX/2) < "\r\n";
|
|
fh < "Y3: " <= (1536 - scr_sy/2 + ScreenY + ScreenSizeY/2) < "\r\n\r\n";
|
|
|
|
fh < "iX: " <= (1200 - 800/2 + ScreenX + ScreenSizeX/2) < "\r\n";
|
|
fh < "iY: " <= (300 - 600/2 + ScreenY + ScreenSizeY/2) < "\r\n\r\n";
|
|
fh.close();
|
|
|
|
XBuf.init();
|
|
XBuf < "actint/temp/m";
|
|
if(internalID < 10) XBuf < "0";
|
|
XBuf <= internalID < ".pal";
|
|
|
|
fh.open(XBuf,XS_OUT);
|
|
fh.write(pal_buf,768);
|
|
fh.close();
|
|
|
|
delete buf;
|
|
}
|
|
|
|
void invMatrix::generate_floor(void)
|
|
{
|
|
int i,j,x0,y0,sz = SizeX * SizeY,x = 0,y = 0,col = 0,col1 = 0,index = 0;
|
|
int ssx,ssy,ssz;
|
|
|
|
unsigned char pal_buf[768];
|
|
|
|
XStream fh;
|
|
XBuffer XBuf;
|
|
unsigned char* buf;
|
|
|
|
init();
|
|
|
|
ssx = ScreenSizeX + aCellSize;
|
|
ssy = ScreenSizeY + aCellSize;
|
|
ssz = ssx * ssy;
|
|
|
|
XBuf < "actint/temp/f";
|
|
if(internalID < 10) XBuf < "0";
|
|
XBuf <= internalID < ".bmp";
|
|
|
|
for(i = 0; i < 64; i ++){
|
|
pal_buf[i * 3] = pal_buf[i * 3 + 1] = pal_buf[i * 3 + 2] = i;
|
|
}
|
|
|
|
buf = new unsigned char[ssz];
|
|
memset(buf,0,ssz);
|
|
|
|
int dx = aCellSize;
|
|
int dx2 = aCellSize >> 1;
|
|
int dx4 = aCellSize >> 2;
|
|
|
|
unsigned char* p;
|
|
p = new unsigned char[(dx + 1) * (dx + 1)];
|
|
|
|
for(i = 0; i < SizeY; i ++){
|
|
if(i & 0x01){
|
|
x += dx2;
|
|
}
|
|
for(j = 0; j < SizeX; j ++){
|
|
if(matrix[index] -> type){
|
|
memcpy(p,aCellFrame,(dx + 1) * (dx + 1));
|
|
|
|
x0 = x + dx2;
|
|
y0 = y + dx2;
|
|
|
|
mem_putspr(x0,y0,dx + 1,dx + 1,ssx,ssy,p,buf);
|
|
}
|
|
x += aCellSize;
|
|
index ++;
|
|
}
|
|
x = 0;
|
|
y += aCellSize - dx4;
|
|
}
|
|
|
|
#ifdef _FACET_FLOOR_
|
|
// swap_buf_col(1,0,ssx,ssy,buf);
|
|
swap_buf_col(2,0,ssx,ssy,buf);
|
|
#else
|
|
swap_buf_col(2,1,ssx,ssy,buf);
|
|
#endif
|
|
|
|
delete[] p;
|
|
|
|
fh.open(XBuf,XS_OUT);
|
|
fh < (short)ssx < (short)ssy;
|
|
fh.write(buf,ssz);
|
|
fh.close();
|
|
|
|
XBuf.init();
|
|
XBuf < "actint/temp/f";
|
|
if(internalID < 10) XBuf < "0";
|
|
XBuf <= internalID < ".shp";
|
|
|
|
int scr_sx = (actintLowResFlag) ? 640 : 800;
|
|
int scr_sy = (actintLowResFlag) ? 480 : 600;
|
|
|
|
fh.open(XBuf,XS_OUT);
|
|
fh < "X0: " <= (512 - scr_sx/2 + ScreenX + ScreenSizeX/2) < "\r\n";
|
|
fh < "Y0: " <= (512 - scr_sy/2 + ScreenY + ScreenSizeY/2) < "\r\n\r\n";
|
|
|
|
fh < "X1: " <= (1536 - scr_sx/2 + ScreenX + ScreenSizeX/2) < "\r\n";
|
|
fh < "Y1: " <= (512 - scr_sy/2 + ScreenY + ScreenSizeY/2) < "\r\n\r\n";
|
|
|
|
fh < "X2: " <= (512 - scr_sx/2 + ScreenX + ScreenSizeX/2) < "\r\n";
|
|
fh < "Y2: " <= (1536 - scr_sy/2 + ScreenY + ScreenSizeY/2) < "\r\n\r\n";
|
|
|
|
fh < "X3: " <= (1536 - scr_sx/2 + ScreenX + ScreenSizeX/2) < "\r\n";
|
|
fh < "Y3: " <= (1536 - scr_sy/2 + ScreenY + ScreenSizeY/2) < "\r\n\r\n";
|
|
|
|
fh < "iX: " <= (1200 - 800/2 + ScreenX + ScreenSizeX/2) < "\r\n";
|
|
fh < "iY: " <= (300 - 600/2 + ScreenY + ScreenSizeY/2) < "\r\n\r\n";
|
|
fh.close();
|
|
|
|
XBuf.init();
|
|
XBuf < "actint/temp/f";
|
|
if(internalID < 10) XBuf < "0";
|
|
XBuf <= internalID < ".pal";
|
|
|
|
fh.open(XBuf,XS_OUT);
|
|
fh.write(pal_buf,768);
|
|
fh.close();
|
|
|
|
delete buf;
|
|
}
|
|
#endif
|
|
|
|
void actIntDispatcher::inv_mouse_move_quant(void)
|
|
{
|
|
int x,y,ix,iy,isx,isy,id = -1;
|
|
invItem* p = NULL;
|
|
XBuffer* XBuf;
|
|
char* ptr;
|
|
|
|
aButton* bt;
|
|
|
|
XGR_MousePromptData* pr = NULL,*bt_pr0,*bt_pr1;
|
|
if(XGR_MouseObj.promptData){
|
|
pr = XGR_MouseObj.promptData -> getData(ACI_ITEM_PROMPT);
|
|
}
|
|
if(pr) pr -> StartX = pr -> StartY = pr -> SizeX = pr -> SizeY = 0;
|
|
|
|
if(curMode != AS_INV_MODE)
|
|
return;
|
|
|
|
bt = get_button(ACI_WPN_PICKUP_BUTTON);
|
|
if(bt){
|
|
if(XGR_MouseObj.promptData){
|
|
bt_pr0 = XGR_MouseObj.promptData -> getData(ACI_PICKUP_WPN_ON);
|
|
bt_pr1 = XGR_MouseObj.promptData -> getData(ACI_PICKUP_WPN_OFF);
|
|
if(!bt_pr1){
|
|
bt_pr1 = new XGR_MousePromptData;
|
|
bt_pr1 -> set_text(aciSTR_PICKUP_WEAPONS_OFF);
|
|
bt_pr1 -> ID = ACI_PICKUP_WPN_OFF;
|
|
XGR_MouseObj.promptData -> AddElement((XListElement*)bt_pr1);
|
|
}
|
|
if(bt -> flags & B_PRESSED){
|
|
if(bt_pr0) bt_pr0 -> StartX = bt_pr0 -> StartY = bt_pr0 -> SizeX = bt_pr0 -> SizeY = 0;
|
|
bt_pr1 -> StartX = bt -> PosX;
|
|
bt_pr1 -> StartY = bt -> PosY;
|
|
|
|
bt_pr1 -> SizeX = bt -> SizeX;
|
|
bt_pr1 -> SizeY = bt -> SizeY;
|
|
}
|
|
else {
|
|
if(bt_pr1) bt_pr1 -> StartX = bt_pr1 -> StartY = bt_pr1 -> SizeX = bt_pr1 -> SizeY = 0;
|
|
if(bt_pr0){
|
|
bt_pr0 -> StartX = bt -> PosX;
|
|
bt_pr0 -> StartY = bt -> PosY;
|
|
|
|
bt_pr0 -> SizeX = bt -> SizeX;
|
|
bt_pr0 -> SizeY = bt -> SizeY;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
bt = get_button(ACI_ITM_PICKUP_BUTTON);
|
|
if(bt){
|
|
if(XGR_MouseObj.promptData){
|
|
bt_pr0 = XGR_MouseObj.promptData -> getData(ACI_PICKUP_ITM_ON);
|
|
bt_pr1 = XGR_MouseObj.promptData -> getData(ACI_PICKUP_ITM_OFF);
|
|
if(!bt_pr1){
|
|
bt_pr1 = new XGR_MousePromptData;
|
|
bt_pr1 -> set_text(aciSTR_PICKUP_ITEMS_OFF);
|
|
bt_pr1 -> ID = ACI_PICKUP_ITM_OFF;
|
|
XGR_MouseObj.promptData -> AddElement((XListElement*)bt_pr1);
|
|
}
|
|
if(bt -> flags & B_PRESSED){
|
|
if(bt_pr0) bt_pr0 -> StartX = bt_pr0 -> StartY = bt_pr0 -> SizeX = bt_pr0 -> SizeY = 0;
|
|
bt_pr1 -> StartX = bt -> PosX;
|
|
bt_pr1 -> StartY = bt -> PosY;
|
|
|
|
bt_pr1 -> SizeX = bt -> SizeX;
|
|
bt_pr1 -> SizeY = bt -> SizeY;
|
|
}
|
|
else {
|
|
if(bt_pr1) bt_pr1 -> StartX = bt_pr1 -> StartY = bt_pr1 -> SizeX = bt_pr1 -> SizeY = 0;
|
|
if(bt_pr0){
|
|
bt_pr0 -> StartX = bt -> PosX;
|
|
bt_pr0 -> StartY = bt -> PosY;
|
|
|
|
bt_pr0 -> SizeX = bt -> SizeX;
|
|
bt_pr0 -> SizeY = bt -> SizeY;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if(flags & aMS_MOVED)
|
|
curMatrix -> clear_shadow_cells();
|
|
|
|
x = iMouseX;
|
|
y = iMouseY;
|
|
|
|
float scaleX = XGR_Obj.get_screen_scale_x();
|
|
float scaleY = XGR_Obj.get_screen_scale_y();
|
|
|
|
ix = curIbs -> PosX / scaleX;
|
|
iy = curIbs -> PosY / scaleY;
|
|
|
|
isx = ix + curIbs -> SizeX * scaleX;
|
|
isy = iy + curIbs -> SizeY * scaleY;
|
|
|
|
if(x >= ix && x < isx && y >= iy && y < isy){
|
|
id = aciGetScreenItem(x,y);
|
|
if(id != -1){
|
|
p = get_item(id);
|
|
if(iP){
|
|
if(p){
|
|
iP -> free_list();
|
|
iP -> add_item(p->ID_ptr.c_str(),-1,aciCurColorScheme[FM_SELECT_COL]);
|
|
iP -> add_items(p -> numComments,p -> comments);
|
|
iP -> set_redraw();
|
|
}
|
|
else {
|
|
XBuf = new XBuffer;
|
|
*XBuf < "Undefined item, ID = " <= id;
|
|
ptr = XBuf -> address();
|
|
iP -> free_list();
|
|
iP -> add_item(ptr,-1,aciCurColorScheme[FM_SELECT_COL]);
|
|
iP -> set_redraw();
|
|
delete XBuf;
|
|
}
|
|
}
|
|
}
|
|
if(id == -1){
|
|
if(aciGetScreenMechos(x,y)){
|
|
if(iP -> items -> Size){
|
|
iP -> free_list();
|
|
iP -> set_redraw();
|
|
}
|
|
if(curMatrix && curMatrix -> mech_name)
|
|
iP -> add_item(curMatrix -> mech_name,-1,aciCurColorScheme[FM_SELECT_COL]);
|
|
}
|
|
else {
|
|
if(iP -> items -> Size){
|
|
iP -> free_list();
|
|
iP -> set_redraw();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
if(curMatrix && curMatrix -> check_xy(iMouseX,iMouseY)){
|
|
if(flags & AS_INV_MOVE_ITEM){
|
|
x = iMouseX - curMatrix -> ScreenX - (curItem -> ShapeSizeX >> 1) + curItem -> ShapeCenterX;
|
|
y = iMouseY - curMatrix -> ScreenY - (curItem -> ShapeSizeY >> 1) + curItem -> ShapeCenterY;
|
|
|
|
y /= aCellSize - (aCellSize >> 2);
|
|
|
|
if(y & 0x01) x -= (aCellSize >> 1);
|
|
x /= aCellSize;
|
|
}
|
|
else {
|
|
x = iMouseX - curMatrix -> ScreenX;
|
|
y = iMouseY - curMatrix -> ScreenY;
|
|
|
|
y /= aCellSize - (aCellSize >> 2);
|
|
|
|
if(y & 0x01) x -= (aCellSize >> 1);
|
|
x /= aCellSize;
|
|
}
|
|
|
|
if(x >= 0 && x < curMatrix -> SizeX && y >= 0 && y < curMatrix -> SizeY){
|
|
if(flags & AS_INV_MOVE_ITEM){
|
|
if(curMatrix -> check_fit(x,y,curItem)){
|
|
curMatrix -> put_item_shadow(x,y,curItem);
|
|
}
|
|
else {
|
|
p = curMatrix -> get_area_item(x,y,curItem);
|
|
if(p){
|
|
curMatrix -> remove_item(p,1);
|
|
if(curMatrix -> check_fit(x,y,curItem))
|
|
curMatrix -> put_item_shadow(x,y,curItem);
|
|
curMatrix -> put_item(p -> MatrixX,p -> MatrixY,p,1);
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
if(iP){
|
|
p = curMatrix -> get_item(x,y);
|
|
if(p){
|
|
if(iP -> items -> Size){
|
|
iP -> free_list();
|
|
iP -> set_redraw();
|
|
}
|
|
iP -> add_item(p->ID_ptr.c_str(),-1,aciCurColorScheme[FM_SELECT_COL]);
|
|
iP -> add_items(p -> numComments,p -> comments);
|
|
if(p -> pTemplate)
|
|
iP -> add_item(aciGetItemLoad(p,0));
|
|
if(p -> promptData && XGR_MouseObj.promptData){
|
|
if(!pr){
|
|
pr = new XGR_MousePromptData;
|
|
pr -> ID = ACI_ITEM_PROMPT;
|
|
XGR_MouseObj.promptData -> AddElement((XListElement*)pr);
|
|
}
|
|
pr -> set_text(p -> promptData);
|
|
curMatrix -> get_item_coords(p,pr -> StartX,pr -> StartY,pr -> SizeX,pr -> SizeY);
|
|
}
|
|
}
|
|
else {
|
|
if(!(flags & AS_INV_MOVE_ITEM)){
|
|
if(iP -> items -> Size){
|
|
iP -> free_list();
|
|
iP -> set_redraw();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
if(!(flags & AS_INV_MOVE_ITEM)){
|
|
if(iP){
|
|
if(iP -> items -> Size){
|
|
iP -> free_list();
|
|
iP -> set_redraw();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if(flags & aMS_MOVED){
|
|
if(curMode == AS_INV_MODE && curMatrix && curMatrix -> check_redraw()){
|
|
curMatrix -> flags |= IM_REDRAW_SHADOW;
|
|
}
|
|
}
|
|
}
|
|
|
|
void actIntDispatcher::inv_mouse_imove_quant(void)
|
|
{
|
|
int mx,my,x,y;
|
|
invItem* p = NULL;
|
|
invItem* p1 = NULL;
|
|
iScreenObject* obj;
|
|
|
|
int cr = aciGetCurCredits();
|
|
|
|
XGR_MousePromptData* pr = NULL,*pr0 = NULL,*pr1,*avi_pr1,*avi_pr2;
|
|
if(XGR_MouseObj.promptData){
|
|
pr = XGR_MouseObj.promptData -> getData(ACI_NO_CASH_PROMPT);
|
|
pr0 = XGR_MouseObj.promptData -> getData(ACI_NO_CASH_PROMPT2);
|
|
pr1 = XGR_MouseObj.promptData -> getData(ACI_BT15_PROMPT);
|
|
|
|
avi_pr1 = XGR_MouseObj.promptData -> getData(ACI_AVI_PROMPT1);
|
|
if(avi_pr1){
|
|
avi_pr2 = XGR_MouseObj.promptData -> getData(ACI_AVI_PROMPT2);
|
|
if(!avi_pr2){
|
|
avi_pr2 = new XGR_MousePromptData;
|
|
avi_pr2 -> ID = ACI_AVI_PROMPT2;
|
|
XGR_MouseObj.promptData -> AddElement((XListElement*)avi_pr2);
|
|
avi_pr2 -> set_text(aciSTR_PutThis);
|
|
}
|
|
obj = (iScreenObject*)curLocData -> objList[ACI_AVI_OBJ_ID];
|
|
if(flags & AS_INV_MOVE_ITEM){
|
|
avi_pr2 -> StartX = obj -> PosX;
|
|
avi_pr2 -> StartY = obj -> PosY;
|
|
|
|
avi_pr2 -> SizeX = obj -> SizeX;
|
|
avi_pr2 -> SizeY = obj -> SizeY;
|
|
|
|
avi_pr1 -> StartX = avi_pr1 -> StartY = 0;
|
|
avi_pr1 -> SizeX = avi_pr1 -> SizeY = 0;
|
|
}
|
|
else {
|
|
avi_pr1 -> StartX = obj -> PosX;
|
|
avi_pr1 -> StartY = obj -> PosY;
|
|
|
|
avi_pr1 -> SizeX = obj -> SizeX;
|
|
avi_pr1 -> SizeY = obj -> SizeY;
|
|
|
|
avi_pr2 -> StartX = avi_pr2 -> StartY = 0;
|
|
avi_pr2 -> SizeX = avi_pr2 -> SizeY = 0;
|
|
}
|
|
}
|
|
}
|
|
if(pr) pr -> StartX = pr -> StartY = pr -> SizeX = pr -> SizeY = 0;
|
|
|
|
if(!pr0){
|
|
pr0 = new XGR_MousePromptData;
|
|
pr0 -> ID = ACI_NO_CASH_PROMPT2;
|
|
XGR_MouseObj.promptData -> AddElement((XListElement*)pr0);
|
|
pr0 -> set_text(aciSTR_NO_CASH);
|
|
}
|
|
|
|
if(secondMatrix){
|
|
obj = (iScreenObject*)iGetObject(iScrDisp->curScr->ID_ptr.c_str(),"Button15");
|
|
if(((uvsActInt*)secondMatrix -> uvsDataPtr) -> price > cr + aciGetCurMatrixPrice()){
|
|
if(pr0){
|
|
pr0 -> StartX = obj -> PosX;
|
|
pr0 -> StartY = obj -> PosY;
|
|
|
|
pr0 -> SizeX = obj -> SizeX;
|
|
pr0 -> SizeY = obj -> SizeY;
|
|
}
|
|
if(pr1){
|
|
pr1 -> StartX = 0;
|
|
pr1 -> StartY = 0;
|
|
|
|
pr1 -> SizeX = 0;
|
|
pr1 -> SizeY = 0;
|
|
}
|
|
}
|
|
else {
|
|
if(pr1){
|
|
pr1 -> StartX = obj -> PosX;
|
|
pr1 -> StartY = obj -> PosY;
|
|
|
|
pr1 -> SizeX = obj -> SizeX;
|
|
pr1 -> SizeY = obj -> SizeY;
|
|
}
|
|
if(pr0){
|
|
pr0 -> StartX = 0;
|
|
pr0 -> StartY = 0;
|
|
|
|
pr0 -> SizeX = 0;
|
|
pr0 -> SizeY = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
if(flags & aMS_MOVED){
|
|
if(curMatrix) curMatrix -> clear_shadow_cells();
|
|
if(secondMatrix) secondMatrix -> clear_shadow_cells();
|
|
}
|
|
|
|
mx = iMouseX;
|
|
my = iMouseY;
|
|
|
|
if(flags & AS_ISCREEN)
|
|
mx += iScreenOffs - 800;
|
|
|
|
if(flags & AS_INV_MOVE_ITEM){
|
|
if(curItem -> flags & INV_ITEM_NO_PAY && ((uvsActInt*)curItem -> uvsDataPtr) -> price > cr){
|
|
if(!pr){
|
|
pr = new XGR_MousePromptData;
|
|
pr -> ID = ACI_NO_CASH_PROMPT;
|
|
XGR_MouseObj.promptData -> AddElement((XListElement*)pr);
|
|
pr -> set_text(aciSTR_NO_CASH);
|
|
}
|
|
pr -> StartX = curMatrix -> ScreenX + iScreenOffs;
|
|
pr -> StartY = curMatrix -> ScreenY;
|
|
|
|
pr -> SizeX = curMatrix -> ScreenSizeX;
|
|
pr -> SizeY = curMatrix -> ScreenSizeY;
|
|
}
|
|
}
|
|
|
|
if(curMatrix && curMatrix -> check_xy(mx,my)){
|
|
if(flags & AS_INV_MOVE_ITEM){
|
|
x = iMouseX - curMatrix -> ScreenX - (curItem -> ShapeSizeX >> 1) + curItem -> ShapeCenterX;
|
|
y = iMouseY - curMatrix -> ScreenY - (curItem -> ShapeSizeY >> 1) + curItem -> ShapeCenterY;
|
|
|
|
x += iScreenOffs - 800;
|
|
|
|
y /= aCellSize - (aCellSize >> 2);
|
|
|
|
if(y & 0x01) x -= (aCellSize >> 1);
|
|
x /= aCellSize;
|
|
}
|
|
else {
|
|
x = iMouseX - curMatrix -> ScreenX;
|
|
y = iMouseY - curMatrix -> ScreenY;
|
|
|
|
x += iScreenOffs - 800;
|
|
|
|
y /= aCellSize - (aCellSize >> 2);
|
|
|
|
if(y & 0x01) x -= (aCellSize >> 1);
|
|
x /= aCellSize;
|
|
}
|
|
|
|
if(x >= 0 && x < curMatrix -> SizeX && y >= 0 && y < curMatrix -> SizeY){
|
|
if(flags & AS_INV_MOVE_ITEM){
|
|
if(curMatrix -> check_fit(x,y,curItem)){
|
|
curMatrix -> put_item_shadow(x,y,curItem);
|
|
}
|
|
else {
|
|
p = curMatrix -> get_area_item(x,y,curItem);
|
|
if(p){
|
|
curMatrix -> remove_item(p,1);
|
|
if(curMatrix -> check_fit(x,y,curItem))
|
|
curMatrix -> put_item_shadow(x,y,curItem);
|
|
curMatrix -> put_item(p -> MatrixX,p -> MatrixY,p,1);
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
if(iP){
|
|
p = curMatrix -> get_item(x,y);
|
|
if(iP -> items -> Size){
|
|
iP -> free_list();
|
|
iP -> set_redraw();
|
|
}
|
|
if(p){
|
|
p1 = get_iitem(p -> ID);
|
|
iP -> add_item(p1->ID_ptr.c_str(),-1,aciCurColorScheme[FM_SELECT_COL]);
|
|
iP -> add_items(p1 -> numComments,p1 -> comments);
|
|
if(p1 -> pTemplate)
|
|
iP -> add_item(aciGetItemLoad(p,1));
|
|
if(!uvsCurrentWorldUnable)
|
|
iP -> add_item(aciGetPrice((iListElement*)p,ITEMS_MODE,1));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
if(secondMatrix && secondMatrix -> check_xy(mx,my)){
|
|
if(flags & AS_INV_MOVE_ITEM){
|
|
x = iMouseX - secondMatrix -> ScreenX - (curItem -> ShapeSizeX >> 1) + curItem -> ShapeCenterX;
|
|
y = iMouseY - secondMatrix -> ScreenY - (curItem -> ShapeSizeY >> 1) + curItem -> ShapeCenterY;
|
|
|
|
x += iScreenOffs - 800;
|
|
|
|
y /= aCellSize - (aCellSize >> 2);
|
|
|
|
if(y & 0x01) x -= (aCellSize >> 1);
|
|
x /= aCellSize;
|
|
}
|
|
else {
|
|
x = iMouseX - secondMatrix -> ScreenX;
|
|
y = iMouseY - secondMatrix -> ScreenY;
|
|
|
|
x += iScreenOffs - 800;
|
|
|
|
y /= aCellSize - (aCellSize >> 2);
|
|
|
|
if(y & 0x01) x -= (aCellSize >> 1);
|
|
x /= aCellSize;
|
|
}
|
|
|
|
if(x >= 0 && x < secondMatrix -> SizeX && y >= 0 && y < secondMatrix -> SizeY){
|
|
if(flags & AS_INV_MOVE_ITEM){
|
|
if(secondMatrix -> check_fit(x,y,curItem)){
|
|
secondMatrix -> put_item_shadow(x,y,curItem);
|
|
}
|
|
else {
|
|
p = secondMatrix -> get_area_item(x,y,curItem);
|
|
if(p){
|
|
secondMatrix -> remove_item(p,1);
|
|
if(secondMatrix -> check_fit(x,y,curItem))
|
|
secondMatrix -> put_item_shadow(x,y,curItem);
|
|
secondMatrix -> put_item(p -> MatrixX,p -> MatrixY,p,1);
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
if(iP){
|
|
p = secondMatrix -> get_item(x,y);
|
|
if(iP -> items -> Size){
|
|
iP -> free_list();
|
|
iP -> set_redraw();
|
|
}
|
|
if(p){
|
|
iP -> add_item(p->ID_ptr.c_str(),-1,aciCurColorScheme[FM_SELECT_COL]);
|
|
iP -> add_items(p -> numComments,p -> comments);
|
|
if(p -> pTemplate)
|
|
iP -> add_item(aciGetItemLoad(p,1));
|
|
if(!uvsCurrentWorldUnable)
|
|
iP -> add_item(aciGetPrice((iListElement*)p,ITEMS_MODE,1));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
if(!(flags & AS_INV_MOVE_ITEM)){
|
|
if(iP){
|
|
if(iP -> items -> Size){
|
|
iP -> free_list();
|
|
iP -> set_redraw();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if(flags & aMS_MOVED){
|
|
if(curMatrix && curMatrix -> check_redraw()){
|
|
curMatrix -> flags |= IM_REDRAW_SHADOW;
|
|
}
|
|
if(secondMatrix && secondMatrix -> check_redraw()){
|
|
secondMatrix -> flags |= IM_REDRAW_SHADOW;
|
|
}
|
|
}
|
|
if(iP){
|
|
if(!iP -> items -> Size){
|
|
aciInitMechosInfo(curMatrix,iP);
|
|
}
|
|
}
|
|
}
|
|
|
|
int invMatrix::check_redraw(void)
|
|
{
|
|
int i,j,index = 0;
|
|
for(i = 0; i < SizeY; i ++){
|
|
for(j = 0; j < SizeX; j ++){
|
|
if(matrix[index] -> flags & (AS_IN_SHADOW | AS_REDRAW_CELL))
|
|
return 1;
|
|
index ++;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
void CounterPanel::init(void)
|
|
{
|
|
if(ibs_name){
|
|
if(!ibs) ibs = new ibsObject;
|
|
ibs -> load(ibs_name);
|
|
ibs -> PosX = this->PosX;
|
|
ibs -> PosY = this->PosY;
|
|
}
|
|
SizeX = MaxLen * (aCellSize + 1);
|
|
SizeY = aCellSize + 1;
|
|
|
|
switch(ID){
|
|
case CREDITS_COUNTER:
|
|
value_ptr = &aciCurCredits00;
|
|
break;
|
|
case TIME_COUNTER:
|
|
value_ptr = &aciCurTime;
|
|
break;
|
|
}
|
|
}
|
|
|
|
void CounterPanel::finit(void)
|
|
{
|
|
if(ibs_name){
|
|
ibs -> free();
|
|
}
|
|
}
|
|
|
|
void actIntDispatcher::trade_items(invMatrix* p,int imode)
|
|
{
|
|
int cnt = 1,x,y,fl;
|
|
invItem* it,*it1,*itm;
|
|
|
|
it = (invItem*)curMatrix -> items -> last;
|
|
while(it){
|
|
it1 = (invItem*)it -> prev;
|
|
|
|
cnt = it -> dropCount;
|
|
x = it -> MatrixX;
|
|
y = it -> MatrixY;
|
|
fl = it -> flags;
|
|
|
|
curMatrix -> remove_item(it,1);
|
|
|
|
if(imode)
|
|
itm = get_iitem(it -> ID);
|
|
else
|
|
itm = get_item(it -> ID);
|
|
|
|
if(!itm)
|
|
ErrH.Abort("Bad item ptr...");
|
|
|
|
itm -> clone(it);
|
|
if(!p -> put_item(x,y,it,1))
|
|
ErrH.Abort("Bad trade item...");
|
|
|
|
it -> dropCount = cnt;
|
|
it -> flags = fl;
|
|
it = it1;
|
|
}
|
|
}
|
|
|
|
void actIntDispatcher::reinit_items(void)
|
|
{
|
|
int id;
|
|
invItem* p = (invItem*)curMatrix -> items -> last;
|
|
actintItemData* d;
|
|
|
|
while(p){
|
|
if(p -> slotType != -1){
|
|
id = curMatrix -> get_item_slot(p);
|
|
d = p -> item_ptr;
|
|
if(id != -1)
|
|
aciSendEvent2itmdsp(ACI_ACTIVATE_ITEM,d,id);
|
|
}
|
|
p = (invItem*)p -> prev;
|
|
}
|
|
}
|
|
|
|
void actIntDispatcher::deactivate_items(void)
|
|
{
|
|
int id;
|
|
if(!curMatrix) return;
|
|
invItem* p = (invItem*)curMatrix -> items -> last;
|
|
actintItemData* d;
|
|
|
|
while(p){
|
|
if(p -> slotType != -1){
|
|
id = curMatrix -> get_item_slot(p);
|
|
d = p -> item_ptr;
|
|
if(id != -1)
|
|
aciSendEvent2itmdsp(ACI_DEACTIVATE_ITEM,d,id);
|
|
}
|
|
p = (invItem*)p -> prev;
|
|
}
|
|
}
|
|
|
|
int invMatrix::check_xy(int x,int y)
|
|
{
|
|
if(x >= ScreenX && x < ScreenX + ScreenSizeX && y >= ScreenY && y < ScreenY + ScreenSizeY)
|
|
return 1;
|
|
return 0;
|
|
}
|
|
|
|
void CounterPanel::move(int delta)
|
|
{
|
|
PosX -= delta;
|
|
if(ibs){
|
|
ibs -> CenterX -= delta;
|
|
ibs -> PosX -= delta;
|
|
}
|
|
}
|
|
|
|
void InfoPanel::move(int delta)
|
|
{
|
|
PosX -= delta;
|
|
if(ibs){
|
|
ibs -> CenterX -= delta;
|
|
ibs -> PosX -= delta;
|
|
}
|
|
if(bml) bml -> OffsX -= delta;
|
|
}
|
|
|
|
void invMatrix::clone(invMatrix* p)
|
|
{
|
|
int i;
|
|
|
|
p -> pData = pData;
|
|
p -> internalID = internalID;
|
|
|
|
p -> type = type;
|
|
p -> flags = flags;
|
|
|
|
p -> SizeX = SizeX;
|
|
p -> SizeY = SizeY;
|
|
|
|
p -> ScreenX = ScreenX;
|
|
p -> ScreenY = ScreenY;
|
|
|
|
p -> ScreenSizeX = ScreenSizeX;
|
|
p -> ScreenSizeY = ScreenSizeY;
|
|
|
|
p -> back = back;
|
|
p -> mech_name = mech_name;
|
|
|
|
p -> maxLoad = maxLoad;
|
|
|
|
for(i = 0; i < SizeX * SizeY; i ++){
|
|
p -> matrix[i] -> type = matrix[i] -> type;
|
|
p -> matrix[i] -> flags = 0;
|
|
|
|
p -> matrix[i] -> slotType = matrix[i] -> slotType;
|
|
p -> matrix[i] -> slotNumber = matrix[i] -> slotNumber;
|
|
p -> matrix[i] -> item = NULL;
|
|
}
|
|
|
|
p -> uvsDataPtr = uvsDataPtr;
|
|
p -> numAviIDs = numAviIDs;
|
|
p -> avi_ids = avi_ids;
|
|
|
|
p -> flags |= IM_CLONE;
|
|
}
|
|
|
|
void invMatrix::backup(invMatrix* p)
|
|
{
|
|
invItem* itm,*t;
|
|
clone(p);
|
|
|
|
itm = (invItem*)items -> last;
|
|
while(itm){
|
|
t = aScrDisp -> alloc_item();
|
|
itm -> clone(t);
|
|
t -> dropCount = itm -> dropCount;
|
|
t -> uvsDataPtr = itm -> uvsDataPtr;
|
|
p -> put_item(itm -> MatrixX,itm -> MatrixY,t,1);
|
|
itm = (invItem*)itm -> prev;
|
|
}
|
|
}
|
|
|
|
invItem* actIntDispatcher::alloc_item(void)
|
|
{
|
|
invItem* p = new invItem;
|
|
/*
|
|
if(!freeItemList -> Size){
|
|
p = new invItem;
|
|
}
|
|
else {
|
|
p = (invItem*)freeItemList -> last;
|
|
freeItemList -> dconnect((iListElement*)p);
|
|
}
|
|
*/
|
|
return p;
|
|
}
|
|
|
|
invMatrix* actIntDispatcher::alloc_matrix(int type,int imode)
|
|
{
|
|
invMatrix* t,*p;
|
|
t = (imode) ? get_imatrix(type) : get_matrix(type);
|
|
if(!t) return NULL;
|
|
/*
|
|
p = (invMatrix*)freeMatrixList -> last;
|
|
while(p){
|
|
if(p -> SizeX == t -> SizeX && p -> SizeY == t -> SizeY){
|
|
t -> clone(p);
|
|
freeMatrixList -> dconnect(p);
|
|
return p;
|
|
}
|
|
p = (invMatrix*)p -> prev;
|
|
}
|
|
*/
|
|
p = new invMatrix(t -> SizeX,t -> SizeY);
|
|
t -> clone(p);
|
|
return p;
|
|
}
|
|
|
|
void actIntDispatcher::free_item(invItem* p)
|
|
{
|
|
delete p;
|
|
// freeItemList -> connect((iListElement*)p);
|
|
}
|
|
|
|
void actIntDispatcher::free_matrix(invMatrix* p)
|
|
{
|
|
invItem* itm,*itm1;
|
|
itm = (invItem*)p -> items -> last;
|
|
while(itm){
|
|
itm1 = (invItem*)itm -> prev;
|
|
p -> items -> dconnect((iListElement*)itm);
|
|
free_item(itm);
|
|
itm = itm1;
|
|
}
|
|
delete p;
|
|
// freeMatrixList -> connect((iListElement*)p);
|
|
}
|
|
|
|
invItem* actIntDispatcher::get_item_ptr(int id)
|
|
{
|
|
if(!curMatrix) return NULL;
|
|
invItem* p = (invItem*)curMatrix -> items -> last;
|
|
while(p){
|
|
if(p -> ID == id && !p -> item_ptr)
|
|
return p;
|
|
p = (invItem*)p -> prev;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
invItem* actIntDispatcher::get_item_ptr_xy(int id,int x,int y)
|
|
{
|
|
if(!curMatrix) return NULL;
|
|
invItem* p = (invItem*)curMatrix -> items -> last;
|
|
|
|
while(p){
|
|
if(p -> ID == id && !p -> item_ptr && p -> MatrixX == x && p -> MatrixY == y)
|
|
return p;
|
|
p = (invItem*)p -> prev;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
void actIntDispatcher::calc_load(void)
|
|
{
|
|
int i,sz;
|
|
if(!curMatrix) return;
|
|
sz = curMatrix -> SizeX * curMatrix -> SizeY;
|
|
aciCurLoad = 0;
|
|
for(i = 0; i < sz; i ++){
|
|
if(curMatrix -> matrix[i] -> flags & AS_BUSY_CELL) aciCurLoad ++;
|
|
}
|
|
aciMaxLoad = curMatrix -> maxLoad;
|
|
}
|
|
|
|
InfoPanel* actIntDispatcher::get_info_panel(int id)
|
|
{
|
|
InfoPanel* p = (InfoPanel*)i_infoPanels -> last;
|
|
while(p){
|
|
if(p -> type == id)
|
|
return p;
|
|
p = (InfoPanel*)p -> prev;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
InfoPanel* actIntDispatcher::get_aci_info_panel(int id)
|
|
{
|
|
InfoPanel* p = (InfoPanel*)infoPanels -> last;
|
|
while(p){
|
|
if(p -> type == id)
|
|
return p;
|
|
p = (InfoPanel*)p -> prev;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
void aciWorldMap::calc_shapes(void)
|
|
{
|
|
int i;
|
|
XStream fh;
|
|
if(!ShapeSizeX) ShapeSizeX = new short[3];
|
|
if(!ShapeSizeY) ShapeSizeY = new short[3];
|
|
if(!shapes){
|
|
shapes = new unsigned char*[3];
|
|
for(i = 0; i < 3; i ++){
|
|
if(!shape_files[i]) ErrH.Abort("Map shape file not found...");
|
|
|
|
fh.open(shape_files[i]);
|
|
fh > ShapeSizeX[i] > ShapeSizeY[i];
|
|
shapes[i] = new unsigned char[ShapeSizeX[i] * ShapeSizeY[i]];
|
|
fh.read(shapes[i],ShapeSizeX[i] * ShapeSizeY[i]);
|
|
fh.close();
|
|
}
|
|
}
|
|
}
|
|
|
|
void aciWorldMap::show_link(int w1,int w2)
|
|
{
|
|
int col;
|
|
if(!world_ptr[w1] || !world_ptr[w2]) return;
|
|
|
|
if(world_ptr[w1] -> flags & AS_ACCESSIBLE_WORLD && world_ptr[w2] -> flags & AS_CURRENT_WORLD){
|
|
col = aciCurColorScheme[WORLD_ACC_LINK_COL];
|
|
}
|
|
else {
|
|
if(world_ptr[w1] -> flags & AS_CURRENT_WORLD && world_ptr[w2] -> flags & AS_ACCESSIBLE_WORLD){
|
|
col = aciCurColorScheme[WORLD_ACC_LINK_COL];
|
|
}
|
|
else {
|
|
col = aciCurColorScheme[WORLD_LINK_COL];
|
|
}
|
|
}
|
|
a_buf_line2(world_ptr[w1] -> PosX,world_ptr[w1] -> PosY,world_ptr[w2] -> PosX,world_ptr[w2] -> PosY,col,SizeX,SizeY,redraw_buf);
|
|
}
|
|
|
|
#define WORLD_COORD_MAX 1000
|
|
void aciWorldMap::remap_coords(void)
|
|
{
|
|
int x,y;
|
|
aciWorldInfo* p = (aciWorldInfo*)world_list -> last;
|
|
if(flags & WMAP_REMAP_COORDS)
|
|
return;
|
|
while(p){
|
|
x = (p -> PosX * SizeX) / WORLD_COORD_MAX;
|
|
y = (p -> PosY * SizeY) / WORLD_COORD_MAX;
|
|
|
|
p -> PosX = x;
|
|
p -> PosY = y;
|
|
|
|
p = (aciWorldInfo*)p -> prev;
|
|
}
|
|
JumpCountSizeX = (JUMP_SIZE_X * SizeX) / WORLD_COORD_MAX;
|
|
JumpCountSizeY = (JUMP_SIZE_Y * SizeY) / WORLD_COORD_MAX;
|
|
|
|
JumpCountX = (SizeX - JumpCountSizeX) / 2;
|
|
JumpCountY = (JUMP_Y * SizeY) / WORLD_COORD_MAX;
|
|
|
|
flags |= WMAP_REMAP_COORDS;
|
|
}
|
|
|
|
//TODO need fast malloc
|
|
void aciWorldInfo::redraw(int bsx,int bsy,unsigned char* buf)
|
|
{
|
|
int x,y,sx,sy,ox,oy;
|
|
int border_col = 0,floor_col = 0;
|
|
|
|
unsigned char* shape,*shape1;
|
|
aciWorldMap* p = (aciWorldMap*)owner;
|
|
|
|
if(flags & AS_SECRET_WORLD && !(flags & AS_VISIBLE_WORLD))
|
|
return;
|
|
|
|
floor_col = aciCurColorScheme[ACI_BACK_COL];
|
|
|
|
if(flags & AS_VISIBLE_WORLD){
|
|
border_col = aciCurColorScheme[WORLD_BORDER_VIS_COL];
|
|
floor_col = aciCurColorScheme[WORLD_VISIBLE_COL];
|
|
}
|
|
if(flags & AS_SPECIAL_WORLD){
|
|
border_col = aciCurColorScheme[WORLD_BORDER_SPC_COL];
|
|
floor_col = aciCurColorScheme[WORLD_SPECIAL_COL];
|
|
}
|
|
if(flags & AS_EXPLORED_WORLD){
|
|
border_col = aciCurColorScheme[WORLD_BORDER_EXP_COL];
|
|
floor_col = aciCurColorScheme[WORLD_EXPLORED_COL];
|
|
}
|
|
if(flags & AS_CURRENT_WORLD){
|
|
border_col = aciCurColorScheme[WORLD_BORDER_CUR_COL];
|
|
floor_col = aciCurColorScheme[WORLD_CURRENT_COL];
|
|
}
|
|
// if(flags & AS_ACCESSIBLE_WORLD){
|
|
// border_col = aciCurColorScheme[WORLD_BORDER_ACC_COL];
|
|
// floor_col = aciCurColorScheme[WORLD_ACCESSIBLE_COL];
|
|
// }
|
|
|
|
sx = p -> ShapeSizeX[shape_id];
|
|
sy = p -> ShapeSizeY[shape_id];
|
|
shape = p -> shapes[shape_id];
|
|
|
|
ox = p -> ShapeOffsX[shape_id];
|
|
oy = p -> ShapeOffsY[shape_id];
|
|
|
|
shape1 = new unsigned char[sx * sy];
|
|
memcpy(shape1,shape,sx * sy);
|
|
|
|
x = PosX - sx/2;
|
|
y = PosY - sy/2;
|
|
|
|
swap_buf_col(2,border_col,sx,sy,shape1);
|
|
swap_buf_col(1,floor_col,sx,sy,shape1);
|
|
mem_putspr(x,y,sx,sy,bsx,bsy,shape1,buf);
|
|
|
|
x = PosX - (aScrFonts[font] -> SizeX >> 1) + ox;
|
|
y = PosY - (aScrFonts[font] -> SizeY >> 1) + oy;
|
|
|
|
aPutChar(x,y,font,border_col,letter,bsx,bsy,buf);
|
|
delete[] shape1;
|
|
}
|
|
|
|
fncMenuItem* actIntDispatcher::alloc_menu_item(void)
|
|
{
|
|
fncMenuItem* p = new fncMenuItem;
|
|
/*
|
|
if(!freeMenuItemList -> Size){
|
|
p = new fncMenuItem;
|
|
}
|
|
else {
|
|
p = (fncMenuItem*)freeMenuItemList -> last;
|
|
freeMenuItemList -> dconnect((iListElement*)p);
|
|
}
|
|
*/
|
|
return p;
|
|
}
|
|
|
|
void actIntDispatcher::free_menu_item(fncMenuItem* p)
|
|
{
|
|
delete p;
|
|
// freeMenuItemList -> connect((iListElement*)p);
|
|
}
|
|
|
|
CounterPanel* actIntDispatcher::get_counter(int id)
|
|
{
|
|
CounterPanel* p;
|
|
p = (CounterPanel*)intCounters -> last;
|
|
while(p){
|
|
if(p -> ID == id)
|
|
return p;
|
|
p = (CounterPanel*)p -> prev;
|
|
}
|
|
p = (CounterPanel*)invCounters -> last;
|
|
while(p){
|
|
if(p -> ID == id)
|
|
return p;
|
|
p = (CounterPanel*)p -> prev;
|
|
}
|
|
p = (CounterPanel*)infCounters -> last;
|
|
while(p){
|
|
if(p -> ID == id)
|
|
return p;
|
|
p = (CounterPanel*)p -> prev;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
CounterPanel* actIntDispatcher::get_icounter(int id)
|
|
{
|
|
CounterPanel* p;
|
|
p = (CounterPanel*)i_Counters -> last;
|
|
while(p){
|
|
if(p -> ID == id)
|
|
return p;
|
|
p = (CounterPanel*)p -> prev;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
void actIntDispatcher::swap_matrices(void)
|
|
{
|
|
int v;
|
|
if(curMatrix){
|
|
aciSell_Matrix(curMatrix);
|
|
if(((uvsActInt*)secondMatrix -> uvsDataPtr) -> price <= 1){
|
|
v = aciGetCurCredits();
|
|
v -= ((uvsActInt*)curMatrix -> uvsDataPtr) -> sell_price;
|
|
aciUpdateCurCredits(v);
|
|
}
|
|
secondMatrix -> ScreenX = curMatrix -> ScreenX;
|
|
free_matrix(curMatrix);
|
|
free_matrix(backupMatrix);
|
|
}
|
|
else {
|
|
secondMatrix -> ScreenX -= 400;
|
|
}
|
|
curMatrix = secondMatrix;
|
|
aciInitCurMatrixPtr();
|
|
secondMatrix = NULL;
|
|
}
|
|
|
|
void actIntDispatcher::cancel_matrix(void)
|
|
{
|
|
invItem* p;
|
|
uvsActInt* u;
|
|
if(flags & AS_INV_MOVE_ITEM){
|
|
flags ^= AS_INV_MOVE_ITEM;
|
|
free_item(curItem);
|
|
restore_mouse_cursor();
|
|
curItem = NULL;
|
|
}
|
|
free_matrix(secondMatrix);
|
|
if(curMatrix){
|
|
backupMatrix -> ScreenX = curMatrix -> ScreenX;
|
|
free_matrix(curMatrix);
|
|
curMatrix = alloc_matrix(backupMatrix -> type,1);
|
|
backupMatrix -> backup(curMatrix);
|
|
p = (invItem*)curMatrix -> items -> last;
|
|
while(p){
|
|
if(p -> uvsDataPtr){
|
|
u = (uvsActInt*)p -> uvsDataPtr;
|
|
|
|
u -> pos_x = p -> MatrixX;
|
|
u -> pos_y = p -> MatrixY;
|
|
}
|
|
p = (invItem*)p -> prev;
|
|
}
|
|
}
|
|
|
|
secondMatrix = NULL;
|
|
}
|
|
|
|
void actIntDispatcher::clear_menu(fncMenu* mn)
|
|
{
|
|
fncMenuItem* p,*p1;
|
|
|
|
p = (fncMenuItem*)mn -> items -> last;
|
|
while(p){
|
|
p1 = (fncMenuItem*)p -> prev;
|
|
mn -> items -> dconnect((iListElement*)p);
|
|
free_menu_item(p);
|
|
p = p1;
|
|
}
|
|
p = (fncMenuItem*)mn -> inactive_items -> last;
|
|
while(p){
|
|
p1 = (fncMenuItem*)p -> prev;
|
|
mn -> inactive_items -> dconnect((iListElement*)p);
|
|
free_menu_item(p);
|
|
p = p1;
|
|
}
|
|
mn -> prefix = NULL;
|
|
mn -> postfix = NULL;
|
|
}
|
|
|
|
void fncMenu::set_prefix(unsigned char* p)
|
|
{
|
|
int psx = 0;
|
|
prefix = p;
|
|
|
|
if(postfix) psx = aStrLen(postfix,curItem -> font,curItem -> space) + FM_PREFIX_DELTA;
|
|
|
|
PrefixSX = aStrLen(p,curItem -> font,curItem -> space);
|
|
PrefixSY = aScrFonts[curItem -> font] -> SizeY;
|
|
|
|
PrefixX = (SizeX - (PrefixSX + curItem -> SizeX + FM_PREFIX_DELTA + psx))/2;
|
|
PrefixDelta = PrefixX + PrefixSX + FM_PREFIX_DELTA - curItem -> PosX;
|
|
|
|
PrefixY = (SizeY - PrefixSY)/2;
|
|
}
|
|
|
|
void fncMenu::set_postfix(unsigned char* p)
|
|
{
|
|
postfix = p;
|
|
}
|
|
|
|
int actIntDispatcher::get_locdata_id(const char* name)
|
|
{
|
|
aciLocationInfo* p = (aciLocationInfo*)locationList -> last;
|
|
while(p){
|
|
if(!strcmp(p -> nameID,name))
|
|
return p -> ID;
|
|
p = (aciLocationInfo*)p -> prev;
|
|
}
|
|
ErrH.Abort("Bad Location name...");
|
|
return -1;
|
|
}
|
|
|
|
/*TODO*/
|
|
void actIntDispatcher::put_in_slot(actintItemData* d)
|
|
{
|
|
int x,y,index = 0,px,py,id;
|
|
int ms_flag = 0;
|
|
invItem* dvc;
|
|
invItem* p = (invItem*)d -> actintOwner;
|
|
|
|
//std::cout<<"actIntDispatcher::put_in_slot "<<p->fname<<std::endl;
|
|
|
|
if(flags & AS_INV_MOVE_ITEM && curItem == p){
|
|
ms_flag = 1;
|
|
}
|
|
else {
|
|
id = curMatrix -> get_item_slot(p);
|
|
if(id == AS_DEVICE_SLOT) return;
|
|
}
|
|
|
|
for(y = 0; y < curMatrix -> SizeY; y ++){
|
|
for(x = 0; x < curMatrix -> SizeX; x ++){
|
|
if(curMatrix -> matrix[index] -> slotType == AS_DEVICE_SLOT){
|
|
if(curMatrix -> check_fit(x,y,p)){
|
|
if(!ms_flag){
|
|
curMatrix -> remove_item(p);
|
|
}
|
|
else {
|
|
flags ^= AS_INV_MOVE_ITEM;
|
|
restore_mouse_cursor();
|
|
curMatrix -> clear_shadow_cells();
|
|
curItem = NULL;
|
|
if(iP){
|
|
iP -> free_list();
|
|
iP -> set_redraw();
|
|
}
|
|
}
|
|
curMatrix -> put_item(x,y,p);
|
|
SOUND_DROP();
|
|
id = curMatrix -> get_item_slot(p);
|
|
aciSendEvent2itmdsp(ACI_ACTIVATE_ITEM,d,id);
|
|
if(curMode == AS_INV_MODE)
|
|
curMatrix -> set_redraw();
|
|
return;
|
|
}
|
|
else {
|
|
dvc = curMatrix -> get_area_item(x,y,p);
|
|
if(dvc){
|
|
curMatrix -> remove_item(dvc);
|
|
if(!curMatrix -> check_fit(x,y,p)){
|
|
curMatrix -> put_item(dvc -> MatrixX,dvc -> MatrixY,dvc);
|
|
return;
|
|
}
|
|
if(!curMatrix -> check_fit(x,y,p)) ErrH.Abort("put_in_slot() failed...");
|
|
if(!ms_flag){
|
|
px = p -> MatrixX;
|
|
py = p -> MatrixY;
|
|
curMatrix -> remove_item(p);
|
|
curMatrix -> put_item(dvc -> MatrixX,dvc -> MatrixY,p);
|
|
curMatrix -> put_item(px,py,dvc);
|
|
SOUND_DROP();
|
|
}
|
|
else {
|
|
curMatrix -> put_item(dvc -> MatrixX,dvc -> MatrixY,p);
|
|
SOUND_DROP();
|
|
curItem = dvc;
|
|
if(iP){
|
|
iP -> free_list();
|
|
iP -> add_item(curItem->ID_ptr.c_str(),-1,aciCurColorScheme[FM_SELECT_COL]);
|
|
iP -> add_items(curItem -> numComments,curItem -> comments);
|
|
if(curItem -> pTemplate)
|
|
iP -> add_item(aciGetItemLoad(curItem,0));
|
|
iP -> set_redraw();
|
|
}
|
|
set_mouse_cursor(dvc -> frame,dvc -> ScreenSizeX,dvc -> ScreenSizeY);
|
|
}
|
|
|
|
aciSendEvent2itmdsp(ACI_DEACTIVATE_ITEM,dvc -> item_ptr);
|
|
|
|
id = curMatrix -> get_item_slot(p);
|
|
aciSendEvent2itmdsp(ACI_ACTIVATE_ITEM,d,id);
|
|
|
|
if(curMode == AS_INV_MODE)
|
|
curMatrix -> set_redraw();
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
index ++;
|
|
}
|
|
}
|
|
}
|
|
|
|
void fncMenu::add_obj(fncMenuItem* p)
|
|
{
|
|
items -> connect((iListElement*)p);
|
|
}
|
|
|
|
void fncMenu::delete_obj(fncMenuItem* p)
|
|
{
|
|
items -> dconnect((iListElement*)p);
|
|
}
|
|
|
|
fncMenuItem* fncMenu::get_obj(const char* ptr)
|
|
{
|
|
fncMenuItem* p = (fncMenuItem*)items -> last;
|
|
while(p){
|
|
if(!strcmp(p -> name,ptr)) return p;
|
|
p = (fncMenuItem*)p -> prev;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
void fncMenu::go2upmenu(int mode)
|
|
{
|
|
if(flags & FM_SUBMENU){
|
|
upMenu -> flags &= ~(FM_HIDDEN | FM_ACTIVE);
|
|
upMenu -> flags |= FM_LOCK;
|
|
upMenu -> curFunction = FMENU_OFF;
|
|
upMenu -> curItem = upMenu -> get_fnc_item(FMENU_OFF);
|
|
|
|
if(mode == AS_INFO_MODE || mode == -1)
|
|
upMenu -> set_redraw();
|
|
flags &= ~(FM_ACTIVE | FM_REDRAW);
|
|
}
|
|
}
|
|
|
|
aciBitmapMenu* actIntDispatcher::get_bmenu(int mn)
|
|
{
|
|
aciBitmapMenu* p = (aciBitmapMenu*)b_menuList -> last;
|
|
while(p){
|
|
if(p -> ID == mn) return p;
|
|
p = (aciBitmapMenu*)p -> prev;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
void actIntDispatcher::add_bmenu(aciBitmapMenu* p)
|
|
{
|
|
b_menuList -> connect((iListElement*)p);
|
|
}
|
|
|
|
void aciBitmapMenu::go2upmenu(int mode)
|
|
{
|
|
fncMenu* p = (fncMenu*)upMenu;
|
|
if(!p) return;
|
|
p -> flags &= ~(FM_HIDDEN | FM_ACTIVE);
|
|
p -> flags |= FM_LOCK;
|
|
p -> curFunction = FMENU_OFF;
|
|
p -> curItem = p -> get_fnc_item(FMENU_OFF);
|
|
if(mode == AS_INFO_MODE || mode == -1)
|
|
p -> set_redraw();
|
|
}
|
|
|
|
void aciBitmapMenu::change(int x,int y)
|
|
{
|
|
aciBitmapMenuItem* p = (aciBitmapMenuItem*)items -> last;
|
|
|
|
while(p){
|
|
if(p -> check_xy(x,y)){
|
|
p -> change();
|
|
aciHandleCameraEvent(p -> ID,p -> curState);
|
|
curCount = activeCount;
|
|
flags |= BM_REBUILD;
|
|
return;
|
|
}
|
|
p = (aciBitmapMenuItem*)p -> prev;
|
|
}
|
|
go2upmenu();
|
|
}
|
|
|
|
void aciBitmapMenuItem::change(void)
|
|
{
|
|
curState ++;
|
|
if(curState >= numStates) curState = 0;
|
|
}
|
|
|
|
void aciBitmapMenu::remap_coords(void)
|
|
{
|
|
int x,y;
|
|
aciBitmapMenuItem* p;
|
|
if(flags & BM_REMAP_COORDS) return;
|
|
p = (aciBitmapMenuItem*)items -> last;
|
|
while(p){
|
|
x = (p -> PosX * SizeX) / BM_GLOBAL_SIZE;
|
|
y = (p -> PosY * SizeY) / BM_GLOBAL_SIZE;
|
|
|
|
p -> PosX = x - (p -> SizeX)/2;
|
|
p -> PosY = y - (p -> SizeY)/2;
|
|
|
|
p = (aciBitmapMenuItem*)p -> prev;
|
|
}
|
|
|
|
flags |= BM_REMAP_COORDS;
|
|
}
|
|
|
|
int invMatrix::check_slot(int type)
|
|
{
|
|
int i,j,index = 0;
|
|
for(i = 0; i < SizeX; i ++){
|
|
for(j = 0; j < SizeY; j ++){
|
|
if(matrix[index] -> slotType == type) return 1;
|
|
index ++;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
const int aciSaveVersion = 1;
|
|
|
|
void actIntDispatcher::save_data(XStream* fh)
|
|
{
|
|
invItem* p;
|
|
aciWorldInfo* w;
|
|
|
|
int cr = aciGetCurCredits();
|
|
|
|
*fh < aciSaveVersion;
|
|
|
|
if(curMatrix){
|
|
*fh < curMatrix -> type < curMatrix -> items -> Size;
|
|
p = (invItem*)curMatrix -> items -> last;
|
|
while(p){
|
|
*fh < p -> ID < p -> MatrixX < p -> MatrixY < p -> dropCount;
|
|
p = (invItem*)p -> prev;
|
|
}
|
|
}
|
|
else {
|
|
*fh < (int)(-1);
|
|
}
|
|
*fh < cr;
|
|
if(wMap){
|
|
w = (aciWorldInfo*)wMap -> world_list -> last;
|
|
while(w){
|
|
*fh < w -> flags;
|
|
w = (aciWorldInfo*)w -> prev;
|
|
}
|
|
w = (aciWorldInfo*)wMap -> world_list -> last;
|
|
while(w){
|
|
fh -> write(w -> links,AS_MAX_WORLD);
|
|
w = (aciWorldInfo*)w -> prev;
|
|
}
|
|
}
|
|
}
|
|
|
|
void actIntDispatcher::load_data(XStream* fh)
|
|
{
|
|
int i,n,x,y,d,itm_size,ver,cr;
|
|
|
|
*fh > ver;
|
|
|
|
if(ver < 0 || ver > aciSaveVersion) ErrH.Abort("Bad save version...");
|
|
|
|
aciWorldInfo* w;
|
|
invItem* p,*p1;
|
|
invMatrix* m;
|
|
if(curMatrix)
|
|
free_matrix(curMatrix);
|
|
|
|
*fh > n > itm_size;
|
|
if(n != -1){
|
|
curMatrix = alloc_matrix(n);
|
|
if(flags & AS_ISCREEN)
|
|
m = get_imatrix(n);
|
|
else
|
|
m = get_matrix(n);
|
|
|
|
m -> clone(curMatrix);
|
|
for(i = 0; i < itm_size; i ++){
|
|
*fh > n > x > y > d;
|
|
if(flags & AS_ISCREEN)
|
|
p = get_iitem(n);
|
|
else
|
|
p = get_item(n);
|
|
|
|
p1 = alloc_item();
|
|
p -> clone(p1);
|
|
curMatrix -> put_item(x,y,p1,1);
|
|
p1 -> dropCount = d;
|
|
}
|
|
}
|
|
else {
|
|
curMatrix = NULL;
|
|
}
|
|
*fh > cr;
|
|
aciUpdateCurCredits(cr);
|
|
|
|
if(wMap){
|
|
w = (aciWorldInfo*)wMap -> world_list -> last;
|
|
while(w){
|
|
*fh > w -> flags;
|
|
w = (aciWorldInfo*)w -> prev;
|
|
}
|
|
w = (aciWorldInfo*)wMap -> world_list -> last;
|
|
while(w){
|
|
fh -> read(w -> links,AS_MAX_WORLD);
|
|
w = (aciWorldInfo*)w -> prev;
|
|
}
|
|
}
|
|
}
|
|
|
|
void actIntDispatcher::aml_check_redraw(int x,int y)
|
|
{
|
|
int x1,y1,dx,dy;
|
|
InfoPanel* pl;
|
|
|
|
y += 16;
|
|
|
|
pl = (InfoPanel*)i_infoPanels -> last;
|
|
while(pl){
|
|
if(pl -> iScreenOwner && pl -> iScreenOwner -> flags & EL_DATA_LOADED){
|
|
x1 = pl -> PosX + pl -> SizeX/2;
|
|
y1 = pl -> PosY + pl -> SizeY/2;
|
|
|
|
dx = pl -> SizeX/2 + aciML_ToolzerRadius * 2;
|
|
dy = pl -> SizeY/2 + aciML_ToolzerRadius * 2;
|
|
|
|
if(abs(x - x1) <= dx && abs(y - y1) <= dy) pl -> set_redraw();
|
|
}
|
|
pl = (InfoPanel*)pl -> prev;
|
|
}
|
|
if(!(flags & AS_ISCREEN_INV_MODE) && qMenu && qMenu -> flags & FMC_DATA_INIT){
|
|
x1 = qMenu -> ScreenX + qMenu -> ScreenSizeX/2;
|
|
y1 = qMenu -> ScreenY + qMenu -> ScreenSizeY/2;
|
|
|
|
dx = qMenu -> ScreenSizeX/2 + aciML_ToolzerRadius;
|
|
dy = qMenu -> ScreenSizeY/2 + aciML_ToolzerRadius;
|
|
|
|
if(abs(x - x1) <= dx && abs(y - y1) <= dy) qMenu -> set_redraw();
|
|
}
|
|
}
|
|
|
|
fncMenuSet::fncMenuSet(void)
|
|
{
|
|
PosX = 0;
|
|
items = new iList;
|
|
flags = 0;
|
|
SizeX = SizeY = 0;
|
|
|
|
space = 5;
|
|
font = 2;
|
|
|
|
redraw_data = NULL;
|
|
data = NULL;
|
|
|
|
qMenu = NULL;
|
|
}
|
|
|
|
fncMenuSet::~fncMenuSet(void)
|
|
{
|
|
iListElement* p,*p1;
|
|
iScreenElement* el = (iScreenElement*)redraw_data;
|
|
fncMenu* m;
|
|
if (items) {
|
|
p = items -> last;
|
|
while(p) {
|
|
p1 = p -> prev;
|
|
m = (fncMenu*)p;
|
|
delete m;
|
|
p = p1;
|
|
}
|
|
delete items;
|
|
items = NULL;
|
|
}
|
|
if(el) delete el;
|
|
}
|
|
|
|
void fncMenuSet::init(void)
|
|
{
|
|
if(!redraw_data)
|
|
redraw_data = new iBitmapElement;
|
|
else
|
|
redraw_data -> free();
|
|
|
|
redraw_data -> SizeY = redraw_data -> bSizeY = data -> SizeY;
|
|
redraw_data -> owner = data -> owner;
|
|
|
|
flags |= FMC_DATA_INIT;
|
|
}
|
|
|
|
void fncMenuSet::finit(void)
|
|
{
|
|
fncMenu* m,*m1;
|
|
if(redraw_data)
|
|
redraw_data -> free();
|
|
|
|
m = (fncMenu*)items -> last;
|
|
while(m){
|
|
m1 = (fncMenu*)m -> prev;
|
|
delete m;
|
|
m = m1;
|
|
}
|
|
items -> init_list();
|
|
|
|
flags &= ~FMC_DATA_INIT;
|
|
}
|
|
|
|
void fncMenuSet::init_redraw(void)
|
|
{
|
|
int i,sz = 0;
|
|
fncMenu* m;
|
|
|
|
m = (fncMenu*)items -> first;
|
|
for(i = 0; i < items -> Size; i ++){
|
|
m -> PosX = sz;
|
|
sz += m -> SizeX + space;
|
|
m -> iScreenOwner = redraw_data;
|
|
m = (fncMenu*)m -> next;
|
|
}
|
|
|
|
redraw_data -> SizeX = redraw_data -> bSizeX = sz + space;
|
|
redraw_data -> SizeY = redraw_data -> bSizeY = data -> SizeY;
|
|
redraw_data -> alloc_mem();
|
|
redraw_data -> owner = data -> owner;
|
|
|
|
PosX = (data -> SizeX - redraw_data -> SizeX) / 2;
|
|
}
|
|
|
|
void fncMenuSet::build(void)
|
|
{
|
|
int i,x = 0,dx;
|
|
fncMenu* m;
|
|
|
|
m = (fncMenu*)items -> first;
|
|
for(i = 0; i < items -> Size; i ++){
|
|
m -> PosX = x - m -> curItem -> PosX;
|
|
x += m -> curItem -> SizeX + space;
|
|
m = (fncMenu*)m -> next;
|
|
}
|
|
dx = (redraw_data -> SizeX - x)/2;
|
|
if(dx){
|
|
m = (fncMenu*)items -> first;
|
|
for(i = 0; i < items -> Size; i ++){
|
|
m -> PosX += dx;
|
|
m = (fncMenu*)m -> next;
|
|
}
|
|
}
|
|
}
|
|
|
|
void fncMenuSet::set_redraw(void)
|
|
{
|
|
flags |= FMC_REDRAW;
|
|
}
|
|
|
|
void fncMenuSet::redraw_owner(void)
|
|
{
|
|
iScreenObject* obj;
|
|
|
|
if(!(data -> flags & EL_DATA_LOADED))
|
|
return;
|
|
|
|
obj = (iScreenObject*)data -> owner;
|
|
|
|
obj -> redraw();
|
|
obj -> flush();
|
|
}
|
|
|
|
void fncMenuSet::redraw(void)
|
|
{
|
|
int i,y,sx,dx,rdx,index,r_index;
|
|
|
|
fncMenu* m;
|
|
iScreenObject* obj;
|
|
|
|
if(!(data -> flags & EL_DATA_LOADED))
|
|
return;
|
|
|
|
obj = (iScreenObject*)data -> owner;
|
|
obj -> flags |= (OBJ_MUST_REDRAW | OBJ_CLEAR_FON);
|
|
|
|
if(!redraw_data || !(redraw_data -> flags & EL_DATA_LOADED)){
|
|
memset(data -> fdata,0,data -> SizeX * data -> SizeY);
|
|
return;
|
|
}
|
|
|
|
// memset(redraw_data -> fdata,4,redraw_data -> SizeX * redraw_data -> SizeY);
|
|
memset(redraw_data -> fdata,0,redraw_data -> SizeX * redraw_data -> SizeY);
|
|
m = (fncMenu*)items -> first;
|
|
for(i = 0; i < items -> Size; i ++){
|
|
m -> redraw();
|
|
m = (fncMenu*)m -> next;
|
|
}
|
|
if(data -> SizeX > redraw_data -> SizeX){
|
|
sx = redraw_data -> SizeX;
|
|
dx = (data -> SizeX - sx)/2;
|
|
rdx = 0;
|
|
}
|
|
else {
|
|
sx = data -> SizeX;
|
|
dx = 0;
|
|
rdx = -PosX;
|
|
// rdx = (redraw_data -> SizeX - sx)/2 - PosX;
|
|
}
|
|
|
|
index = dx;
|
|
r_index = rdx;
|
|
for(y = 0; y < data -> SizeY; y ++){
|
|
memcpy(data -> fdata + index,redraw_data -> fdata + r_index,sx);
|
|
index += data -> SizeX;
|
|
r_index += redraw_data -> SizeX;
|
|
}
|
|
|
|
flags &= ~FMC_REDRAW;
|
|
}
|
|
|
|
void fncMenuSet::add(fncMenu* p,int mode)
|
|
{
|
|
items -> connect((iListElement*)p);
|
|
p -> SizeY = data -> SizeY;
|
|
|
|
p -> flags |= (FM_ACTIVE | FM_NO_ALIGN | FM_NO_DEACTIVATE);
|
|
|
|
p -> VItems = 1;
|
|
p -> curFunction = 0;
|
|
p -> init_curItem();
|
|
p -> init_objects();
|
|
|
|
p -> iScreenOwner = redraw_data;
|
|
|
|
if(mode) qMenu = p;
|
|
}
|
|
|
|
void fncMenu::init_curItem(void)
|
|
{
|
|
curItem = get_fnc_item(curFunction);
|
|
if(!curItem) ErrH.Abort("init_curItem() failed...");
|
|
if(VItems < items -> Size)
|
|
firstItem = curItem;
|
|
else
|
|
firstItem = (fncMenuItem*)items -> first;
|
|
}
|
|
|
|
int fncMenuSet::check_xy(int x,int y)
|
|
{
|
|
if(x >= ScreenX && x < ScreenX + ScreenSizeX && y >= ScreenY && y < ScreenY + ScreenSizeY)
|
|
return 1;
|
|
return 0;
|
|
}
|
|
|
|
void fncMenuSet::key_trap(int x,int y)
|
|
{
|
|
int flag = 0,fnc;
|
|
fncMenu* m;
|
|
if(!check_xy(x,y)) return;
|
|
|
|
x -= ScreenX + PosX;
|
|
y -= ScreenY;
|
|
|
|
m = (fncMenu*)items -> last;
|
|
while(m){
|
|
if(m -> items -> Size > 1){
|
|
fnc = m -> curFunction;
|
|
m -> change(x,y);
|
|
if(fnc != m -> curFunction)
|
|
flag = 1;
|
|
}
|
|
m = (fncMenu*)m -> prev;
|
|
}
|
|
if(flag){
|
|
build();
|
|
set_redraw();
|
|
|
|
SOUND_SELECT();
|
|
}
|
|
}
|
|
|
|
char* fncMenuSet::get(void)
|
|
{
|
|
if(qMenu){
|
|
return qMenu -> curItem -> name;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
void fncMenuSet::shift(int dx)
|
|
{
|
|
if(redraw_data -> SizeX <= data -> SizeX) return;
|
|
PosX += dx;
|
|
limitPosX();
|
|
}
|
|
|
|
void fncMenuSet::limitPosX(void)
|
|
{
|
|
int max_x,min_x;
|
|
if(redraw_data -> SizeX <= data -> SizeX) return;
|
|
|
|
max_x = 0;
|
|
min_x = - redraw_data -> SizeX + data -> SizeX;
|
|
|
|
if(PosX > max_x) PosX = max_x;
|
|
if(PosX < min_x) PosX = min_x;
|
|
}
|
|
|
|
void invItem::init_avi_id(char* p,int num)
|
|
{
|
|
int sz = strlen(p) + 1;
|
|
avi_ids[num] = new char[sz];
|
|
strcpy(avi_ids[num],p);
|
|
}
|
|
|
|
void invMatrix::init_avi_id(char* p,int num)
|
|
{
|
|
int sz = strlen(p) + 1;
|
|
avi_ids[num] = new char[sz];
|
|
strcpy(avi_ids[num],p);
|
|
}
|
|
|
|
int fncMenu::remove_menu(int code)
|
|
{
|
|
fncMenuItem* p = (fncMenuItem*)items -> last;
|
|
while(p){
|
|
if(p -> fnc_code == code){
|
|
if(code == curFunction){
|
|
curItem = (fncMenuItem*)p -> next;
|
|
curFunction = curItem -> fnc_code;
|
|
}
|
|
items -> dconnect((iListElement*)p);
|
|
init_curItem();
|
|
|
|
delete p;
|
|
return 1;
|
|
}
|
|
p = (fncMenuItem*)p -> prev;
|
|
}
|
|
p = (fncMenuItem*)inactive_items -> last;
|
|
while(p){
|
|
if(p -> fnc_code == code){
|
|
inactive_items -> dconnect((iListElement*)p);
|
|
init_curItem();
|
|
delete p;
|
|
return 1;
|
|
}
|
|
p = (fncMenuItem*)p -> prev;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
void fncMenu::clean(void)
|
|
{
|
|
fncMenuItem* p = (fncMenuItem*)items -> last;
|
|
fncMenuItem* p1;
|
|
while(p){
|
|
p1 = (fncMenuItem*)p -> prev;
|
|
if(p -> flags & FM_CLONE){
|
|
if(p -> fnc_code == curFunction){
|
|
curItem = (fncMenuItem*)p -> next;
|
|
curFunction = curItem -> fnc_code;
|
|
}
|
|
items -> dconnect((iListElement*)p);
|
|
init_curItem();
|
|
|
|
delete p;
|
|
}
|
|
p = p1;
|
|
}
|
|
p = (fncMenuItem*)inactive_items -> last;
|
|
while(p){
|
|
p1 = (fncMenuItem*)p -> prev;
|
|
if(p -> fnc_code == curFunction){
|
|
inactive_items -> dconnect((iListElement*)p);
|
|
delete p;
|
|
}
|
|
p = p1;
|
|
}
|
|
}
|
|
|
|
int fncMenu::check_menu(int code)
|
|
{
|
|
fncMenuItem* p = (fncMenuItem*)items -> last;
|
|
while(p){
|
|
if(p -> fnc_code == code){
|
|
return 1;
|
|
}
|
|
p = (fncMenuItem*)p -> prev;
|
|
}
|
|
p = (fncMenuItem*)inactive_items -> last;
|
|
while(p){
|
|
if(p -> fnc_code == code){
|
|
return 1;
|
|
}
|
|
p = (fncMenuItem*)p -> prev;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
void fncMenu::add_menu(fncMenu* p)
|
|
{
|
|
fncMenuItem * itm;
|
|
if(!p -> upMenuItem || check_menu(p -> upMenuItem -> fnc_code)) return;
|
|
itm = new fncMenuItem;
|
|
p -> upMenuItem -> clone(itm);
|
|
items -> connect((iListElement*)itm);
|
|
|
|
if(flags & FM_RANGE_FONT)
|
|
itm -> flags |= FM_RANGE_FONT;
|
|
|
|
init_objects();
|
|
init_curItem();
|
|
}
|
|
|
|
void actIntDispatcher::clean_menus(void)
|
|
{
|
|
fncMenu* m = (fncMenu*)menuList -> last;
|
|
while(m){
|
|
if(m -> flags & FM_MAIN_MENU){
|
|
m -> clean();
|
|
}
|
|
m = (fncMenu*)m -> prev;
|
|
}
|
|
}
|
|
|
|
void actIntDispatcher::prepare_menus(void)
|
|
{
|
|
invItem* p;
|
|
if(!curMatrix) return;
|
|
p = (invItem*)curMatrix -> items -> last;
|
|
while(p){
|
|
if(p -> menu)
|
|
add_menu_item((fncMenu*)p -> menu);
|
|
p = (invItem*)p -> prev;
|
|
}
|
|
}
|
|
|
|
void actIntDispatcher::add_menu_item(fncMenu* p)
|
|
{
|
|
fncMenu* m = (fncMenu*)menuList -> last;
|
|
while(m){
|
|
if(m -> flags & FM_MAIN_MENU){
|
|
m -> add_menu(p);
|
|
if(curMode == AS_INFO_MODE && m -> flags & FM_ACTIVE) m -> set_redraw();
|
|
}
|
|
m = (fncMenu*)m -> prev;
|
|
}
|
|
}
|
|
|
|
void actIntDispatcher::remove_menu_item(fncMenu* p)
|
|
{
|
|
int code = 0;
|
|
fncMenu* m = (fncMenu*)menuList -> last;
|
|
|
|
if(!p -> upMenuItem) return;
|
|
code = p -> upMenuItem -> fnc_code;
|
|
while(m){
|
|
if(m -> flags & FM_MAIN_MENU){
|
|
m -> remove_menu(code);
|
|
if(curMode == AS_INFO_MODE && m -> flags & FM_ACTIVE) m -> set_redraw();
|
|
}
|
|
m = (fncMenu*)m -> prev;
|
|
}
|
|
if(p -> flags & FM_ACTIVE) p -> go2upmenu(curMode);
|
|
}
|
|
|
|
void fncMenuItem::clone(fncMenuItem* p)
|
|
{
|
|
p -> PosX = PosX;
|
|
p -> PosY = PosY;
|
|
|
|
p -> SizeX = SizeX;
|
|
p -> SizeY = SizeY;
|
|
|
|
p -> fnc_code = fnc_code;
|
|
p -> submenuID = submenuID;
|
|
|
|
p -> font = font;
|
|
p -> space = space;
|
|
p -> scankey = scankey;
|
|
|
|
p -> eventPtr = eventPtr;
|
|
|
|
p -> name = name;
|
|
p -> name_len = name_len;
|
|
|
|
p -> flags |= (flags | FM_CLONE) & (~FM_NO_DELETE);
|
|
}
|
|
|
|
aciLocationShutterInfo::~aciLocationShutterInfo(void)
|
|
{
|
|
if(data) delete data;
|
|
if(name) delete[] name;
|
|
}
|
|
|
|
void aciLocationShutterInfo::prepare(int m)
|
|
{
|
|
mode = m;
|
|
switch(mode){
|
|
case ACI_SHUTTER_OPEN:
|
|
curPos.X = Pos[0].X;
|
|
curPos.Y = Pos[0].Y;
|
|
trgPos.X = Pos[1].X;
|
|
trgPos.Y = Pos[1].Y;
|
|
break;
|
|
case ACI_SHUTTER_CLOSE:
|
|
curPos.X = Pos[2].X;
|
|
curPos.Y = Pos[2].Y;
|
|
trgPos.X = Pos[3].X;
|
|
trgPos.Y = Pos[3].Y;
|
|
break;
|
|
}
|
|
curDelta.X = (curPos.X < trgPos.X) ? Delta.X : -Delta.X;
|
|
curDelta.Y = (curPos.Y < trgPos.Y) ? Delta.Y : -Delta.Y;
|
|
}
|
|
|
|
void aciLocationShutterInfo::init_size(void)
|
|
{
|
|
short sx,sy;
|
|
XStream fh(name,XS_IN);
|
|
fh > sx > sy;
|
|
fh.close();
|
|
|
|
Size.X = sx;
|
|
Size.Y = sy;
|
|
}
|
|
|
|
void aciLocationShutterInfo::loadData(void)
|
|
{
|
|
short sx,sy;
|
|
XStream fh(name,XS_IN);
|
|
fh > sx > sy;
|
|
if(sx != Size.X || sy != Size.Y) ErrH.Abort("Bad shutter BMP size...");
|
|
data = new char[Size.X * Size.Y];
|
|
fh.read(data,Size.X * Size.Y);
|
|
fh.close();
|
|
}
|
|
|
|
void aciLocationShutterInfo::freeData(void)
|
|
{
|
|
if(data){
|
|
delete []data;
|
|
data = NULL;
|
|
}
|
|
}
|
|
|
|
void aciLocationShutterInfo::Redraw(void)
|
|
{
|
|
XGR_PutSpr(curPos.X,curPos.Y,Size.X,Size.Y,data,XGR_CLIPPED | XGR_HIDDEN_FON);
|
|
}
|
|
|
|
int aciLocationShutterInfo::Quant(void)
|
|
{
|
|
if(curDelta.X){
|
|
if(curDelta.X < 0){
|
|
if(curPos.X > trgPos.X){
|
|
curPos.X += curDelta.X;
|
|
if(curPos.X <= trgPos.X)
|
|
curPos.X = trgPos.X;
|
|
}
|
|
}
|
|
else {
|
|
if(curPos.X < trgPos.X){
|
|
curPos.X += curDelta.X;
|
|
if(curPos.X >= trgPos.X)
|
|
curPos.X = trgPos.X;
|
|
}
|
|
}
|
|
}
|
|
if(curDelta.Y){
|
|
if(curDelta.Y < 0){
|
|
if(curPos.Y > trgPos.Y){
|
|
curPos.Y += curDelta.Y;
|
|
if(curPos.Y <= trgPos.Y)
|
|
curPos.Y = trgPos.Y;
|
|
}
|
|
}
|
|
else {
|
|
if(curPos.Y < trgPos.Y){
|
|
curPos.Y += curDelta.Y;
|
|
if(curPos.Y >= trgPos.Y)
|
|
curPos.Y = trgPos.Y;
|
|
}
|
|
}
|
|
}
|
|
if(curPos.X == trgPos.X && curPos.Y == trgPos.Y) return 1;
|
|
return 0;
|
|
}
|
|
|
|
void aciLocationShutterInfo::init(void)
|
|
{
|
|
int i;
|
|
init_size();
|
|
for(i = 0; i < 4; i ++){
|
|
if(Pos[i].X < 0){
|
|
switch(Pos[i].X){
|
|
case ACI_SHUTTER_LEFT:
|
|
Pos[i].X = -Size.X;
|
|
break;
|
|
case ACI_SHUTTER_RIGHT:
|
|
Pos[i].X = 800 - Size.X;
|
|
break;
|
|
case ACI_SHUTTER_CENTER:
|
|
Pos[i].X = (800 - Size.X)/2;
|
|
break;
|
|
}
|
|
}
|
|
if(Pos[i].Y < 0){
|
|
switch(Pos[i].Y){
|
|
case ACI_SHUTTER_LEFT:
|
|
Pos[i].Y = -Size.Y;
|
|
break;
|
|
case ACI_SHUTTER_RIGHT:
|
|
Pos[i].Y = 600 - Size.Y;
|
|
break;
|
|
case ACI_SHUTTER_CENTER:
|
|
Pos[i].Y = (600 - Size.Y)/2;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void aciLocationInfo::alloc_gate_shutters(int num)
|
|
{
|
|
int i;
|
|
numGateShutters = num;
|
|
GateShutters = new aciLocationShutterInfo*[num];
|
|
for(i = 0; i < num; i ++)
|
|
GateShutters[i] = NULL;
|
|
}
|
|
|
|
void aciLocationInfo::alloc_matrix_shutters(int id,int num)
|
|
{
|
|
int i;
|
|
switch(id){
|
|
case 1:
|
|
numMatrixShutters1 = num;
|
|
MatrixShutters1 = new aciLocationShutterInfo*[num];
|
|
for(i = 0; i < num; i ++)
|
|
MatrixShutters1[i] = NULL;
|
|
break;
|
|
case 2:
|
|
numMatrixShutters2 = num;
|
|
MatrixShutters2 = new aciLocationShutterInfo*[num];
|
|
for(i = 0; i < num; i ++)
|
|
MatrixShutters2[i] = NULL;
|
|
break;
|
|
}
|
|
}
|
|
|
|
void fncMenu::prepare_items(void)
|
|
{
|
|
fncMenuItem* p,*p1;
|
|
|
|
p = (fncMenuItem*)inactive_items -> last;
|
|
while(p){
|
|
p1 = (fncMenuItem*)p -> prev;
|
|
inactive_items -> dconnect(p);
|
|
items -> connect(p);
|
|
p = p1;
|
|
}
|
|
inactive_items -> init_list();
|
|
}
|
|
|
|
void fncMenu::deactivate(char* p)
|
|
{
|
|
fncMenuItem* itm,*itm1;
|
|
itm = (fncMenuItem*)items -> last;
|
|
while(itm){
|
|
itm1 = (fncMenuItem*)itm -> prev;
|
|
if(!strcmp(p,itm -> name)){
|
|
if(itm == curItem){
|
|
curFunction = 0;
|
|
init_curItem();
|
|
}
|
|
items -> dconnect(itm);
|
|
inactive_items -> connect(itm);
|
|
}
|
|
itm = itm1;
|
|
}
|
|
}
|
|
|
|
void fncMenu::deactivate_item(int code)
|
|
{
|
|
fncMenuItem* itm,*itm1;
|
|
itm = (fncMenuItem*)items -> last;
|
|
while(itm){
|
|
itm1 = (fncMenuItem*)itm -> prev;
|
|
if(itm -> fnc_code == code){
|
|
if(itm == curItem){
|
|
curFunction = 0;
|
|
init_curItem();
|
|
}
|
|
items -> dconnect(itm);
|
|
inactive_items -> connect(itm);
|
|
}
|
|
itm = itm1;
|
|
}
|
|
}
|
|
|
|
void fncMenu::delete_item(int code)
|
|
{
|
|
fncMenuItem* itm,*itm1;
|
|
itm = (fncMenuItem*)items -> last;
|
|
while(itm){
|
|
itm1 = (fncMenuItem*)itm -> prev;
|
|
if(itm -> fnc_code == code){
|
|
if(itm == curItem){
|
|
curFunction = 0;
|
|
init_curItem();
|
|
}
|
|
items -> dconnect(itm);
|
|
delete itm;
|
|
}
|
|
itm = itm1;
|
|
}
|
|
}
|
|
|
|
void fncMenu::activate_item(int code)
|
|
{
|
|
fncMenuItem* itm,*itm1;
|
|
itm = (fncMenuItem*)inactive_items -> last;
|
|
while(itm){
|
|
itm1 = (fncMenuItem*)itm -> prev;
|
|
if(itm -> fnc_code == code){
|
|
if(!items -> Size){
|
|
curItem = itm;
|
|
curFunction = curItem -> fnc_code;
|
|
}
|
|
inactive_items -> dconnect(itm);
|
|
items -> connect(itm);
|
|
}
|
|
itm = itm1;
|
|
}
|
|
}
|
|
|
|
void aciWorldMap::show_jump_count(void)
|
|
{
|
|
int i,x,sx0,col_in0,col_in1,col_out,index0,index1;
|
|
|
|
col_in0 = aciCurColorScheme[JUMP_EMPTY_COL];
|
|
col_in1 = aciCurColorScheme[JUMP_FILLED_COL];
|
|
col_out = aciCurColorScheme[JUMP_BORDER_COL];
|
|
|
|
index0 = aciCurJumpCount;
|
|
index1 = aciMaxJumpCount;
|
|
|
|
x = 0;
|
|
sx0 = JumpCountSizeX / index1;
|
|
JumpCountX = (SizeX - sx0 * index1) / 2;
|
|
for(i = 0; i < index0; i ++){
|
|
mem_rectangle(x + JumpCountX,JumpCountY,sx0,JumpCountSizeY,SizeX,col_in1,col_out,1,redraw_buf);
|
|
x += sx0;
|
|
}
|
|
for(i = index0; i < index1; i ++){
|
|
mem_rectangle(x + JumpCountX,JumpCountY,sx0,JumpCountSizeY,SizeX,col_in0,col_out,1,redraw_buf);
|
|
x += sx0;
|
|
}
|
|
}
|
|
|
|
void actIntDispatcher::init_prompt(void)
|
|
{
|
|
aButton* b;
|
|
aIndData* ind;
|
|
|
|
XGR_MousePromptData* p;
|
|
|
|
ind = (aIndData*)indList -> last;
|
|
while(ind){
|
|
if(ind -> promptData){
|
|
p = new XGR_MousePromptData;
|
|
p -> ID = ind -> ID;
|
|
p -> set_text(ind -> promptData);
|
|
|
|
invPrompt -> AddElement((XListElement*)p);
|
|
|
|
p = new XGR_MousePromptData;
|
|
p -> ID = ind -> ID;
|
|
p -> set_text(ind -> promptData);
|
|
|
|
infPrompt -> AddElement((XListElement*)p);
|
|
}
|
|
ind = (aIndData*)ind -> prev;
|
|
}
|
|
b = (aButton*)intButtons -> last;
|
|
while(b){
|
|
b -> init();
|
|
if(b -> promptData){
|
|
p = new XGR_MousePromptData(b -> PosX,b -> PosY,b -> SizeX,b -> SizeY,0);
|
|
p -> set_text(b -> promptData);
|
|
|
|
invPrompt -> AddElement((XListElement*)p);
|
|
|
|
p = new XGR_MousePromptData(b -> PosX,b -> PosY,b -> SizeX,b -> SizeY,0);
|
|
p -> set_text(b -> promptData);
|
|
|
|
infPrompt -> AddElement((XListElement*)p);
|
|
}
|
|
b = (aButton*)b -> prev;
|
|
}
|
|
b = (aButton*)invButtons -> last;
|
|
while(b){
|
|
b -> init();
|
|
if(b -> promptData){
|
|
p = new XGR_MousePromptData(b -> PosX,b -> PosY,b -> SizeX,b -> SizeY,0);
|
|
p -> set_text(b -> promptData);
|
|
|
|
switch(b -> ID){
|
|
case ACI_WPN_PICKUP_BUTTON:
|
|
p -> ID = ACI_PICKUP_WPN_ON;
|
|
break;
|
|
case ACI_ITM_PICKUP_BUTTON:
|
|
p -> ID = ACI_PICKUP_ITM_ON;
|
|
break;
|
|
}
|
|
|
|
invPrompt -> AddElement((XListElement*)p);
|
|
}
|
|
b = (aButton*)b -> prev;
|
|
}
|
|
b = (aButton*)infButtons -> last;
|
|
while(b){
|
|
b -> init();
|
|
if(b -> promptData){
|
|
p = new XGR_MousePromptData(b -> PosX,b -> PosY,b -> SizeX,b -> SizeY,0);
|
|
p -> set_text(b -> promptData);
|
|
|
|
infPrompt -> AddElement((XListElement*)p);
|
|
}
|
|
b = (aButton*)b -> prev;
|
|
}
|
|
}
|
|
|
|
aciScreenTextPage::aciScreenTextPage(void)
|
|
{
|
|
StrTable = NULL;
|
|
NumStr = StartStr = 0;
|
|
}
|
|
|
|
aciScreenTextPage::~aciScreenTextPage(void)
|
|
{
|
|
if(StrTable) delete StrTable;
|
|
}
|
|
|
|
aciScreenText::aciScreenText(void)
|
|
{
|
|
data = NULL;
|
|
dataSize = 0;
|
|
|
|
Timer = 0;
|
|
StrTimer = 1;
|
|
|
|
flags = 0;
|
|
|
|
DeltaY = 2;
|
|
|
|
font = 0;
|
|
color = 255;
|
|
MaxStrLen = 60;
|
|
MaxPageStr = ACI_TEXT_PAGE_SIZE;
|
|
|
|
PageTable = new iList;
|
|
StrTable = new iList;
|
|
|
|
CurPage = CurStr = 0;
|
|
|
|
NextPageKey = new aKeyObj;
|
|
NextPageKey -> add_key(SDL_SCANCODE_SPACE);
|
|
NextPageKey -> add_key(SDL_SCANCODE_TAB);
|
|
|
|
convBuf = new char[ACI_MAX_STRING_LEN];
|
|
memset(convBuf,0,ACI_MAX_STRING_LEN);
|
|
}
|
|
|
|
aciScreenText::~aciScreenText(void)
|
|
{
|
|
free();
|
|
delete NextPageKey;
|
|
delete PageTable;
|
|
delete StrTable;
|
|
}
|
|
|
|
void aciScreenText::free(void)
|
|
{
|
|
aciScreenTextString* s,*s1;
|
|
aciScreenTextPage* p,*p1;
|
|
|
|
CurStr = CurPage = 0;
|
|
|
|
if(data) delete data;
|
|
data = NULL;
|
|
dataSize = 0;
|
|
|
|
s = (aciScreenTextString*)StrTable -> last;
|
|
while(s){
|
|
s1 = (aciScreenTextString*)s -> prev;
|
|
delete s;
|
|
s = s1;
|
|
}
|
|
StrTable -> init_list();
|
|
|
|
p = (aciScreenTextPage*)PageTable -> last;
|
|
while(p){
|
|
p1 = (aciScreenTextPage*)p -> prev;
|
|
delete p;
|
|
p = p1;
|
|
}
|
|
PageTable -> init_list();
|
|
|
|
flags &= ~ACI_TEXT_INIT;
|
|
}
|
|
|
|
void aciScreenText::alloc(char* ptr,int sz)
|
|
{
|
|
free();
|
|
data = new char[sz + 1];
|
|
memcpy(data,ptr,sz);
|
|
data[sz] = '\n';
|
|
dataSize = sz + 1;
|
|
|
|
aciPrepareScreenText(data,dataSize,MaxStrLen);
|
|
|
|
prepare();
|
|
CurPageData = (aciScreenTextPage*)PageTable -> first;
|
|
flags |= ACI_TEXT_INIT;
|
|
flags &= ~ACI_TEXT_END;
|
|
}
|
|
|
|
void aciScreenText::prepare(void)
|
|
{
|
|
int i,j,cur_str,start_str,cur_text_str;
|
|
char* strStart;
|
|
aciScreenTextString* s;
|
|
aciScreenTextPage* p;
|
|
|
|
strStart = data;
|
|
start_str = cur_str = cur_text_str = 0;
|
|
for(i = 0; i < dataSize; i ++){
|
|
if(data[i] == '\\' && i < (dataSize - 1) && data[i + 1] == '\\'){
|
|
cur_text_str = MaxPageStr;
|
|
data[i] = 0;
|
|
data[i + 1] = 0;
|
|
while(i < (dataSize - 1) && data[i] != '\n') i ++;
|
|
}
|
|
if(data[i] == '\n'){
|
|
data[i] = 0;
|
|
s = new aciScreenTextString;
|
|
s -> data = strStart;
|
|
StrTable -> connect((iListElement*)s);
|
|
if(i < (dataSize - 1)) strStart = data + i + 1;
|
|
|
|
cur_text_str ++;
|
|
cur_str ++;
|
|
}
|
|
if(cur_text_str >= MaxPageStr){
|
|
p = new aciScreenTextPage;
|
|
p -> StartStr = start_str;
|
|
p -> NumStr = cur_str - start_str + 1;
|
|
if(p -> NumStr)
|
|
p -> StrTable = new char*[p -> NumStr];
|
|
PageTable -> connect((iListElement*)p);
|
|
|
|
start_str = cur_str;
|
|
cur_text_str = 0;
|
|
}
|
|
}
|
|
if(cur_text_str){
|
|
p = new aciScreenTextPage;
|
|
p -> StartStr = start_str;
|
|
p -> NumStr = cur_str - start_str + 1;
|
|
if(p -> NumStr)
|
|
p -> StrTable = new char*[p -> NumStr];
|
|
PageTable -> connect((iListElement*)p);
|
|
|
|
start_str = cur_str + 1;
|
|
cur_text_str = 0;
|
|
}
|
|
p = (aciScreenTextPage*)PageTable -> first;
|
|
for(i = 0; i < PageTable -> Size; i ++){
|
|
s = (aciScreenTextString*)StrTable -> first;
|
|
for(j = 0; j < p -> StartStr; j ++){
|
|
s = (aciScreenTextString*)s -> next;
|
|
}
|
|
for(j = 0; j < p -> NumStr; j ++){
|
|
p -> StrTable[j] = s -> data;
|
|
s = (aciScreenTextString*)s -> next;
|
|
}
|
|
p = (aciScreenTextPage*)p -> next;
|
|
}
|
|
for(i = 0; i < dataSize; i ++)
|
|
if(data[i] == '\r') data[i] = 0;
|
|
}
|
|
|
|
void aciScreenText::redraw(void)
|
|
{
|
|
int i,x,y;
|
|
aciScreenTextPage* p;
|
|
char* str;
|
|
|
|
if(flags & ACI_TEXT_END) return;
|
|
|
|
p = (aciScreenTextPage*)PageTable -> first;
|
|
for(i = 0; i < CurPage; i ++){
|
|
p = (aciScreenTextPage*)p -> next;
|
|
}
|
|
|
|
y = (XGR_MAXY - (DeltaY + aTextHeight32((void *)"",font,1)) * p -> NumStr)/2;
|
|
for(i = 0; i < CurStr; i ++){
|
|
str = p -> StrTable[i];
|
|
x = (XGR_MAXX - aTextWidth32(str,font,1))/2;
|
|
|
|
aOutText32(x,y,color,str,font,1,1);
|
|
y += DeltaY + aTextHeight32(str,font,1);
|
|
}
|
|
CurPageData = p;
|
|
}
|
|
|
|
void aciScreenText::Quant(void)
|
|
{
|
|
Timer ++;
|
|
flags &= ~ACI_TEXT_REDRAW;
|
|
if(Timer >= StrTimer){
|
|
if(CurStr < (CurPageData -> NumStr - 1)){
|
|
CurStr ++;
|
|
}
|
|
else
|
|
flags |= ACI_TEXT_REDRAW;
|
|
|
|
Timer = 0;
|
|
}
|
|
}
|
|
|
|
int aciScreenText::NextPage(void)
|
|
{
|
|
if(CurPage < (PageTable -> Size - 1)){
|
|
CurPage ++;
|
|
CurStr = 0;
|
|
return 1;
|
|
}
|
|
flags |= ACI_TEXT_END;
|
|
return 0;
|
|
}
|
|
|
|
#ifdef _DEBUG
|
|
void actIntDispatcher::save_items(void)
|
|
{
|
|
int i;
|
|
invItem* p;
|
|
XStream fh;
|
|
|
|
char* ptr;
|
|
char str[256];
|
|
|
|
fh.open("actint/temp/items.bat",XS_OUT);
|
|
fh < "@echo off\r\n";
|
|
for(i = 1; i < ACI_MAX_TYPE; i ++){
|
|
p = get_item(i);
|
|
if(p){
|
|
p -> init();
|
|
strcpy(str,p -> fname);
|
|
ptr = str + strlen(str) - 9;
|
|
str[strlen(str) - 3] = 0;
|
|
fh < "call r1.bat " < "tga/" < ptr < "tga " <= p -> ScreenSizeX < " " <= p -> ScreenSizeY < "\r\n";
|
|
}
|
|
}
|
|
fh < "call g1.bat\r\n";
|
|
fh.close();
|
|
|
|
fh.open("actint/temp/i_items.bat",XS_OUT);
|
|
fh < "@echo off\r\n";
|
|
for(i = 1; i < ACI_MAX_TYPE; i ++){
|
|
p = get_iitem(i);
|
|
if(p){
|
|
p -> init();
|
|
strcpy(str,p -> fname);
|
|
ptr = str + strlen(str) - 9;
|
|
str[strlen(str) - 3] = 0;
|
|
fh < "call r.bat " < "tga/" < ptr < "tga " <= p -> ScreenSizeX < " " <= p -> ScreenSizeY < "\r\n";
|
|
}
|
|
}
|
|
fh < "call g.bat\r\n";
|
|
fh.close();
|
|
}
|
|
#endif
|
|
|
|
void invItem::set_template(char* p)
|
|
{
|
|
int sz = strlen(p) + 1;
|
|
pTemplate = new char[sz];
|
|
strcpy(pTemplate,p);
|
|
}
|