#include "PlatformPrecomp.h" #include "dink.h" #include "FFReader.h" #include "../GUI/GameMenu.h" #include #include "../GUI/PauseMenu.h" #include "../GUI/QuickTipMenu.h" #include "ScriptAccelerator.h" #include "Renderer/SoftSurface.h" #include "FileSystem/StreamingInstance.h" #include void ThinkSprite(int h, bool get_frame); void ApplyAspectRatioGLMatrix(); bool pre_figure_out(const char *line, int load_seq, bool bLoadSpriteOnly); #define C_DINK_SCREEN_TRANSITION_TIME_MS 400 const float SAVE_FORMAT_VERSION = 1.8f; const int C_DINK_FADE_TIME_MS = 300; const float G_TRANSITION_SCALE_TRICK = 1.01f; float g_dinkFadeAlpha = 0; DinkGlobals g_dglo; DinkGlobalsStatic g_dglos; //static data, made to write/read from disk int32 g_spriteRank[C_MAX_SPRITES_AT_ONCE]; int32 C_DINK_MEM_MAX_ALLOWED = (1024*1024*10); int32 C_DINK_TEX_MEM_MAX_ALLOWED = (1024*1024*30); //avoid texture thrashing with this int32 C_DINK_MEM_CACHE_MAX_ALLOWED_AFTER_A_DUMP = (1024*1024*8); int32 C_DINK_TEX_MEM_MAX_ALLOWED_AFTER_A_DUMP = (1024*1024*16); uint32 g_DebugKeyTimer = 0; #ifdef _WIN32 extern bool g_bHasFocus; #define C_DINK_KEYBOARD_INPUT #endif std::map* g_customSpriteMap[C_MAX_SPRITES_AT_ONCE]; eDinkGameState g_dinkGameState = DINK_GAME_STATE_NOT_PLAYING; int water_timer; bool fire_forward; int fire_flip; bool no_cheat; bool g_itemScreenActive; int32 last_saved_game; bool g_b_kill_app; //if true, will close app as soon as the message pump is Surface g_transitionSurf; Surface g_onePixelSurf; //used for drawing blocks of color SoundBankDummy soundbank[num_soundbanks+1]; soundstruct soundinfo[num_soundbanks+1]; seth_sound g_soundInfo[max_sounds]; player_short_info short_play; char *g_scriptBuffer[C_MAX_SCRIPTS]; //pointers to buffers we may need refinfo *g_scriptInstance[C_MAX_SCRIPTS]; SpriteStruct g_sprite[C_MAX_SPRITES_AT_ONCE]; //max sprite control systems at once ScriptAccelerator g_scriptAccelerator[C_MAX_SCRIPTS]; hardness g_hmap; seth_joy sjoy; map_info g_MapInfo; int32 * pvision, * plife, * presult, * pspeed, * ptiming, *plifemax, *pexper, *pmap, *pstrength, * pcur_weapon,* pcur_magic, *pdefense, *pgold, *pmagic, *plevel, *plast_text, *pmagic_level; int32 *pupdate_status, *pmissile_target, *penemy_sprite, *pmagic_cost, *pmissle_source; bool no_transition; bool g_abort_this_flip; bool sound_on; bool turn_on_plane; char returnstring[200]; char slist[10][200]; int32 g_nlist[10]; char in_default[200]; bool g_bInitiateScreenMove; bool g_bTransitionActive; bool debug_mode; uint16 decipher_savegame; uint32 g_soundTimer = 0; void FreeSequence(int h); LPDIRECTDRAWSURFACE lpDDSBackGround; // Offscreen surface LPDIRECTDRAWSURFACE lpDDSBuffer; // Offscreen surface LPDIRECTDRAWSURFACE g_tileScreens[C_TILE_SCREEN_COUNT]; // Game pieces LPDIRECTDRAWSURFACE g_pSpriteSurface[C_MAX_SPRITES]; bool IsCorruptedSeq(int seq); //redink1 added for recursive scope checking void decipher_string(char line[200], int script); void check_midi(void); bool ReloadSequence(int seqID, int frame = 0, bool bScanOnly = false); void kill_sprite_all (int sprite); bool add_time_to_saved_game(int num); void move(int u, int amount, char kind, char kindy); void draw_box(rtRect32 box, int color); void run_through_tag_list_push(int h); void random_blood(int mx, int my, int h); int check_if_move_is_legal(int u); void change_dir_to_diag( int *dir); int hurt_thing(int h, int damage, int special); void kill_all_scripts_for_real(void); bool check_sprite_status(int spriteID); bool InitSound(); bool DestroySound( void ); int get_var(int script, char* name); void init_scripts(void); int load_script(const char *pScript, int sprite, bool set_sprite, bool bQuietError=false); void update_status_all(void); int add_sprite(int x1, int y, int brain,int pseq, int pframe ); void load_info(); //redink1 void add_exp(int num, int h, bool addEvenIfNotLastSpriteHit=false); bool locate(int script, char proc[20]); bool SoundStopEffect( int sound ); void draw_status_all(void); bool SoundDestroyEffect( int sound ); int SoundPlayEffect( int sound,int min,int plus ,int sound3d, bool repeat); void SoundLoadBanks( void); bool StopMidi(void); bool check_seq_status(int h, int frame = 0); bool PlayMidi(const char *sFileName); void get_word(char line[300], int word, char *crap); void run_script (int script); void program_idata(void); void BuildScreenBackground( bool bFullRebuild = true); int realhard(int tile); void kill_repeat_sounds_all( void ); int process_line (int script, char *s, bool doelse); void SetDefaultVars(bool bFullClear); int getpic(int h); bool check_pic_status(int picID); bool get_box (int spriteID, rtRect32 * box_crap, rtRect32 * box_real ); void fill_screen(int num); #define C_MAX_BACKGROUND_SPRITES_AT_ONCE 100 //too many and it will slow down void BackgroundSpriteManager::Clear() { m_sprites.clear(); } void BackgroundSpriteManager::Render(LPDIRECTDRAWSURFACE lpdest) { //LogMsg("Drawing %d sprites", m_sprites.size()); rtRect32 box_crap,box_real; DDBLTFX ddbltfx; ddbltfx.dwSize = sizeof( ddbltfx); ddbltfx.dwFillColor = 0; deque::iterator itor = m_sprites.begin(); while (itor != m_sprites.end()) { if (!check_pic_status(itor->pic)) { #ifdef _DEBUG LogMsg("Hmm, bad tilepic at %d..", itor->pic); #endif continue; } lpdest->Blt(&itor->dstRect, g_pSpriteSurface[itor->pic], &itor->srcRect , DDBLT_KEYSRC ,&ddbltfx); itor++; } } void BackgroundSpriteManager::Add(int spriteID) { BackgroundSprite s; s.pic = getpic(spriteID); get_box(spriteID, &s.dstRect, &s.srcRect); m_sprites.push_back(s); if (m_sprites.size() > C_MAX_BACKGROUND_SPRITES_AT_ONCE) { m_sprites.pop_front(); } } int next_raise(void) { int crap = *plevel; assert(crap >= 0 && crap < 200); int num = ((100 * crap) * crap); if (num > 99999) num = 99999; return(num); } void OffsetRect(rtRect32 *pR, int x, int y) { pR->AdjustPosition(x,y); } void OffsetRect(rtRect *pR, int x, int y) { pR->AdjustPosition(x,y); } void InflateRect(rtRect32 *pR, int x, int y) { pR->Inflate(x,y); } char * rt_ltoa( int num, char *pDest, int bufSize) { sprintf(pDest, "%d", num); return pDest; } void KillScriptAccelerators() { for (int i=0; i < C_MAX_SCRIPTS; i++) { g_scriptAccelerator[i].Kill(); } } void ResetDinkTimers() { g_soundTimer = 0; g_DebugKeyTimer = 0; } void SoundLoadBanks( void) {} void OneTimeDinkInit() { for (int i = 0; i < C_MAX_SPRITES_AT_ONCE; i++) { g_customSpriteMap[i] = NULL; } //defaults for memory class 1 device C_DINK_MEM_MAX_ALLOWED = (1024*1024*10); C_DINK_TEX_MEM_MAX_ALLOWED = (1024*1024*30); //avoid texture thrashing with this C_DINK_MEM_CACHE_MAX_ALLOWED_AFTER_A_DUMP = (1024*1024*8); C_DINK_TEX_MEM_MAX_ALLOWED_AFTER_A_DUMP = (1024*1024*16); if (GetDeviceMemoryClass() >= C_DEVICE_MEMORY_CLASS_2) { C_DINK_MEM_MAX_ALLOWED = (1024*1024*20); C_DINK_TEX_MEM_MAX_ALLOWED = (1024*1024*60); //avoid texture thrashing with this C_DINK_MEM_CACHE_MAX_ALLOWED_AFTER_A_DUMP = (1024*1024*16); C_DINK_TEX_MEM_MAX_ALLOWED_AFTER_A_DUMP = (1024*1024*32); } if (GetDeviceMemoryClass() >= C_DEVICE_MEMORY_CLASS_3) { C_DINK_MEM_MAX_ALLOWED = (1024*1024*40); C_DINK_TEX_MEM_MAX_ALLOWED = (1024*1024*100); //avoid texture thrashing with this C_DINK_MEM_CACHE_MAX_ALLOWED_AFTER_A_DUMP = (1024*1024*32); C_DINK_TEX_MEM_MAX_ALLOWED_AFTER_A_DUMP = (1024*1024*64); } if (GetDeviceMemoryClass() >= C_DEVICE_MEMORY_CLASS_4) { C_DINK_MEM_MAX_ALLOWED = (1024*1024*80); C_DINK_TEX_MEM_MAX_ALLOWED = (1024*1024*200); //avoid texture thrashing with this C_DINK_MEM_CACHE_MAX_ALLOWED_AFTER_A_DUMP = (1024*1024*64); C_DINK_TEX_MEM_MAX_ALLOWED_AFTER_A_DUMP = (1024*1024*128); } static bool bInitted = false; g_dglos.g_DinkUpdateTimerMS = 0; if (bInitted) return; lpDDSBackGround = NULL; // Offscreen surface lpDDSBuffer = NULL; // Offscreen surface for (int i=0; i < C_TILE_SCREEN_COUNT; i++) { g_tileScreens[i] = NULL; } bInitted = true; g_dglos.g_curPicIndex = 1; //we actually need this set before finiObjects is called memset(g_dglos.g_picInfo, 0, sizeof(pic_info)*C_MAX_SPRITES); memset(g_sprite, 0, sizeof(SpriteStruct) *C_MAX_SPRITES_AT_ONCE); memset(g_dglos.g_seq, 0, sizeof(sequence) * C_MAX_SEQUENCES); memset(g_dglos.g_scriptCallback, 0, sizeof(call_back) * C_MAX_SCRIPT_CALLBACKS); memset(&g_dglos.g_hitmap, 0, sizeof(hit_map)); memset(&g_hmap, 0, sizeof(hardness)); //just to help me keep track of memory better GetApp()->ModMemUsed(sizeof(pic_info)*C_MAX_SPRITES); GetApp()->ModMemUsed(sizeof(SpriteStruct) *C_MAX_SPRITES_AT_ONCE); GetApp()->ModMemUsed(sizeof(sequence) * C_MAX_SEQUENCES); GetApp()->ModMemUsed( sizeof(call_back) * C_MAX_SCRIPT_CALLBACKS); GetApp()->ModMemUsed( sizeof(hit_map)); GetApp()->ModMemUsed( sizeof(hardness)); } void finiObjects() { if (last_saved_game > 0) { LogMsg("Modifying saved game."); if (!add_time_to_saved_game(last_saved_game)) LogMsg("Error modifying saved game."); } for (int i=1; i < C_MAX_SPRITES_AT_ONCE; i++) { SAFE_DELETE(g_customSpriteMap[i]); } memset(g_sprite, 0, sizeof(SpriteStruct) *C_MAX_SPRITES_AT_ONCE); for (int i=1; i < C_MAX_SPRITES; i++) { SAFE_DELETE(g_pSpriteSurface[i]); } g_dglos.g_curPicIndex = 1; kill_all_scripts_for_real(); for (int i=0; i < C_TILE_SCREEN_COUNT; i++) { SAFE_DELETE(g_tileScreens[i]); } SAFE_DELETE(lpDDSBuffer); SAFE_DELETE(lpDDSBackGround); g_transitionSurf.HardKill(); KillVideoEngine(); g_dglo.m_iniScanner.Kill(); g_b_kill_app = true; LogMsg("Game shutdown run"); GetAudioManager()->KillCachedSounds(false, true, 0, 100, true); } void clear_talk(void) { memset(&g_dglos.g_talkInfo, 0, sizeof(g_dglos.g_talkInfo)); g_dglos.g_playerInfo.mouse = 0; } #if !defined PLATFORM_LINUX && !defined PLATFORM_HTML5 /* Case insensitive strncmp. Non-ISO, deprecated. */ int strnicmp(const char *pStr1, const char *pStr2, size_t Count) { char c1, c2; int v; if (Count == 0) return 0; do { c1 = *pStr1++; c2 = *pStr2++; /* the casts are necessary when pStr1 is shorter & char is signed */ v = (uint32) tolower(c1) - (uint32) tolower(c2); } while ((v == 0) && (c1 != '\0') && (--Count > 0)); return v; } #endif bool compare(char *orig, char *comp) { int len; len = strlen(comp); if (strlen(orig) != len) return(false); if (strnicmp(orig,comp,len) == 0) { return(true); } //Msg("I'm sorry, but %s does not equal %s.",orig, comp); return(false); } bool CreateBufferFromWaveFile(char* FileName, uint32 dwBuf) { g_soundInfo[dwBuf].m_fileName = FileName; return true; } bool getkey(int key) { if (sjoy.realkey[key]) return(true); else return(false); } //add hardness from a sprite int getpic(int h) { if (g_sprite[h].pseq == 0) return(0); if (g_sprite[h].pseq > C_MAX_SEQUENCES) { LogMsg("Sequence %d? But max is %d!", g_sprite[h].pseq, C_MAX_SEQUENCES); return(0); } return(g_dglos.g_seq[g_sprite[h].pseq].frame[g_sprite[h].pframe]); } string GetFileLocationString(const string fName) { if (!fName[0]) { return fName; } if (!g_dglo.m_dmodGameDir.empty()) { //extra checks for dmod stuff if (FileExists(g_dglo.m_dmodGamePathWithDir+fName)) { //found it return g_dglo.m_dmodGamePathWithDir+fName; } } if (GetEmulatedPlatformID() == PLATFORM_ID_IOS || GetEmulatedPlatformID() == PLATFORM_ID_OSX || GetEmulatedPlatformID() == PLATFORM_ID_HTML5) { //actually, we need to do this to grab stuff from the .pak we added if (FileExists(g_dglo.m_gameDir+fName)) { //found it return g_dglo.m_gameDir+fName; } } //default, from dink dir return g_dglo.m_gamePathWithDir + fName; } void add_hardness (int sprite, int num) { for (int xx = g_sprite[sprite].x + g_dglos.g_picInfo[getpic(sprite)].hardbox.left; xx < g_sprite[sprite].x + g_dglos.g_picInfo[getpic(sprite)].hardbox.right; xx++) { for (int yy = g_sprite[sprite].y + g_dglos.g_picInfo[getpic(sprite)].hardbox.top; yy < g_sprite[sprite].y + g_dglos.g_picInfo[getpic(sprite)].hardbox.bottom; yy++) { if ( (xx-20 > 600) | (xx-20 < 0)| (yy > 400) | (yy < 0)) { } else g_dglos.g_hitmap.x[xx-20].y[yy] = num; } } } void setup_anim (int seq, int sequence,int delay) { for (int o = 1; o <= g_dglos.g_seq[sequence].last; o++) { g_dglos.g_seq[seq].frame[o] = g_dglos.g_seq[sequence].s+o; g_dglos.g_seq[seq].delay[o] = delay; g_dglos.g_picInfo[g_dglos.g_seq[seq].frame[o]].m_parentSeq = seq; //so we can know who the parent is if we need to reload later } #ifdef _DEBUG if (seq == 452) { //LogMsg("yo, yo!"); } #endif //g_dglos.g_seq[seq].frame[g_dglos.g_seq[sequence].last+1] = 0; } byte get_hard(int h,int x1, int y1) { int value; //redink1 fix for screenlock bug if (g_dglos.screenlock) { if ( x1 < 0 && x1 > -5 ) x1 = 0; else if ( x1 > 599 && x1 < 605 ) x1 = 599; if ( y1 < 0 && y1 > -5 ) y1 = 0; else if ( y1 > 399 && x1 < 405 ) y1 = 399; } if (x1 < 0 || y1 < 0 || x1 > 599 || y1 > 399) return(0); value = g_dglos.g_hitmap.x[x1].y[y1]; return(value); } byte get_hard_play(int h,int x1, int y1) { int value; x1 -= 20; //redink1 fix for screenlock bug if (g_dglos.screenlock) { if ( x1 < 0 && x1 > -5 ) x1 = 0; else if ( x1 > 599 && x1 < 605 ) x1 = 599; if ( y1 < 0 && y1 > -5 ) y1 = 0; else if ( y1 > 399 && x1 < 405 ) y1 = 399; } if (x1 < 0 || y1 < 0 || x1 > 599 || y1 > 399) return(0); value = g_dglos.g_hitmap.x[x1].y[y1]; if (value > 100) { if (g_dglos.g_smallMap.sprite[value-100].prop != 0) { g_dglos.flub_mode = value; value = 0; } } return(value); } byte get_hard_map(int h,int x1, int y1) { if ((x1 < 0) || (y1 < 0)) return(0); if ((x1 > 599) ) return(0); if (y1 > 399) return(0); int til = (x1 / 50) + ( ((y1 / 50)) * 12); int offx = x1 - ((x1 / 50) * 50); int offy = y1 - ((y1 / 50) * 50); //Msg("tile %d ",til); return( g_hmap.tile[ realhard(til ) ].x[offx].y[offy]); } void fill_hardxy(rtRect32 box) { //Msg("filling hard of %d %d %d %d", box.top, box.left, box.right, box.bottom); if (box.right > 599) box.right = 600; //redink1 screenlock bug if (box.top < 0) box.top = 0; if (box.bottom > 399) box.bottom = 400; //redink1 screenlock bug if (box.left < 0) box.left = 0; for (int x1 = box.left; x1 < box.right; x1++) { for (int y1 = box.top; y1 < box.bottom; y1++) { g_dglos.g_hitmap.x[x1].y[y1] = get_hard_map(0,x1,y1); } } } void add_exp(int num, int h, bool addEvenIfNotLastSpriteHit) { //redink1 fix - made work with all sprites when using add_exp DinkC command if (addEvenIfNotLastSpriteHit == false) { if (g_sprite[h].last_hit != 1) return; } if (num > 0) { check_sprite_status(h); //add experience *pexper += num; int crap2 = add_sprite(g_sprite[h].x,g_sprite[h].y,8,0,0); g_sprite[crap2].y -= g_dglos.g_picInfo[g_dglos.g_seq[g_sprite[h].pseq].frame[g_sprite[h].pframe]].yoffset; g_sprite[crap2].x -= g_dglos.g_picInfo[g_dglos.g_seq[g_sprite[h].pseq].frame[g_sprite[h].pframe]].xoffset; g_sprite[crap2].y -= g_dglos.g_picInfo[g_dglos.g_seq[g_sprite[h].pseq].frame[g_sprite[h].pframe]].box.bottom / 3; g_sprite[crap2].x += g_dglos.g_picInfo[g_dglos.g_seq[g_sprite[h].pseq].frame[g_sprite[h].pframe]].box.right / 5; g_sprite[crap2].y -= 30; g_sprite[crap2].speed = 1; g_sprite[crap2].hard = 1; g_sprite[crap2].brain_parm = 5000; g_sprite[crap2].my = -1; g_sprite[crap2].kill = 1000; g_sprite[crap2].dir = 8; g_sprite[crap2].damage = num; if (*pexper > 99999) *pexper = 99999; } } int realhard(int tile) { // if (pam.t[tile].num > 3000) Msg("Hard is %d", pam.t[tile].num ); if (g_dglos.g_smallMap.t[tile].althard > 0) return(g_dglos.g_smallMap.t[tile].althard); else return(g_hmap.index[g_dglos.g_smallMap.t[tile].num]); } void fill_whole_hard(void) { for (int til=0; til < 96; til++) { int offx = (til * 50 - ((til / 12) * 600)); int offy = (til / 12) * 50; for (int x = 0; x < 50; x++) { for (int y = 0; y < 50; y++) { g_dglos.g_hitmap.x[offx +x].y[offy+y] = g_hmap.tile[ realhard(til) ].x[x].y[y]; } } } } void DrawCollision() { rtRect32 box_crap; DDBLTFX ddbltfx; for (int x1=0; x1 < 600; x1++) for (int y1=0; y1 < 400; y1++) { if (g_dglos.g_hitmap.x[x1].y[y1] == 1) { ddbltfx.dwFillColor = 1; ddbltfx.dwSize = sizeof(ddbltfx); box_crap.top = y1; box_crap.bottom = y1+1; box_crap.left = x1+g_gameAreaLeftOffset; //20 is to compensate for the border box_crap.right = x1+1+g_gameAreaLeftOffset; lpDDSBack->Blt(&box_crap ,NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &ddbltfx); } if (g_dglos.g_hitmap.x[x1].y[y1] == 2) { ddbltfx.dwFillColor = 128; ddbltfx.dwSize = sizeof(ddbltfx); box_crap.top = y1; box_crap.bottom = y1+1; box_crap.left = x1+g_gameAreaLeftOffset; //20 is to compensate for the border box_crap.right = x1+1+g_gameAreaLeftOffset; lpDDSBack->Blt(&box_crap ,NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &ddbltfx); } if (g_dglos.g_hitmap.x[x1].y[y1] == 3) { ddbltfx.dwFillColor = 45; ddbltfx.dwSize = sizeof(ddbltfx); box_crap.top = y1; box_crap.bottom = y1+1; box_crap.left = x1+g_gameAreaLeftOffset; //20 is to compensate for the border box_crap.right = x1+1+g_gameAreaLeftOffset; lpDDSBack->Blt(&box_crap ,NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &ddbltfx); } if (g_dglos.g_hitmap.x[x1].y[y1] > 100) { if (g_dglos.g_smallMap.sprite[ (g_dglos.g_hitmap.x[x1].y[y1]) - 100].prop == 1) { ddbltfx.dwFillColor = 20; //draw a little pixel ddbltfx.dwSize = sizeof(ddbltfx); box_crap.top = y1; box_crap.bottom = y1+1; box_crap.left = x1+g_gameAreaLeftOffset; //20 is to compensate for the border box_crap.right = x1+1+g_gameAreaLeftOffset; lpDDSBack->Blt(&box_crap ,NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &ddbltfx); } else { #ifdef _DEBUG /* if (x1 == 423+20 && y1 == 120) { //if (Random(200) == 0) LogMsg("Drawing g_dglos.g_smallMap.sprite %d's hardness..", (g_dglos.g_hitmap.x[x1].y[y1]) - 100); int hh= 5; } */ #endif //draw a little pixel if (x1 > 580) { ddbltfx.dwFillColor = 70; } else { ddbltfx.dwFillColor = 23; } ddbltfx.dwSize = sizeof(ddbltfx); box_crap.top = y1; box_crap.bottom = y1+1; box_crap.left = x1+g_gameAreaLeftOffset; //20 is to compensate for the border box_crap.right = x1+1+g_gameAreaLeftOffset; lpDDSBack->Blt(&box_crap ,NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &ddbltfx); } } } } bool LoadTileScreenIfNeeded(int h, bool &bRequireRebuild) { bRequireRebuild = false; if (g_tileScreens[h]) return true; //already loaded string fName = "tiles/ts"; if (h < 10) fName += "0"; fName += toString(h)+".bmp"; assert(!g_tileScreens[h]); #ifdef _DEBUG LogMsg("Loading tilescreen %s", fName.c_str()); #endif g_tileScreens[h] = LoadBitmapIntoSurface(GetFileLocationString(fName).c_str(), TRANSPARENT_NONE, IDirectDrawSurface::MODE_NORMAL); if (g_tileScreens[h] && g_tileScreens[h]->m_pSurf->GetSurfaceType() != SoftSurface::SURFACE_PALETTE_8BIT) { //we're going to require a hicolor backbuffer. if (lpDDSBackGround->m_pSurf->GetSurfaceType() == SoftSurface::SURFACE_PALETTE_8BIT) { LogMsg("Detected high color tilescreen bmps. Converting backbuffers to 32 bit on the fly."); //switch it delete lpDDSBackGround; lpDDSBackGround = InitOffscreenSurface(C_DINK_SCREENSIZE_X, C_DINK_SCREENSIZE_Y, IDirectDrawSurface::MODE_SHADOW_GL, true); bRequireRebuild = true; } } if (g_tileScreens[h]->m_pSurf->GetSurfaceType() == SoftSurface::SURFACE_PALETTE_8BIT && lpDDSBuffer->m_pSurf->GetSurfaceType() == SoftSurface::SURFACE_PALETTE_8BIT) //if (0) { //test to make sure the palettes are the same.. some dmods change them slightly which breaks things (Cast Awakening) if (!g_tileScreens[h]->m_pSurf->IsPaletteTheSame(lpDDSBuffer->m_pSurf->GetPalette(), lpDDSBuffer->m_pSurf->GetPaletteColorCount())) { if (lpDDSBackGround->m_pSurf->GetSurfaceType() == SoftSurface::SURFACE_PALETTE_8BIT) { //switch it delete lpDDSBackGround; lpDDSBackGround = InitOffscreenSurface(C_DINK_SCREENSIZE_X, C_DINK_SCREENSIZE_Y, IDirectDrawSurface::MODE_SHADOW_GL, true); bRequireRebuild = true; } LogMsg("Detected tilescreen palette doesn't match backbuffers. Converting backbuffers to 32 bit on the fly."); delete lpDDSBuffer; lpDDSBuffer = InitOffscreenSurface(C_DINK_SCREENSIZE_X, C_DINK_SCREENSIZE_Y, IDirectDrawSurface::MODE_SHADOW_GL, true); } } if (g_tileScreens[h]->m_pSurf->GetSurfaceType() == SoftSurface::SURFACE_NONE) { //some kind of error LogMsg("Error loading tilescreen %d", h); delete g_tileScreens[h]; g_tileScreens[h] = 0; } return g_tileScreens[h] != NULL; } void fix_dead_sprites( void ) { for (int i = 1; i < 100; i++) { if (g_dglos.g_playerInfo.spmap[*pmap].type[i] == 6) { if ((g_dglos.g_dinkTick > (g_dglos.g_playerInfo.spmap[*pmap].last_time + 300000)) || (g_dglos.g_dinkTick +400000 < g_dglos.g_playerInfo.spmap[*pmap].last_time + 300000) ) { //this sprite can come back online now g_dglos.g_playerInfo.spmap[*pmap].type[i] = 0; } } if (g_dglos.g_playerInfo.spmap[*pmap].type[i] == 7) { if (g_dglos.g_dinkTick > (g_dglos.g_playerInfo.spmap[*pmap].last_time + 180000)) { //this sprite can come back online now g_dglos.g_playerInfo.spmap[*pmap].type[i] = 0; } } if (g_dglos.g_playerInfo.spmap[*pmap].type[i] == 8) { if (g_dglos.g_dinkTick > (g_dglos.g_playerInfo.spmap[*pmap].last_time + 60000)) { //this sprite can come back online now g_dglos.g_playerInfo.spmap[*pmap].type[i] = 0; } } } } void load_map(const int num) { FILE * fp; int holdme,lsize; LogMsg("Loading map %d...",num); StreamingInstance *pFile = GetFileManager()->GetStreaming(GetFileLocationString(g_dglos.current_map), NULL, false); // fp = fopen( GetFileLocationString(g_dglos.current_map).c_str(), "rb"); if (!pFile) { LogMsg("Cannot find %s file!!!",g_dglos.current_map); return; } //redink1 set correctly so Dink appears on mini-map for warps and such //doesn't work, because 'num' is actually the offset in map.dat, not the map screen number //if (map.indoor[num] == 0) // play.last_map = num; lsize = sizeof(struct small_map); holdme = (lsize * (num-1)); //fseek( fp, holdme, SEEK_SET); //pFile->SeekFromStart(holdme); //only will work if the file is uncompressed in the zip //another way is this.. const int bufferSize = 1024*4; char buffer[bufferSize]; while (holdme > 0) { int bytesRead = pFile->Read((byte*)buffer, rt_min(holdme, bufferSize)); holdme -= bytesRead; } //Msg("Trying to read %d bytes with offset of %d",lsize,holdme); pFile->Read((byte*)&g_dglos.g_smallMap, lsize); //int shit = fread( &g_dglos.g_smallMap, lsize, 1, fp); /* current player */ // Msg("Read %d bytes.",shit); //if (shit == 0) LogMsg("ERROR: Couldn't read map %d?!?", num); // fclose(fp); delete pFile; g_sprite[1].move_active = false; g_sprite[1].move_nohard = false; g_sprite[1].freeze = false; g_dglos.screenlock = 0; fill_whole_hard(); fix_dead_sprites(); check_midi(); } void save_game(int num) { FILE * fp; char crap[256]; //redink1 created this char info_temp[200]; CreateDirectoryRecursively(g_dglo.m_savePath, g_dglo.m_gameDir); sprintf(crap, "%ssave%d.dat", g_dglo.m_savePath.c_str(), num); fp = fopen(crap, "wb"); if (!fp) { LogError("Unable to save game to %s", crap); return; } //lets set some vars first g_dglos.g_playerInfo.x = g_sprite[1].x; g_dglos.g_playerInfo.y = g_sprite[1].y; g_dglos.g_playerInfo.version = C_DINK_VERSION; g_dglos.g_playerInfo.pseq = g_sprite[1].pseq; g_dglos.g_playerInfo.pframe = g_sprite[1].pframe; g_dglos.g_playerInfo.seq = g_sprite[1].seq; g_dglos.g_playerInfo.frame = g_sprite[1].frame; g_dglos.g_playerInfo.size = g_sprite[1].size; g_dglos.g_playerInfo.dir = g_sprite[1].dir; g_dglos.g_playerInfo.strength = g_sprite[1].strength; g_dglos.g_playerInfo.defense = g_sprite[1].defense; g_dglos.g_playerInfo.que = g_sprite[1].que; g_dglos.g_playerInfo.minutes = ( GetBaseApp()->GetGameTick()-g_dglos.time_start) / (1000*60); //g_dglos.g_playerInfo.m_gameTime = GetBaseApp()->GetGameTick(); //g_dglos.time_start = GetBaseApp()->GetGameTick(); g_dglos.g_playerInfo.base_idle = g_sprite[1].base_idle; g_dglos.g_playerInfo.base_walk = g_sprite[1].base_walk; g_dglos.g_playerInfo.base_hit = g_sprite[1].base_hit; //redink1 - save game things for storing new map, palette, and tile information strncpy(g_dglos.g_playerInfo.mapdat, g_dglos.current_map, 50); strncpy(g_dglos.g_playerInfo.dinkdat, g_dglos.current_dat, 50); //redink1 code for custom save game names strcpy(info_temp,g_dglos.save_game_info); decipher_string(info_temp, 0); strncpy(g_dglos.g_playerInfo.gameinfo,info_temp,77); //sprintf(play.gameinfo, "Level %d",*plevel); last_saved_game = num; fwrite(&g_dglos.g_playerInfo,sizeof(g_dglos.g_playerInfo),1,fp); fclose(fp); } void kill_all_vars(void) { memset(&g_dglos.g_playerInfo, 0, sizeof(g_dglos.g_playerInfo)); } bool attach(void) { for (int i = 1; i < max_vars; i++) { if (compare((char*)"&life", g_dglos.g_playerInfo.var[i].name)) { plife = &g_dglos.g_playerInfo.var[i].var; } if (compare((char*)"&vision", g_dglos.g_playerInfo.var[i].name)) { pvision = &g_dglos.g_playerInfo.var[i].var; } if (compare((char*)"&result", g_dglos.g_playerInfo.var[i].name)) { presult = &g_dglos.g_playerInfo.var[i].var; } if (compare((char*)"&speed", g_dglos.g_playerInfo.var[i].name)) { pspeed = &g_dglos.g_playerInfo.var[i].var; } if (compare((char*)"&timing", g_dglos.g_playerInfo.var[i].name)) { ptiming = &g_dglos.g_playerInfo.var[i].var; } if (compare((char*)"&lifemax", g_dglos.g_playerInfo.var[i].name)) { plifemax = &g_dglos.g_playerInfo.var[i].var; } if (compare((char*)"&exp", g_dglos.g_playerInfo.var[i].name)) pexper = &g_dglos.g_playerInfo.var[i].var; if (compare((char*)"&strength", g_dglos.g_playerInfo.var[i].name)) pstrength = &g_dglos.g_playerInfo.var[i].var; if (compare((char*)"&defense", g_dglos.g_playerInfo.var[i].name)) pdefense = &g_dglos.g_playerInfo.var[i].var; if (compare((char*)"&gold", g_dglos.g_playerInfo.var[i].name)) pgold = &g_dglos.g_playerInfo.var[i].var; if (compare((char*)"&magic", g_dglos.g_playerInfo.var[i].name)) pmagic = &g_dglos.g_playerInfo.var[i].var; if (compare((char*)"&level", g_dglos.g_playerInfo.var[i].name)) plevel = &g_dglos.g_playerInfo.var[i].var; if (compare((char*)"&player_map", g_dglos.g_playerInfo.var[i].name)) pmap = &g_dglos.g_playerInfo.var[i].var; if (compare((char*)"&cur_weapon", g_dglos.g_playerInfo.var[i].name)) pcur_weapon = &g_dglos.g_playerInfo.var[i].var; if (compare((char*)"&cur_magic", g_dglos.g_playerInfo.var[i].name)) pcur_magic = &g_dglos.g_playerInfo.var[i].var; if (compare((char*)"&last_text", g_dglos.g_playerInfo.var[i].name)) plast_text = &g_dglos.g_playerInfo.var[i].var; if (compare((char*)"&magic_level", g_dglos.g_playerInfo.var[i].name)) pmagic_level = &g_dglos.g_playerInfo.var[i].var; if (compare((char*)"&update_status", g_dglos.g_playerInfo.var[i].name)) pupdate_status = &g_dglos.g_playerInfo.var[i].var; if (compare((char*)"&missile_target", g_dglos.g_playerInfo.var[i].name)) pmissile_target = &g_dglos.g_playerInfo.var[i].var; if (compare((char*)"&enemy_sprite", g_dglos.g_playerInfo.var[i].name)) penemy_sprite = &g_dglos.g_playerInfo.var[i].var; if (compare((char*)"&magic_cost", g_dglos.g_playerInfo.var[i].name)) pmagic_cost = &g_dglos.g_playerInfo.var[i].var; if (compare((char*)"&missle_source", g_dglos.g_playerInfo.var[i].name)) pmissle_source = &g_dglos.g_playerInfo.var[i].var; } if (!pstrength) { LogError("Corrupted save or .c file? strength global var not set."); return false; } g_dglos.g_guiStrength = *pstrength; g_dglos.g_guiMagic = *pmagic; g_dglos.g_guiGold = *pgold; g_dglos.g_guiDefense = *pdefense; g_dglos.g_guiLife = *plife; g_dglos.g_guiLifeMax = *plifemax; g_dglos.g_guiExp = *pexper; g_dglos.g_guiMagicLevel = *pmagic_level; g_dglos.g_guiRaise = next_raise(); return true; //no error } bool add_time_to_saved_game(int num) { /* FILE * fp; char crap[256]; sprintf(crap, "%ssave%d.dat", g_dglo.m_gamePath.c_str(), num); fp = fopen(crap, "rb"); if (!fp) { LogMsg("Couldn't load save game %d", num); return(false); } else { fread(&g_dglos.g_playerInfo,sizeof(g_dglos.g_playerInfo),1,fp); fclose(fp); } //great, now let's resave it with added time LogMsg("Ok, adding time."); g_dglos.g_playerInfo.minutes += 0; sprintf(crap, "save%d.dat", num); fp = fopen(crap, "wb"); if (fp) { fwrite(&g_dglos.g_playerInfo,sizeof(g_dglos.g_playerInfo),1,fp); fclose(fp); } LogMsg("Wrote it.(%d of time)", g_dglos.g_playerInfo.minutes); */ return(true); } bool load_game(int num) { FILE * fp; char crap[256]; //lets get rid of our magic and weapon scripts if (g_dglos.weapon_script != 0) { if (locate(g_dglos.weapon_script, "DISARM")) { run_script(g_dglos.weapon_script); } } if (g_dglos.magic_script != 0) if (locate(g_dglos.magic_script, "DISARM")) run_script(g_dglos.magic_script); g_dglos.g_bowStatus.active = false; g_dglos.weapon_script = 0; g_dglos.magic_script = 0; g_dglos.midi_active = true; if (last_saved_game > 0) { LogMsg("Modifying saved game."); if (!add_time_to_saved_game(last_saved_game)) LogMsg("Error modifying saved game."); } StopMidi(); for (int i=1; i < C_MAX_SPRITES_AT_ONCE; i++) { kill_sprite_all(i); } SetDefaultVars(false); g_sprite[1].active = true; g_dglos.g_gameMode = 2; g_sprite[1].noclip = 0; g_sprite[1].brain = 1; g_sprite[1].nocontrol = 0; sprintf(crap, "%ssave%d.dat", g_dglo.m_savePath.c_str(), num); fp = fopen(crap, "rb"); if (!fp) { LogMsg("Couldn't load save game %d", num); return(false); } else { fread(&g_dglos.g_playerInfo,sizeof(g_dglos.g_playerInfo),1,fp); fclose(fp); //redink1 - new map, if exist if (strlen(g_dglos.g_playerInfo.mapdat) > 0 && strlen(g_dglos.g_playerInfo.dinkdat) > 0) { strcpy(g_dglos.current_map, g_dglos.g_playerInfo.mapdat); strcpy(g_dglos.current_dat, g_dglos.g_playerInfo.dinkdat); ToLowerCase(g_dglos.current_map); ToLowerCase(g_dglos.current_dat); load_info(); } g_sprite[1].damage = 0; g_sprite[1].x = g_dglos.g_playerInfo.x; g_sprite[1].y = g_dglos.g_playerInfo.y; g_dglos.walk_off_screen = 0; g_sprite[1].nodraw = 0; g_dglos.g_pushingEnabled = 1; g_sprite[1].pseq = g_dglos.g_playerInfo.pseq; g_sprite[1].pframe = g_dglos.g_playerInfo.pframe; g_sprite[1].size = g_dglos.g_playerInfo.size; g_sprite[1].seq = g_dglos.g_playerInfo.seq; g_sprite[1].frame = g_dglos.g_playerInfo.frame; g_sprite[1].dir = g_dglos.g_playerInfo.dir; g_sprite[1].strength = g_dglos.g_playerInfo.strength; g_sprite[1].defense = g_dglos.g_playerInfo.defense; g_sprite[1].que = g_dglos.g_playerInfo.que; if (g_dglos.g_playerInfo.m_gameTime != 0) { GetApp()->SetGameTick(g_dglos.g_playerInfo.m_gameTime); } else { //convert from old style of dink timing GetApp()->SetGameTick(g_dglos.g_playerInfo.minutes*1000*60); g_dglos.time_start = 0; } //g_dglos.time_start = GetBaseApp()->GetGameTick(); g_sprite[1].base_idle = g_dglos.g_playerInfo.base_idle; g_sprite[1].base_walk = g_dglos.g_playerInfo.base_walk; g_sprite[1].base_hit = g_dglos.g_playerInfo.base_hit; int script = load_script("main", 0, true); locate(script, "main"); run_script(script); //lets attach our vars to the scripts attach(); *pupdate_status = 1; LogMsg("Attached vars."); //redink1 fixes g_dglos.dinkspeed = 3; if (*pcur_weapon != 0) { if (g_dglos.g_playerInfo.g_itemData[*pcur_weapon].active == false) { *pcur_weapon = 1; g_dglos.weapon_script = 0; LogMsg("Loadgame error: Player doesn't have armed weapon - changed to 1."); } else { g_dglos.weapon_script = load_script(g_dglos.g_playerInfo.g_itemData[*pcur_weapon].name, 1000, false); if (locate(g_dglos.weapon_script, "DISARM")) run_script(g_dglos.weapon_script); g_dglos.weapon_script = load_script(g_dglos.g_playerInfo.g_itemData[*pcur_weapon].name, 1000, false); if (locate(g_dglos.weapon_script, "ARM")) run_script(g_dglos.weapon_script); } } if (*pcur_magic != 0) { if (g_dglos.g_playerInfo.g_itemData[*pcur_magic].active == false) { *pcur_magic = 0; g_dglos.magic_script = 0; LogMsg("Loadgame error: Player doesn't have armed magic - changed to 0."); } else { g_dglos.magic_script = load_script(g_dglos.g_playerInfo.g_MagicData[*pcur_magic].name, 1000, false); if (locate(g_dglos.magic_script, "DISARM")) run_script(g_dglos.magic_script); g_dglos.magic_script = load_script(g_dglos.g_playerInfo.g_MagicData[*pcur_magic].name, 1000, false); if (locate(g_dglos.magic_script, "ARM")) run_script(g_dglos.magic_script); } } kill_repeat_sounds_all(); load_map(g_MapInfo.loc[*pmap]); LogMsg("Loaded map."); BuildScreenBackground(); LogMsg("Map drawn."); //stop any weird noises from happening on load g_dglos.g_guiStrength = *pstrength; g_dglos.g_guiMagic = *pmagic; g_dglos.g_guiGold = *pgold; g_dglos.g_guiDefense = *pdefense; //redink1 fixes g_dglos.g_guiExp = *pexper; draw_status_all(); LogMsg("Status drawn."); last_saved_game = num; return(true); } } void kill_cur_item( void ) { if (*pcur_weapon != 0) { if (g_dglos.g_playerInfo.g_itemData[*pcur_weapon].active == true) { if (g_dglos.weapon_script != 0) if (locate(g_dglos.weapon_script, "DISARM")) run_script(g_dglos.weapon_script); g_dglos.weapon_script = load_script(g_dglos.g_playerInfo.g_itemData[*pcur_weapon].name, 0, false); g_dglos.g_playerInfo.g_itemData[*pcur_weapon].active = false; *pcur_weapon = 0; if (g_dglos.weapon_script != 0) if (locate(g_dglos.weapon_script, "HOLDINGDROP")) run_script(g_dglos.weapon_script); if (g_dglos.weapon_script != 0) if (locate(g_dglos.weapon_script, "DROP")) run_script(g_dglos.weapon_script); g_dglos.weapon_script = 0; } else { LogMsg("Error: Can't kill cur item, none armed."); } } } void kill_cur_item_script( char name[20]) { int select = 0; for (int i = 1; i < 17; i++) { if (g_dglos.g_playerInfo.g_itemData[i].active) if (compare(g_dglos.g_playerInfo.g_itemData[i].name, name)) { select = i; goto found; } } return; found: if (*pcur_weapon == select) { //holding it right now if (locate(g_dglos.weapon_script, "HOLDINGDROP")) run_script(g_dglos.weapon_script); if (locate(g_dglos.weapon_script, "DISARM")) run_script(g_dglos.weapon_script); *pcur_weapon = 0; g_dglos.weapon_script = 0; } int script = load_script(g_dglos.g_playerInfo.g_itemData[select].name, 0, false); g_dglos.g_playerInfo.g_itemData[select].active = false; if (locate(script, "DROP")) run_script(script); draw_status_all(); } void kill_cur_magic_script( char name[20]) { int select = 0; for (int i = 1; i < 9; i++) { if (g_dglos.g_playerInfo.g_MagicData[i].active) if (compare(g_dglos.g_playerInfo.g_MagicData[i].name, name)) { select = i; goto found; } } return; found: if (*pcur_magic == select) { //holding it right now if (locate(g_dglos.magic_script, "HOLDINGDROP")) run_script(g_dglos.magic_script); if (locate(g_dglos.magic_script, "DISARM")) run_script(g_dglos.magic_script); *pcur_weapon = 0; g_dglos.magic_script = 0; } int script = load_script(g_dglos.g_playerInfo.g_MagicData[select].name, 0, false); g_dglos.g_playerInfo.g_MagicData[select].active = false; if (locate(script, "DROP")) run_script(script); draw_status_all(); } void kill_cur_magic( void ) { if (*pcur_magic != 0) { if (g_dglos.g_playerInfo.g_MagicData[*pcur_magic].active == true) { if (g_dglos.magic_script != 0) if (locate(g_dglos.magic_script, "DISARM")) run_script(g_dglos.magic_script); g_dglos.magic_script = load_script(g_dglos.g_playerInfo.g_MagicData[*pcur_magic].name, 0, false); g_dglos.g_playerInfo.g_MagicData[*pcur_magic].active = false; *pcur_magic = 0; if (g_dglos.magic_script != 0) if (locate(g_dglos.magic_script, "HOLDINGDROP")) run_script(g_dglos.magic_script); if (g_dglos.magic_script != 0) if (locate(g_dglos.magic_script, "DROP")) run_script(g_dglos.magic_script); g_dglos.magic_script = 0; } else { LogMsg("Error: Can't kill cur magic, none armed."); } } } void update_screen_time(void ) { //Msg("Cur time is %d", play.spmap[*pmap].last_time); //Msg("Map is %d..", *pmap); g_dglos.g_playerInfo.spmap[*pmap].last_time = g_dglos.g_dinkTick; //Msg("Time was saved as %d", play.spmap[*pmap].last_time); } bool load_game_small(int num, char * line, int *mytime) { FILE * fp; char crap[255]; sprintf(crap, "%ssave%d.dat", g_dglo.m_savePath.c_str(), num); fp = fopen(crap, "rb"); if (!fp) { //LogMsg("Couldn't quickload save game %d", num); line[0] = 0; *mytime = 0; return(false); } fread(&short_play,sizeof(player_short_info),1,fp); fclose(fp); *mytime = short_play.minutes; strcpy(line, short_play.gameinfo); return(true); } void load_info() { FILE * fp; string fName = GetFileLocationString(g_dglos.current_dat); //redink1 changed 'crap' to 'current_dat' StreamingInstance *pFile = GetFileManager()->GetStreaming(GetFileLocationString(g_dglos.current_dat), NULL, false); //fp = fopen(fName.c_str(), "rb"); if (!pFile) { LogMsg("Unable to load_info() on %s", fName.c_str()); return; } else { LogMsg("World data loaded."); pFile->Read((byte*)&g_MapInfo, sizeof(struct map_info)); //fread(&g_MapInfo,sizeof(struct map_info),1,fp); delete pFile; //fclose(fp); } } bool load_hard(void) { //FILE * fp; string fName = GetFileLocationString("hard.dat"); StreamingInstance *pFile = GetFileManager()->GetStreaming(fName, NULL, false); //fp = fopen(fName.c_str(), "rb"); if (!pFile) { return false; } else { //fread(&g_hmap,sizeof(struct hardness),1,fp); pFile->Read((byte*)&g_hmap, sizeof(struct hardness)); delete(pFile); } return true; } void blit_background(void) { rtRect32 rcRect( 0,0,C_DINK_SCREENSIZE_X,C_DINK_SCREENSIZE_Y); lpDDSBack->BltFast( 0, 0, lpDDSBackGround, &rcRect, DDBLTFAST_NOCOLORKEY); } void draw_wait() { LogMsg("waiting.."); } bool LoadSpriteSingleFrame(string fNameBase, int seq, int oo, int picIndex, eTransparencyType transType, FFReader *pReader, rtRect32 hardbox, int xoffset, int yoffset, int notanim) { int work; string fName = fNameBase; if (oo < 10) fName += "0"; fName += toString(oo)+".bmp"; byte *pMem = pReader->LoadFileIntoMemory(fName, NULL); if (g_dglos.g_seq[seq].m_spaceAllowed != 0) { if ( pMem && oo > g_dglos.g_seq[seq].m_spaceAllowed) { //LogMsg("Truncating anim to fit in existing seq %d", seq); SAFE_DELETE_ARRAY(pMem); } } if (pReader->GetLastError() != FFReader::ERROR_NONE) { LogMsg("Low mem error"); assert(!"Low mem"); FreeSequence(seq); return false; } if (pMem) { #ifdef _DEBUG //LogMsg("Loaded %s", (fName).c_str()); #endif //assert(!g_dglos.g_picInfo[g_cur_sprite].pSurface); SAFE_DELETE(g_pSpriteSurface[picIndex]); #ifdef _DEBUG if (seq == 421 && oo == 26) { LogMsg("Woah, "); } if (fName == "ds-cr-01.bmp") { LogMsg("Found it"); } #endif g_pSpriteSurface[picIndex] = LoadBitmapIntoSurface("", transType, IDirectDrawSurface::MODE_SHADOW_GL, pMem); } else { if (oo == 1) { LogMsg("load_sprites: Anim %s not found.",(fName).c_str()); //assert(0); return false; } return false; } SAFE_DELETE_ARRAY(pMem); if (picIndex > 0) { int surfSizeX, surfSizeY; GetSizeOfSurface(g_pSpriteSurface[picIndex], &surfSizeX, &surfSizeY); g_dglos.g_picInfo[picIndex].box.top = 0; g_dglos.g_picInfo[picIndex].box.left = 0; g_dglos.g_picInfo[picIndex].box.right = surfSizeX; g_dglos.g_picInfo[picIndex].box.bottom = surfSizeY; } if (!g_dglos.g_picInfo[picIndex].m_bCustomSettingsApplied) { #ifdef _DEBUG if (seq == 180 && oo == 3) { //LogMsg("Woah nelly"); } #endif //set the default offset stuff if ( (oo > 1) && g_dglos.g_seq[seq].m_bIsAnim) //yes, it should be a &, but it breaks old dmods { // g_dglos.g_picInfo[picIndex].yoffset = g_dglos.g_picInfo[g_dglos.g_seq[seq].s+1].yoffset; // g_dglos.g_picInfo[picIndex].xoffset = g_dglos.g_picInfo[g_dglos.g_seq[seq].s+1].xoffset; g_dglos.g_picInfo[picIndex].yoffset = yoffset; g_dglos.g_picInfo[picIndex].xoffset = xoffset; } else { if (yoffset > 0) g_dglos.g_picInfo[picIndex].yoffset = yoffset; else { g_dglos.g_picInfo[picIndex].yoffset = (g_dglos.g_picInfo[picIndex].box.bottom - (g_dglos.g_picInfo[picIndex].box.bottom / 4)) - (g_dglos.g_picInfo[picIndex].box.bottom / 30); } if (xoffset > 0) g_dglos.g_picInfo[picIndex].xoffset = xoffset; else { g_dglos.g_picInfo[picIndex].xoffset = (g_dglos.g_picInfo[picIndex].box.right - (g_dglos.g_picInfo[picIndex].box.right / 2)) + (g_dglos.g_picInfo[picIndex].box.right / 6); } if (oo == 1 && g_dglos.g_seq[seq].m_bIsAnim) { //save it to this seq's settings g_dglos.g_seq[seq].m_xoffset = g_dglos.g_picInfo[picIndex].xoffset; g_dglos.g_seq[seq].m_yoffset = g_dglos.g_picInfo[picIndex].yoffset; } } } if (!g_dglos.g_picInfo[picIndex].m_bCustomSettingsApplied) { g_dglos.g_picInfo[picIndex].hardbox.Clear(); /* if ( (oo > 1) && g_dglos.g_seq[seq].m_bIsAnim) { g_dglos.g_picInfo[picIndex].hardbox = hardbox; //reset it } */ //ok, setup main offsets, lets build the hard block if (hardbox.right > 0) { //forced setting g_dglos.g_picInfo[picIndex].hardbox.left = hardbox.left; g_dglos.g_picInfo[picIndex].hardbox.right = hardbox.right; } else { //guess setting work = g_dglos.g_picInfo[picIndex].box.right / 4; g_dglos.g_picInfo[picIndex].hardbox.left -= work; g_dglos.g_picInfo[picIndex].hardbox.right += work; } if (hardbox.bottom > 0) { g_dglos.g_picInfo[picIndex].hardbox.top = hardbox.top; g_dglos.g_picInfo[picIndex].hardbox.bottom = hardbox.bottom; } else { work = g_dglos.g_picInfo[picIndex].box.bottom / 10; g_dglos.g_picInfo[picIndex].hardbox.top -= work; g_dglos.g_picInfo[picIndex].hardbox.bottom += work; } } return true; } bool load_sprites(char org[512], int seq, int speed, int xoffset, int yoffset, rtRect32 hardbox, eTransparencyType transType, bool leftalign, bool bScanOnly = false, int frame = 0) { //LogMsg("Cur pic is %d", g_curPicIndex); /* if (notanim) { g_dglos.g_seq[seq].m_bUsingLoadOnDemand = true; if (g_dglos.g_seqData[seq].last != 0) { LogMsg("Already loaded"); return true; } } */ #ifdef _DEBUG if (seq == 424) { LogMsg("Loading status bar"); } #endif char hold[5]; ToLowerCase(org); string tempStr(org); StringReplace("\\", "/", tempStr); static FFReader reader; reader.Init(g_dglo.m_gameDir, g_dglo.m_dmodGamePathWithDir, GetPathFromString(tempStr), g_dglo.m_bUsingDinkPak); string fNameBase = GetFileNameFromString(tempStr); #ifdef _DEBUG if (frame == 0) { if (!reader.DoesFileExist(fNameBase+"01.bmp")) { LogMsg("Can't find %s", (string(org)+"01.bmp").c_str()); return true; //might be a serious error, not sure } } #endif #ifdef _DEBUG //LogMsg("Loading %s", org); #endif if (frame != 0) { //special code for loading a single frame... LoadSpriteSingleFrame(fNameBase, seq, frame, g_dglos.g_seq[seq].s+frame, transType, &reader, hardbox, xoffset, yoffset, false); return true; } // redink1 added to fix bug where loading sequences over others wouldn't work quite right. int save_cur = g_dglos.g_curPicIndex; bool reload = false; if (g_dglos.g_seq[seq].last != 0) { FreeSequence(seq); // Msg("Saving sprite %d", save_cur); g_dglos.g_curPicIndex = g_dglos.g_seq[seq].s+1; #ifdef _DEBUG //LogMsg("Reloading: Temp g_curPicIndex is %d", g_curPicIndex); #endif reload = true; } else { //LogMsg("Not reloading.."); g_dglos.g_seq[seq].s = g_dglos.g_curPicIndex -1; } if (bScanOnly) { if (reload) { g_dglos.g_curPicIndex = save_cur; return true; } for (int oo = 1; oo <= C_MAX_SPRITE_FRAMES; oo++) { if (oo < 10) strcpy(hold, "0"); else strcpy(hold,""); if (reader.DoesFileExist(fNameBase+string(hold)+toString(oo)+".bmp")) { g_dglos.g_curPicIndex++; } else { if (oo == 1) { LogMsg("load_sprites: Anim %s not found.",tempStr.c_str()); //assert(0); } g_dglos.g_seq[seq].m_spaceAllowed = (oo - 1); g_dglos.g_seq[seq].last = (oo - 1); setup_anim(seq,seq,speed); break; } } return true; } #ifdef _DEBUG if (seq == 424) { LogMsg("hey"); } #endif for (int oo = 1; oo <= C_MAX_SPRITE_FRAMES; oo++) { if (LoadSpriteSingleFrame(fNameBase, seq, oo, g_dglos.g_curPicIndex, transType, &reader, hardbox, xoffset, yoffset, false)) { g_dglos.g_curPicIndex++; if (!reload) save_cur++; } else { if (oo > 1) { g_dglos.g_seq[seq].m_spaceAllowed = (oo - 1); g_dglos.g_seq[seq].last = (oo - 1); //make reloaded anims of different lengths work right, without breaking anims like idle that replay frames, confusing the length if (g_dglos.g_seq[seq].frame[g_dglos.g_seq[seq].last] == g_dglos.g_seq[seq].s+g_dglos.g_seq[seq].last && !g_dglos.g_seq[seq].m_bFrameSetUsed) { //looks like it was a standard anim without any extra frames added, truncate it here g_dglos.g_seq[seq].frame[g_dglos.g_seq[seq].last+1] = 0; } //setup_anim(seq,seq,speed); } break; } } g_dglos.g_curPicIndex = save_cur; return true; } eTransparencyType GetTransparencyOverrideForSequence(eTransparencyType defaultTrans, int seqID) { switch (seqID) { case 442: //level# return TRANSPARENT_WHITE; case 423: //item menu bg return TRANSPARENT_WHITE; case 437: //magic icons return TRANSPARENT_BLACK; case 438: //item icons return TRANSPARENT_BLACK; } return defaultTrans; } void ReadFromLoadSequenceString(char ev[15][100] ) { // name seq speed offsetx offsety hardx hardy int seqID = atol(ev[3]); #ifdef _DEBUG if (seqID == 452) { LogMsg("Found seq %d", seqID); } #endif int speed = 0; rtRect32 hardbox; //redink1 set hardbox to zero memory by default... fixed some weird compiler warnings in debug mode. Might screw up default hard box? hardbox.Clear(); g_dglos.g_seq[seqID].active = true; g_dglos.g_seq[seqID].m_bIsAnim = false; #ifdef _DEBUG if (seqID == 180) { LogMsg("Booya"); } #endif assert(strlen(ev[2]) < C_SPRITE_MAX_FILENAME_SIZE); strcpy(g_dglos.g_seq[seqID].m_fileName, ev[2]); if (compare(ev[4], "BLACK")) { g_dglos.g_seq[seqID].m_transType = TRANSPARENT_BLACK; g_dglos.g_seq[seqID].m_bIsAnim = true; } else if (compare(ev[4], "LEFTALIGN")) { g_dglos.g_seq[seqID].m_bLeftAlign = true; g_dglos.g_seq[seqID].m_transType = GetTransparencyOverrideForSequence(TRANSPARENT_NONE, seqID); }else if (compare(ev[4], "NOTANIM") /*|| compare(ev[4], "NOTANIN")*/ ) //to work around a typo in MsDink's DMOD, but not to work around the notanin error in seq 424 in original dini.ini's.. yeah, complicated. Why!?!? { #ifdef _DEBUG if (seqID == 424) { LogMsg("He"); } #endif g_dglos.g_seq[seqID].m_transType = GetTransparencyOverrideForSequence(TRANSPARENT_WHITE, seqID); } else { g_dglos.g_seq[seqID].m_transType = TRANSPARENT_WHITE; //default, an anim with a lot of properties assigned /* if (ev[9][0] != 0 && ev[10][0] == 0 && //(seqID == 119 //|| seqID == 167 //|| seqID == 316 //|| seqID == 421 //|| seqID == 422 ) ) //119, 167, 316, 421, 422 { //The original dink.ini has some malformed lines, where anim speed is not specified, yet it's sort of //required here. Instead of fixing the .ini which would not fix various DMOD's, we'll do a work around //LogMsg("MISSING SOMETHING: %s", line); strcpy(ev[10], ev[9]); strcpy(ev[9], ev[8]); strcpy(ev[8], ev[7]); strcpy(ev[7], ev[6]); strcpy(ev[6], ev[5]); strcpy(ev[5], ev[4]); strcpy(ev[4], "30"); //set the speed } */ g_dglos.g_seq[seqID].m_bIsAnim = true; //yes, an animation! g_dglos.g_seq[seqID].m_speed = atol(ev[4]); g_dglos.g_seq[seqID].m_xoffset = atol(ev[5]); g_dglos.g_seq[seqID].m_yoffset = atol(ev[6]); g_dglos.g_seq[seqID].m_hardbox.left = atol(ev[7]); g_dglos.g_seq[seqID].m_hardbox.top = atol(ev[8]); g_dglos.g_seq[seqID].m_hardbox.right = atol(ev[9]); g_dglos.g_seq[seqID].m_hardbox.bottom = atol(ev[10]); #ifdef _DEBUG //LogMsg("Hardbox: %s", PrintRect(hardbox).c_str()); #endif } } bool ReloadSequence(int seqID, int frame, bool bScanOnly) { //handle a possible case where we need to always load frame 1 before any other frame to get the correct offset for anims if (frame > 1 && !bScanOnly && g_dglos.g_seq[seqID].m_bIsAnim) { ReloadSequence(seqID, 1, bScanOnly); } return load_sprites(g_dglos.g_seq[seqID].m_fileName,seqID,g_dglos.g_seq[seqID].m_speed,g_dglos.g_seq[seqID].m_xoffset,g_dglos.g_seq[seqID].m_yoffset, g_dglos.g_seq[seqID].m_hardbox, g_dglos.g_seq[seqID].m_transType, g_dglos.g_seq[seqID].m_bLeftAlign, bScanOnly, frame); //Crap } bool figure_out(const char *line, int load_seq) { char ev[15][100]; rtRect32 hardbox; hardbox.Clear(); bool bReturn = true; memset(&ev,0, sizeof(ev)); int myseq = 0,myframe = 0; int special = 0; int special2 = 0; for (int i=1; i <= 14; i++) { separate_string(line, i,' ',ev[i]); // Msg("Word %d is \"%s\"",i,ev[i]); if (!ev[i][0]) break; } if ( (compare(ev[1],"LOAD_SEQUENCE_NOW")) | ( compare(ev[1],"LOAD_SEQUENCE")) ) { // name seq speed offsetx offsety hardx hardy int seqID = atol(ev[3]); if (!g_dglos.g_seq[seqID].active) { ReadFromLoadSequenceString(ev); //first time, actually init it bReturn = load_sprites(g_dglos.g_seq[seqID].m_fileName,seqID,g_dglos.g_seq[seqID].m_speed,g_dglos.g_seq[seqID].m_xoffset,g_dglos.g_seq[seqID].m_yoffset, g_dglos.g_seq[seqID].m_hardbox , g_dglos.g_seq[seqID].m_transType, g_dglos.g_seq[seqID].m_bLeftAlign, true); } else { ReadFromLoadSequenceString(ev); FreeSequence(seqID); //force a full reload, the anim probably changed ReloadSequence(seqID); } return bReturn; } return pre_figure_out(line, load_seq, false); //assert(!"Uh.. why are people calling other things besides load sequence with init? Should we support that?"); //return bReturn; } void program_idata(void) { return; } bool pre_figure_out(const char *line, int load_seq, bool bLoadSpriteOnly) { if (line[0] == 0 || line[0] == ';') return true; bool bReturn = true; char ev[15][100]; memset(&ev,0, sizeof(ev)); int myseq = 0,myframe = 0; int special = 0; int special2 = 0; for (int i=1; i <= 14; i++) { separate_string(line, i,' ',ev[i]); // Msg("Word %d is \"%s\"",i,ev[i]); if (!ev[i][0]) break; } if (bLoadSpriteOnly) { if ( compare(ev[1],"LOAD_SEQUENCE_NOW") || compare(ev[1],"LOAD_SEQUENCE") ) // if ( (load_seq == -1) | (load_seq == atol(ev[3])) ) { int seqID = atol(ev[3]); ReadFromLoadSequenceString(ev); bReturn = load_sprites(g_dglos.g_seq[seqID].m_fileName,seqID,g_dglos.g_seq[seqID].m_speed,g_dglos.g_seq[seqID].m_xoffset,g_dglos.g_seq[seqID].m_yoffset, g_dglos.g_seq[seqID].m_hardbox , g_dglos.g_seq[seqID].m_transType, g_dglos.g_seq[seqID].m_bLeftAlign, true); //Crap return bReturn; } return true; } if (compare(ev[1],"playmidi")) { PlayMidi(ev[2]); return bReturn; } if (compare(ev[1],"SET_SPRITE_INFO")) { // name seq speed offsetx offsety hardx hardy //if (k[seq[myseq].frame[myframe]].frame = 0) Msg("Changing sprite that doesn't exist..."); myseq = atol(ev[2]); myframe = atol(ev[3]); g_dglos.g_picInfo[g_dglos.g_seq[myseq].frame[myframe]].xoffset = atol(ev[4]); g_dglos.g_picInfo[g_dglos.g_seq[myseq].frame[myframe]].yoffset = atol(ev[5]); g_dglos.g_picInfo[g_dglos.g_seq[myseq].frame[myframe]].hardbox.left = atol(ev[6]); g_dglos.g_picInfo[g_dglos.g_seq[myseq].frame[myframe]].hardbox.top = atol(ev[7]); g_dglos.g_picInfo[g_dglos.g_seq[myseq].frame[myframe]].hardbox.right = atol(ev[8]); g_dglos.g_picInfo[g_dglos.g_seq[myseq].frame[myframe]].hardbox.bottom = atol(ev[9]); g_dglos.g_picInfo[g_dglos.g_seq[myseq].frame[myframe]].m_bCustomSettingsApplied = true; if (myframe == 1 && g_dglos.g_seq[myseq].m_bIsAnim) { //set these to be the default for the whole anim.. (replacing that idata crap from the old source) #ifdef _DEBUG //LogMsg("Setting seq %d frame 1 to default for anim", myseq); #endif g_dglos.g_seq[myseq].m_xoffset = g_dglos.g_picInfo[g_dglos.g_seq[myseq].frame[myframe]].xoffset; g_dglos.g_seq[myseq].m_yoffset = g_dglos.g_picInfo[g_dglos.g_seq[myseq].frame[myframe]].yoffset; //g_dglos.g_seq[myseq].m_hardbox = g_dglos.g_picInfo[g_dglos.g_seq[myseq].frame[myframe]].hardbox; } } if (compare(ev[1],"SET_FRAME_SPECIAL")) { // name seq speed offsetx offsety hardx hardy //if (k[seq[myseq].frame[myframe]].frame = 0) Msg("Changing sprite that doesn't exist..."); myseq = atol(ev[2]); myframe = atol(ev[3]); special = atol(ev[4]); g_dglos.g_seq[myseq].special[myframe] = special; //LogMsg("Set special. %d %d %d",myseq, myframe, special); } if (compare(ev[1],"SET_FRAME_DELAY")) { // name seq speed offsetx offsety hardx hardy //if (k[seq[myseq].frame[myframe]].frame = 0) Msg("Changing sprite that doesn't exist..."); myseq = atol(ev[2]); myframe = atol(ev[3]); special = atol(ev[4]); g_dglos.g_seq[myseq].delay[myframe] = special; //LogMsg("Set delay. %d %d %d",myseq, myframe, special); } if (compare(ev[1],"STARTING_DINK_X")) { myseq = atol(ev[2]); g_dglos.g_playerInfo.x = myseq; } if (compare(ev[1],"STARTING_DINK_Y")) { myseq = atol(ev[2]); g_dglos.g_playerInfo.y = myseq; } if (compare(ev[1],"SET_FRAME_FRAME")) { //assert(!"this is actually used?"); myseq = atol(ev[2]); myframe = atol(ev[3]); special = atol(ev[4]); special2 = atol(ev[5]); g_dglos.g_seq[myseq].m_bFrameSetUsed = true; if (special == -1) g_dglos.g_seq[myseq].frame[myframe] = special; else g_dglos.g_seq[myseq].frame[myframe] = g_dglos.g_seq[special].frame[special2]; #ifdef _DEBUG //LogMsg("Set frame. %d %d %d",myseq, myframe, special); if (myseq == 16) { //LogMsg("Idle.."); } #endif } return bReturn; } int draw_num(int mseq, char nums[50], int mx, int my) { int length = 0; int ddrval; int rnum = 0; if (!check_seq_status(mseq)) return 0; for (int i=0; i < strlen(nums); i++) { if (nums[i] == '0') rnum = 10; else if (nums[i] == '1') rnum = 1; else if (nums[i] == '2') rnum = 2; else if (nums[i] == '3') rnum = 3; else if (nums[i] == '4') rnum = 4; else if (nums[i] == '5') rnum = 5; else if (nums[i] == '6') rnum = 6; else if (nums[i] == '7') rnum = 7; else if (nums[i] == '8') rnum = 8; else if (nums[i] == '9') rnum = 9; else if (nums[i] == '/') rnum = 11; if ( (rnum != 11) && (!(mseq == 442)) ) ddrval = lpDDSBack->BltFast( mx+length, my,g_pSpriteSurface[g_dglos.g_seq[mseq].frame[rnum]], &g_dglos.g_picInfo[g_dglos.g_seq[mseq].frame[rnum]].box , DDBLTFAST_NOCOLORKEY); else ddrval = lpDDSBack->BltFast( mx+length, my, g_pSpriteSurface[g_dglos.g_seq[mseq].frame[rnum]], &g_dglos.g_picInfo[g_dglos.g_seq[mseq].frame[rnum]].box , DDBLTFAST_SRCCOLORKEY); length += g_dglos.g_picInfo[g_dglos.g_seq[mseq].frame[rnum]].box.right; } return(length); } void draw_exp(bool bDraw) { if (!bDraw) return; char buffer[30]; char nums[30]; char final[30]; //Msg("Drawing exp.. which is %d and %d",fexp, *pexp); strcpy(final, ""); strcpy(nums,rt_ltoa(g_dglos.g_guiExp, buffer, 10)); if (strlen(nums) < 5) for (int i = 1; i < (6 - strlen(nums)); i++) strcat(final, "0"); strcat(final, nums); strcat(final,"/"); strcpy(nums,rt_ltoa(g_dglos.g_guiRaise, buffer, 10)); if (strlen(nums) < 5) for (int i = 1; i < (6 - strlen(nums)); i++) strcat(final, "0"); strcat(final, nums); draw_num(181, final, 404, 459); } void draw_strength(bool bDraw) { if (!bDraw) return; char final[30]; char buffer[30]; char nums[30]; //Msg("Drawing exp.. which is %d and %d",fexp, *pexp); strcpy(final, ""); strcpy(nums,rt_ltoa(g_dglos.g_guiStrength, buffer, 10)); if (strlen(nums) < 3) for (int i = 1; i < (4 - strlen(nums)); i++) strcat(final, "0"); strcat(final, nums); //Msg("Drawing %s..",final); draw_num(182, final, 81, 415); } void draw_defense(bool bDraw) { if (!bDraw) return; char final[30]; char buffer[30]; char nums[30]; //Msg("Drawing exp.. which is %d and %d",fexp, *pexp); strcpy(final, ""); strcpy(nums,rt_ltoa(g_dglos.g_guiDefense, buffer, 10)); if (strlen(nums) < 3) for (int i = 1; i < (4 - strlen(nums)); i++) strcat(final, "0"); strcat(final, nums); draw_num(183, final, 81, 437); } void draw_magic(bool bDraw) { if (!bDraw) return; char final[30]; char buffer[30]; char nums[30]; //Msg("Drawing exp.. which is %d and %d",fexp, *pexp); strcpy(final, ""); strcpy(nums,rt_ltoa(g_dglos.g_guiMagic, buffer, 10)); if (strlen(nums) < 3) for (int i = 1; i < (4 - strlen(nums)); i++) strcat(final, "0"); strcat(final, nums); draw_num(184, final, 81, 459); } void draw_level() { char final[30]; char buffer[30]; //*plevel = 15; //Msg("Drawing level.. which is %d ",*plevel); strcpy(final, rt_ltoa(*plevel, buffer, 10)); if (strlen(final) == 1) draw_num(442, final, 528, 456); else draw_num(442, final, 523, 456); } void draw_gold(bool bDraw) { if (!bDraw) return; char final[30]; char buffer[30]; char nums[30]; //Msg("Drawing exp.. which is %d and %d",fexp, *pexp); strcpy(final, ""); strcpy(nums,rt_ltoa(g_dglos.g_guiGold, buffer, 10)); if (strlen(nums) < 5) for (int i = 1; i < (6 - strlen(nums)); i++) strcat(final, "0"); strcat(final, nums); draw_num(185, final, 298, 457); } void draw_bar(int life, int seqman) { int ddrval; int cur = 0; int curx = 284; int cury = 412; int rnum = 3; int curx_start = curx; rtRect32 box; if (!check_seq_status(seqman)) return; while(1) { cur++; if (cur > life) { cur--; int rem = (cur) - (cur / 10) * 10; if (rem != 0) { box = g_dglos.g_picInfo[g_dglos.g_seq[seqman].frame[rnum]].box; //Msg("Drawing part bar . cur is %d", rem); box.right = (box.right * ((rem) * 10)/100); //woah, there is part of a bar remaining. Lets do it. lpDDSBack->BltFast( curx, cury, g_pSpriteSurface[g_dglos.g_seq[seqman].frame[rnum]], &box , DDBLTFAST_NOCOLORKEY); } //are we done? return; } rnum = 2; if (cur < 11) rnum = 1; if (cur == *plifemax) rnum = 3; if ( (cur / 10) * 10 == cur) { ddrval = lpDDSBack->BltFast( curx, cury, g_pSpriteSurface[g_dglos.g_seq[seqman].frame[rnum]], &g_dglos.g_picInfo[g_dglos.g_seq[seqman].frame[rnum]].box , DDBLTFAST_NOCOLORKEY); //if (ddrval != DD_OK) dderror(ddrval); curx += g_dglos.g_picInfo[g_dglos.g_seq[seqman].frame[rnum]].box.right-1; if (cur == 110) { cury += g_dglos.g_picInfo[g_dglos.g_seq[seqman].frame[rnum]].box.bottom+5; curx = curx_start; } if (cur == 220) return; } } } void draw_health() { g_dglos.g_guiLifeMax = *plifemax; draw_bar(g_dglos.g_guiLifeMax, 190); g_dglos.g_guiLife = *plife; draw_bar(g_dglos.g_guiLife, 451); } void draw_icons() { int ddrval; int seq; int frame; if (*pcur_weapon != 0) if (g_dglos.g_playerInfo.g_itemData[*pcur_weapon].active) { //disarm old weapon //play.item[*pcur_weapon].seq, seq = g_dglos.g_playerInfo.g_itemData[*pcur_weapon].seq; frame = g_dglos.g_playerInfo.g_itemData[*pcur_weapon].frame; if (!check_seq_status(seq, frame)) return; DrawFilledRect(557, 413, g_pSpriteSurface[g_dglos.g_seq[seq].frame[frame]]->m_pSurf->GetWidth() ,g_pSpriteSurface[g_dglos.g_seq[seq].frame[frame]]->m_pSurf->GetHeight(), MAKE_RGBA(0,0,0,255)); ddrval = lpDDSBack->BltFast( 557, 413, g_pSpriteSurface[g_dglos.g_seq[seq].frame[frame]], &g_dglos.g_picInfo[g_dglos.g_seq[seq].frame[frame]].box, DDBLTFAST_SRCCOLORKEY); } if (*pcur_magic != 0) if (g_dglos.g_playerInfo.g_MagicData[*pcur_magic].active) { //disarm old weapon //play.mitem[*pcur_magic].seq, seq = g_dglos.g_playerInfo.g_MagicData[*pcur_magic].seq; frame = g_dglos.g_playerInfo.g_MagicData[*pcur_magic].frame; if (!check_seq_status(seq, frame)) return; DrawFilledRect(153, 413, g_pSpriteSurface[g_dglos.g_seq[seq].frame[frame]]->m_pSurf->GetWidth() ,g_pSpriteSurface[g_dglos.g_seq[seq].frame[frame]]->m_pSurf->GetHeight(), MAKE_RGBA(0,0,0,255)); ddrval = lpDDSBack->BltFast( 153, 413, g_pSpriteSurface[g_dglos.g_seq[seq].frame[frame]], &g_dglos.g_picInfo[g_dglos.g_seq[seq].frame[frame]].box, DDBLTFAST_SRCCOLORKEY); } } void draw_vertical(int percent, int mx, int my, int mseq, int mframe) { int ddrval; int cut; if (percent > 25) percent = 25; percent = (percent * 4); rtRect32 myrect; myrect = g_dglos.g_picInfo[g_dglos.g_seq[mseq].frame[mframe]].box; int full = myrect.bottom; cut = (full * percent) / 100; myrect.bottom = cut; my += (full - cut); ddrval = lpDDSBack->BltFast( mx, my, g_pSpriteSurface[g_dglos.g_seq[mseq].frame[mframe]], &myrect, DDBLTFAST_NOCOLORKEY); } void draw_virt2(int percent, int mx, int my, int mseq, int mframe) { int ddrval; int cut; if (percent > 25) percent = 25; percent = (percent * 4); rtRect32 myrect; myrect = g_dglos.g_picInfo[g_dglos.g_seq[mseq].frame[mframe]].box; int full = myrect.bottom; cut = (full * percent) / 100; myrect.bottom = cut; ddrval = lpDDSBack->BltFast( mx, my, g_pSpriteSurface[g_dglos.g_seq[mseq].frame[mframe]], &myrect, DDBLTFAST_NOCOLORKEY); } void draw_hor(int percent, int mx, int my, int mseq, int mframe) { int ddrval; int cut; if (percent > 25) percent = 25; percent = (percent * 4); rtRect32 myrect; myrect = g_dglos.g_picInfo[g_dglos.g_seq[mseq].frame[mframe]].box; int full = myrect.right; cut = (full * percent) / 100; full = cut; myrect.right = full; ddrval = lpDDSBack->BltFast( mx, my, g_pSpriteSurface[g_dglos.g_seq[mseq].frame[mframe]], &myrect, DDBLTFAST_NOCOLORKEY); } void draw_hor2(int percent, int mx, int my, int mseq, int mframe) { int ddrval; int cut; if (percent > 25) percent = 25; percent = (percent * 4); rtRect32 myrect; myrect = g_dglos.g_picInfo[g_dglos.g_seq[mseq].frame[mframe]].box; int full = myrect.right; cut = (full * percent) / 100; myrect.right = cut; mx += (full - cut); ddrval = lpDDSBack->BltFast( mx, my, g_pSpriteSurface[g_dglos.g_seq[mseq].frame[mframe]], &myrect, DDBLTFAST_NOCOLORKEY); } void draw_mlevel(int percent, bool bDraw) { if (!bDraw) return; int mseq = 180; int bary = 6; int barx = 7; if (percent > 0) draw_vertical(percent, 149, 411, mseq, bary); percent -= 25; if (percent > 0) draw_hor(percent, 149, 409, mseq, barx); percent -= 25; if (percent > 0) draw_virt2(percent, 215, 411, mseq, bary); percent -= 25; if (percent > 0) draw_hor2(percent, 149, 466, mseq, barx); } void draw_status_all(void) { g_dglos.g_guiStrength = *pstrength; g_dglos.g_guiMagic = *pmagic; g_dglos.g_guiGold = *pgold; g_dglos.g_guiDefense = *pdefense; return; } void BlitGUIOverlay() { if (GetDinkGameMode() == DINK_GAME_MODE_MOUSE) return; if (GetDinkSubGameMode() == DINK_SUB_GAME_MODE_SHOWING_BMP) return; rtRect32 rcRect; rcRect.left = 0; rcRect.top = 0; rcRect.right = C_DINK_SCREENSIZE_X; rcRect.bottom = 80; if (*pupdate_status == 0) { //draw black bars around things DrawFilledRect(0, 400, rcRect.right, rcRect.bottom, MAKE_RGBA(0,0,0,255)); rcRect.right = 20; rcRect.bottom = 400; DrawFilledRect(0, 0, rcRect.right, rcRect.bottom, MAKE_RGBA(0,0,0,255)); DrawFilledRect(620, 0, rcRect.right, rcRect.bottom, MAKE_RGBA(0,0,0,255)); return; } g_dglos.g_guiRaise = next_raise(); if ( *pexper < g_dglos.g_guiRaise ) { g_dglos.g_guiExp = *pexper; } else { g_dglos.g_guiExp = g_dglos.g_guiRaise - 1; } /* g_dglos.g_guiStrength = *pstrength; g_dglos.g_guiMagic = *pmagic; g_dglos.g_guiGold = *pgold; g_dglos.g_guiDefense = *pdefense; */ g_dglos.g_guiLastMagicDraw = 0; if (g_dglo.m_curView == DinkGlobals::VIEW_ZOOMED || g_dglo.m_viewOverride == DinkGlobals::VIEW_ZOOMED) return; if (!check_seq_status(180)) return; lpDDSBack->BltFast( 0, 400, g_pSpriteSurface[g_dglos.g_seq[180].frame[3]], &rcRect , DDBLTFAST_NOCOLORKEY ); rcRect.left = 0; rcRect.top = 0; rcRect.right = 20; rcRect.bottom = 400; lpDDSBack->BltFast( 0, 0, g_pSpriteSurface[g_dglos.g_seq[180].frame[1]], &rcRect , DDBLTFAST_NOCOLORKEY ); lpDDSBack->BltFast( 620, 0,g_pSpriteSurface[g_dglos.g_seq[180].frame[2]], &rcRect , DDBLTFAST_NOCOLORKEY ); draw_exp(true); draw_health(); draw_strength(true); draw_defense(true); draw_magic(true); draw_gold(true); draw_level(); draw_icons(); if (*pmagic_cost > 0 && *pmagic_level > 0) { draw_mlevel( (float(*pmagic_level) / float(*pmagic_cost))*100, true ); } } bool inside_box(int x1, int y1, rtRect32 box) { if (x1 > box.right) return(false); if (x1 < box.left) return(false); if (y1 > box.bottom) return(false); if (y1 < box.top) return(false); return(true); } int add_sprite_dumb(int x1, int y, int brain,int pseq, int pframe,int size ) { #ifdef _DEBUG if (pseq == 180) { LogMsg("wtf!"); } #endif for (int x=1; x < C_MAX_SPRITES_AT_ONCE; x++) { if (g_sprite[x].active == false) { SAFE_DELETE(g_customSpriteMap[x]); memset(&g_sprite[x], 0, sizeof(g_sprite[x])); //Msg("Making sprite %d.",x); g_sprite[x].active = true; g_sprite[x].x = x1; g_sprite[x].y = y; g_sprite[x].my = 0; g_sprite[x].mx = 0; g_sprite[x].speed = 0; g_sprite[x].brain = brain; g_sprite[x].frame = 0; g_sprite[x].pseq = pseq; g_sprite[x].pframe = pframe; g_sprite[x].size = size; g_sprite[x].seq = 0; if (x > g_dglos.last_sprite_created) g_dglos.last_sprite_created = x; g_sprite[x].timer = 0; g_sprite[x].wait = 0; g_sprite[x].lpx[0] = 0; g_sprite[x].lpy[0] = 0; g_sprite[x].moveman = 0; g_sprite[x].seq_orig = 0; g_sprite[x].base_hit = -1; g_sprite[x].base_walk = -1; g_sprite[x].base_die = -1; g_sprite[x].base_idle = -1; g_sprite[x].base_attack = -1; g_sprite[x].last_sound = 0; g_sprite[x].hard = 1; g_sprite[x].alt.Clear(); g_sprite[x].althard = 0; g_sprite[x].sp_index = 0; g_sprite[x].nocontrol = 0; g_sprite[x].idle = 0; g_sprite[x].strength = 0; g_sprite[x].damage = 0; g_sprite[x].defense = 0; if ( g_customSpriteMap[x] == NULL ) { g_customSpriteMap[x] = new std::map; } else { g_customSpriteMap[x]->clear(); } return(x); } } return(0); } bool get_box (int spriteID, rtRect32 * pDstRect, rtRect32 * pSrcRect ) { rtRect32 math; int32 sz,sy,x_offset,y_offset; int32 mplayx = g_gameAreaRightBarStartX; int32 mplayl = g_gameAreaLeftOffset; int32 mplayy = C_DINK_ORIGINAL_GAME_AREA_Y; if (g_sprite[spriteID].noclip) { mplayx = C_DINK_SCREENSIZE_X; mplayl = 0; mplayy = C_DINK_SCREENSIZE_Y; } rtRect32 krect; if (getpic(spriteID) < 1) { #ifdef _DEBUG LogMsg("Yo, sprite %d has a bad pic. (Map %d) Seq %d, Frame %d",spriteID,*pmap, g_sprite[spriteID].pseq, g_sprite[spriteID].pframe); #endif //redink1 added to fix frame-not-in-memory immediately if (!check_seq_status(g_sprite[spriteID].pseq, g_sprite[spriteID].pframe)) return false; } #ifdef _DEBUG if (g_sprite[spriteID].pseq == 66 && g_sprite[spriteID].pframe == 1) { //LogMsg("Yo"); } #endif int picID = getpic(spriteID); if (g_sprite[spriteID].size == 0) g_sprite[spriteID].size = 100; int scale = g_sprite[spriteID].size; int txoffset = g_dglos.g_picInfo[picID].xoffset; int tyoffset = g_dglos.g_picInfo[picID].yoffset; *pSrcRect = g_dglos.g_picInfo[picID].box; krect = g_dglos.g_picInfo[picID].box; if (scale != 100) { sz = ((krect.right * scale) / 100); sy = ((krect.bottom * scale) / 100); } else { sz = 0; sy = 0; } if (scale != 100) { sz = ((sz - krect.right) / 2); sy = ((sy - krect.bottom) / 2); } pDstRect->left = g_sprite[spriteID].x-txoffset-sz; math.left = g_sprite[spriteID].x-txoffset; pDstRect->top = g_sprite[spriteID].y - tyoffset-sy; math.top = g_sprite[spriteID].y-tyoffset; pDstRect->right = (math.left+ (krect.right -krect.left)) + sz; math.right = math.left+ krect.right; pDstRect->bottom = (math.top + (krect.bottom - krect.top)) + sy; math.bottom = math.top + krect.bottom; if ( (g_sprite[spriteID].alt.right != 0) | (g_sprite[spriteID].alt.left != 0) | (g_sprite[spriteID].alt.top != 0) | (g_sprite[spriteID].alt.right != 0)) { //redink1 checks for correct box stuff if (g_sprite[spriteID].alt.left < 0) g_sprite[spriteID].alt.left = 0; if (g_sprite[spriteID].alt.left > g_dglos.g_picInfo[picID].box.right) g_sprite[spriteID].alt.left = g_dglos.g_picInfo[picID].box.right; if (g_sprite[spriteID].alt.top < 0) g_sprite[spriteID].alt.top = 0; if (g_sprite[spriteID].alt.top > g_dglos.g_picInfo[picID].box.bottom) g_sprite[spriteID].alt.top = g_dglos.g_picInfo[picID].box.bottom; if (g_sprite[spriteID].alt.right < 0) g_sprite[spriteID].alt.right = 0; if (g_sprite[spriteID].alt.right > g_dglos.g_picInfo[picID].box.right) g_sprite[spriteID].alt.right = g_dglos.g_picInfo[picID].box.right; if (g_sprite[spriteID].alt.bottom < 0) g_sprite[spriteID].alt.bottom = 0; if (g_sprite[spriteID].alt.bottom > g_dglos.g_picInfo[picID].box.bottom) g_sprite[spriteID].alt.bottom = g_dglos.g_picInfo[picID].box.bottom; //spr[h].alt.bottom = 10; pDstRect->left = pDstRect->left + g_sprite[spriteID].alt.left; pDstRect->top = pDstRect->top + g_sprite[spriteID].alt.top; pDstRect->right = pDstRect->right - (g_dglos.g_picInfo[picID].box.right - g_sprite[spriteID].alt.right); pDstRect->bottom = pDstRect->bottom - (g_dglos.g_picInfo[picID].box.bottom - g_sprite[spriteID].alt.bottom); *pSrcRect = g_sprite[spriteID].alt; //Msg("I should be changing box size... %d %d,%d,%d",spr[h].alt.right,spr[h].alt.left,spr[h].alt.top,spr[h].alt.bottom); } //********* Check to see if they need to be cut down and do clipping if (g_sprite[spriteID].size == 0) g_sprite[spriteID].size = 100; if (pDstRect->left < mplayl) { x_offset = pDstRect->left * (-1) + mplayl; pDstRect->left = mplayl; //box_real->left += (math.left * (-1)) + mplayl; if (g_sprite[spriteID].size != 100) pSrcRect->left += (((x_offset * 100) / (g_sprite[spriteID].size )) ); else pSrcRect->left += x_offset; if (pDstRect->right-1 < mplayl) goto nodraw; } if (pDstRect->top < 0) { y_offset = pDstRect->top * (-1); pDstRect->top = 0; //box_real->top += math.top * (-1) + 0; if (g_sprite[spriteID].size != 100) pSrcRect->top += (((y_offset * 100) / (g_sprite[spriteID].size )) ); else pSrcRect->top += y_offset; if (pDstRect->bottom-1 < 0) goto nodraw; } if (pDstRect->right > mplayx) { x_offset = (pDstRect->right) - mplayx; pDstRect->right = mplayx; //x_real->right -= math.right - mplayx; if (g_sprite[spriteID].size != 100) pSrcRect->right -= ((x_offset * 100) / (g_sprite[spriteID].size )); else pSrcRect->right -= x_offset; if (pDstRect->left+1 > mplayx) goto nodraw; // Msg("ok, crap right is %d, real right is %d.",box_crap->right - box_crap->left,box_real->right); } if (pDstRect->bottom > mplayy) { y_offset = (pDstRect->bottom) - mplayy; pDstRect->bottom = mplayy; if (g_sprite[spriteID].size != 100) pSrcRect->bottom -= ((y_offset * 100) / (g_sprite[spriteID].size )); else pSrcRect->bottom -= y_offset; if (pDstRect->top+1 > mplayy) goto nodraw; } return(true); nodraw: return(false); } void kill_callbacks_owned_by_script(int script) { for (int i = 1; i < C_MAX_SCRIPT_CALLBACKS; i++) { if (g_dglos.g_scriptCallback[i].owner == script) { if (debug_mode) LogMsg("Kill_all_callbacks just killed %d for script %d", i, script); //killed callback g_dglos.g_scriptCallback[i].active = false; } } } void kill_script(int k) { if (g_scriptInstance[k] != NULL) { kill_callbacks_owned_by_script(k); //now lets kill all local vars associated with this script for (int i = 1; i < max_vars; i++) { if (g_dglos.g_playerInfo.var[i].active) if (g_dglos.g_playerInfo.var[i].scope == k) { g_dglos.g_playerInfo.var[i].active = false; } } if (debug_mode) LogMsg("Killed script %s. (num %d)", g_scriptInstance[k]->name, k); free(g_scriptInstance[k]); g_scriptInstance[k] = NULL; free(g_scriptBuffer[k]); g_scriptBuffer[k] = NULL; g_scriptAccelerator[k].Kill(); } } void kill_all_scripts(void) { for (int k = 1; k < C_MAX_SCRIPTS; k++) { if (g_scriptInstance[k] != NULL) if (g_scriptInstance[k]->sprite != 1000) kill_script(k); } for (int k = 1; k < C_MAX_SCRIPT_CALLBACKS; k++) { if (g_dglos.g_scriptCallback[k].active) { if ( (g_scriptInstance[g_dglos.g_scriptCallback[k].owner] != NULL) && (g_scriptInstance[g_dglos.g_scriptCallback[k].owner]->sprite == 1000) ) { } else { if (debug_mode) LogMsg("Killed callback %d. (was attached to script %d.)",k, g_dglos.g_scriptCallback[k].owner); g_dglos.g_scriptCallback[k].active = 0; } } } } void kill_all_scripts_for_real(void) { for (int k = 1; k < C_MAX_SCRIPTS; k++) { if (g_scriptInstance[k] != NULL) kill_script(k); } for (int k = 1; k < C_MAX_SCRIPT_CALLBACKS; k++) { g_dglos.g_scriptCallback[k].active = 0; } } bool ScriptEOF(int script) { if (!g_scriptInstance[script]) return true; return (g_scriptInstance[script]->current >= g_scriptInstance[script]->end); } bool read_next_line(int script, char *line) { if ( (g_scriptInstance[script] == NULL) || (g_scriptBuffer == NULL) ) { LogMsg(" ERROR: Tried to read script %d, it doesn't exist.", script); return(false); } if (g_scriptInstance[script]->current >= g_scriptInstance[script]->end) { //at end of buffer return(false); } strcpy(line, ""); for (int k = g_scriptInstance[script]->current; (k < g_scriptInstance[script]->end); k++) { // Msg("..%d",k); strchar(line, g_scriptBuffer[script][k]); g_scriptInstance[script]->current++; if ( (g_scriptBuffer[script][k] == '\n') || (g_scriptBuffer[script][k] == '\r') ) { return(true); } if (g_scriptInstance[script]->current >= g_scriptInstance[script]->end) return(false); } return(false); } int load_script(const char *pScript, int sprite, bool set_sprite, bool bQuietError) { string fName = "story/"+ToLowerCaseString(pScript); int script; FILE *stream; bool comp = false; bool bFound = false; string fileName; if (!g_dglo.m_dmodGameDir.empty()) { //first check the dmod path fileName = g_dglo.m_dmodGamePathWithDir+fName+".d"; if (FileExists(fileName)) { bFound = true; comp = true; } else { fileName = g_dglo.m_dmodGamePathWithDir+fName+".c"; if (FileExists(fileName)) { bFound = true; } } } if (!bFound) { if (g_dglo.m_bUsingDinkPak) { fileName = g_dglo.m_gameDir+fName+".d"; } else { fileName = g_dglo.m_gamePathWithDir+fName+".d"; } if (FileExists(fileName)) { comp = true; } else { if (g_dglo.m_bUsingDinkPak) { fileName = g_dglo.m_gameDir+fName+".c"; } else { fileName = g_dglo.m_gamePathWithDir+fName+".c"; } if (!FileExists(fileName)) { if (bQuietError) return 0; LogMsg("Script %s not found. (checked for .C and .D) (requested by %d?)",fileName.c_str(), sprite); return 0; } } } int k; for (k=1; k < C_MAX_SCRIPTS; k++) { if (g_scriptBuffer[k] == NULL) { //found one not being used goto found; } } LogMsg("Couldn't find unused buffer for script."); return(0); found: #ifdef _DEBUG LogMsg("Loading script %s..", fileName.c_str()); #endif script = k; g_scriptAccelerator[script].Kill(); g_scriptInstance[script] = (struct refinfo *) malloc( sizeof(struct refinfo)); memset(g_scriptInstance[script], 0, sizeof(struct refinfo)); //load compiled script FileInstance scriptFile(fileName, false); if (!scriptFile.IsLoaded()) { LogMsg("Script %s not found. (checked for .C and .D) (requested by %d?)",fileName.c_str(), sprite); return(0); } char * pMemBuffer = new char[1024*128]; pMemBuffer[0] = 0; if (!pMemBuffer) { LogMsg("Mem error"); return false; } // LogMsg("Checking compression..."); if (comp) { dink_decompress(scriptFile.GetAsBytes(), pMemBuffer); } else { decompress_nocomp(scriptFile.GetAsBytes(), pMemBuffer); } //LogMsg("file in cbuf"); g_scriptInstance[script]->end = (strlen(pMemBuffer) ); //LogMsg("length of %s is %d!", fileName.c_str(), g_scriptInstance[script]->end); g_scriptBuffer[script] = (char *) malloc( g_scriptInstance[script]->end ); if (g_scriptBuffer[script] == NULL) { LogMsg("Couldn't allocate rbuff %d.",script); SAFE_DELETE_ARRAY(pMemBuffer); return(0); } // LogMsg("Copying script"); memcpy(g_scriptBuffer[script], pMemBuffer, g_scriptInstance[script]->end); SAFE_DELETE_ARRAY(pMemBuffer); //LogMsg("Script loaded by sprite %d into space %d.", sprite,script); strcpy(g_scriptInstance[script]->name, pScript); g_scriptInstance[script]->sprite = sprite; if (set_sprite) { if (sprite != 0) if (sprite != 1000) g_sprite[sprite].script = script; } //LogMsg("Returning script"); return (script); } void strip_beginning_spaces(char *pInput) { char * h; h = pInput; if (pInput[0] != 32) { return; } while(h[0] == 32) { h = &h[1]; } strcpy(pInput, h); } bool locate(int script, char proc[20]) { if (g_scriptInstance[script] == NULL) { return(false); } int saveme = g_scriptInstance[script]->current; g_scriptInstance[script]->current = 0; char line[200]; char ev[3][100]; char temp[100]; //Msg("locate is looking for %s in %s", proc, rinfo[script]->name); while(read_next_line(script, line)) { strip_beginning_spaces(line); memset(&ev, 0, sizeof(ev)); get_word(line, 1, ev[1]); if (compare(ev[1], (char*)"VOID")) { get_word(line, 2, ev[2]); separate_string(ev[2], 1,'(',temp); // Msg("Found procedure %s.",temp); if (compare(temp,proc)) { // Msg("Located %s",proc); //clean up vars so it is ready to run if (g_scriptInstance[script]->sprite != 1000) { g_sprite[g_scriptInstance[script]->sprite].move_active = false; g_sprite[g_scriptInstance[script]->sprite].move_nohard = false; } g_scriptInstance[script]->skipnext = false; g_scriptInstance[script]->onlevel = 0; g_scriptInstance[script]->level = 0; return(true); //this is desired proc } } } //Msg("Locate ended on %d.", saveme); g_scriptInstance[script]->current = saveme; return(false); } bool locate_goto(char proc[50], int script) { g_scriptInstance[script]->current = 0; int procLen = strlen(proc); if (proc[procLen - 1] == ';') { proc[procLen - 1] = ':'; } else { //just add it proc[procLen] = ':'; proc[procLen + 1] = 0; } ScriptPosition *pScriptPos = g_scriptAccelerator[script].GetPositionByName(proc); if (pScriptPos) { //LogMsg("Did fast lookup of %s", proc); //found it, nice shortcut g_scriptInstance[script]->current = pScriptPos->current; g_scriptInstance[script]->skipnext = false; g_scriptInstance[script]->onlevel = 0; g_scriptInstance[script]->level = 0; return true; } char line[200]; // Msg("locate is looking for %s", proc); while(read_next_line(script, line)) { strip_beginning_spaces(line); if (strnicmp(line, proc, procLen) == 0) { //if (debug_mode) LogMsg("Found goto : Line is %s, word is %s.", line, ev[1]); g_scriptInstance[script]->skipnext = false; g_scriptInstance[script]->onlevel = 0; g_scriptInstance[script]->level = 0; //add it for faster look-up nexttime g_scriptAccelerator[script].AddPosition(proc, g_scriptInstance[script]->current); return(true); } } LogMsg("ERROR: Cannot goto %s in %s.", proc, g_scriptInstance[script]->name); return(false); } void decipher(char *crap, int script) { if (compare(crap, (char*)"¤t_sprite")) { sprintf(crap, "%d",g_scriptInstance[script]->sprite); //Msg("cur sprite returning %s, ",crap); return; } if (compare(crap, (char*)"¤t_script")) { sprintf(crap, "%d",script); return; } //v1.08 special variables. if (compare(crap, (char*)"&return")) { sprintf(crap, "%d", g_dglos.g_returnint); return; } if (compare(crap, (char*)"&arg1")) { sprintf(crap, "%d", g_scriptInstance[script]->arg1); return; } if (compare(crap, (char*)"&arg2")) { sprintf(crap, "%d", g_scriptInstance[script]->arg2); return; } if (compare(crap, (char*)"&arg3")) { sprintf(crap, "%d", g_scriptInstance[script]->arg3); return; } if (compare(crap, (char*)"&arg4")) { sprintf(crap, "%d", g_scriptInstance[script]->arg4); return; } if (compare(crap, (char*)"&arg5")) { sprintf(crap, "%d", g_scriptInstance[script]->arg5); return; } if (compare(crap, (char*)"&arg6")) { sprintf(crap, "%d", g_scriptInstance[script]->arg6); return; } if (compare(crap, (char*)"&arg7")) { sprintf(crap, "%d", g_scriptInstance[script]->arg7); return; } if (compare(crap, (char*)"&arg8")) { sprintf(crap, "%d", g_scriptInstance[script]->arg8); return; } if (compare(crap, (char*)"&arg9")) { sprintf(crap, "%d", g_scriptInstance[script]->arg9); return; } for (int i = 1; i < max_vars; i ++) { if (g_dglos.g_playerInfo.var[i].active == true) if ( i == get_var(script, g_dglos.g_playerInfo.var[i].name)) //redink1 changed for recursive scoping if (compare(g_dglos.g_playerInfo.var[i].name, crap)) { sprintf(crap, "%d",g_dglos.g_playerInfo.var[i].var); // check_for_real_vars(crap, i); return; } } } //redink1 added, grabs the var index matching 'name' with the shortest scope. Basically iterates for each scope seperate until it finds a match. int get_var(int script, char* name) { //Can optimize here, by searching through variable array for start and end limits //Loop forever... while (1) { //We'll start going through every var, starting at one int var = 1; while (var < max_vars) { //Okay... make sure the var is active, //The scope should match the script, //Then make sure the name is the same. if (g_dglos.g_playerInfo.var[var].active && g_dglos.g_playerInfo.var[var].scope == script && compare(g_dglos.g_playerInfo.var[var].name, name)) return var; //Otherwise, go to the next var. var++; } //If we just went through the global list, let's return if (script <= 0) break; //Bugfix... if there is no rinfo[script] entry (like if kill this task was used), we go directly to the globals. //Thanks Tal! //if (!rinfo[script]) // script = 0; //Go into the next proc from the script. If there are no parent procs, it should be 0, which is global. //else // script = rinfo[script]->proc_return; //Changed to not reference the parent procedure's variable list at all... just go on to globals. script = 0; } return 0; } //redink1 changes for replacing var in string bool recurse_var_replace(int i, int script, char* line, char* prevar) { while (i < max_vars) { //First, make sure the variable is active. //Then, make sure it is in scope, //Then, see if the variable name is in the line //Then, prevar is null, or if prevar isn't null, see if current variable starts with prevar if (g_dglos.g_playerInfo.var[i].active && i == get_var(script, g_dglos.g_playerInfo.var[i].name) && strstr(line, g_dglos.g_playerInfo.var[i].name) && (prevar == NULL || prevar != NULL && strstr(g_dglos.g_playerInfo.var[i].name, prevar))) { //Look for shorter variables if (!recurse_var_replace(i + 1, script, line, g_dglos.g_playerInfo.var[i].name)) { //we didn't find any, so we replace! char crap[20]; sprintf(crap, "%d", g_dglos.g_playerInfo.var[i].var); replace(g_dglos.g_playerInfo.var[i].name, crap, line); //return true; } } i++; } return false; } void decipher_string(char line[200], int script) { char crap[255]; char buffer[255]; char crab[255]; int mytime; //redink1 replaced with recursive function for finding longest variable recurse_var_replace(1, script, line, NULL); /*for (int i = 1; i < max_vars; i ++) { if (play.var[i].active == true) if ( (play.var[i].scope == 0) || recurse_scope(play.var[i].scope, script) ) { sprintf(crap, "%d", play.var[i].var); replace(play.var[i].name, crap, line); // check_for_real_vars(crap, i); //break; } }*/ if ((strchr(line, '&') != NULL) && (script != 0)) { replace((char*)"¤t_sprite",rt_ltoa(g_scriptInstance[script]->sprite, buffer, 10), line); replace((char*)"¤t_script",rt_ltoa(script, buffer, 10), line); //v1.08 special variables. replace((char*)"&return",rt_ltoa(g_dglos.g_returnint, buffer, 10), line); replace((char*)"&arg1",rt_ltoa(g_scriptInstance[script]->arg1, buffer, 10), line); replace((char*)"&arg2",rt_ltoa(g_scriptInstance[script]->arg2, buffer, 10), line); replace((char*)"&arg3",rt_ltoa(g_scriptInstance[script]->arg3, buffer, 10), line); replace((char*)"&arg4",rt_ltoa(g_scriptInstance[script]->arg4, buffer, 10), line); replace((char*)"&arg5",rt_ltoa(g_scriptInstance[script]->arg5, buffer, 10), line); replace((char*)"&arg6",rt_ltoa(g_scriptInstance[script]->arg6, buffer, 10), line); replace((char*)"&arg7",rt_ltoa(g_scriptInstance[script]->arg7, buffer, 10), line); replace((char*)"&arg8",rt_ltoa(g_scriptInstance[script]->arg8, buffer, 10), line); replace((char*)"&arg9",rt_ltoa(g_scriptInstance[script]->arg9, buffer, 10), line); if (decipher_savegame != 0) { if (g_dglos.g_playerInfo.button[decipher_savegame] == 1) replace((char*)"&buttoninfo", "Attack", line); else if (g_dglos.g_playerInfo.button[decipher_savegame] == 2) replace((char*)"&buttoninfo", "Talk/Examine", line); if (g_dglos.g_playerInfo.button[decipher_savegame] == 3) replace((char*)"&buttoninfo", "Magic", line); if (g_dglos.g_playerInfo.button[decipher_savegame] == 4) replace((char*)"&buttoninfo", "Item Screen", line); if (g_dglos.g_playerInfo.button[decipher_savegame] == 5) replace((char*)"&buttoninfo", "Main Menu", line); if (g_dglos.g_playerInfo.button[decipher_savegame] == 6) replace((char*)"&buttoninfo", "Map", line); if (g_dglos.g_playerInfo.button[decipher_savegame] == 7) replace((char*)"&buttoninfo", "Unused", line); if (g_dglos.g_playerInfo.button[decipher_savegame] == 8) replace((char*)"&buttoninfo", "Unused", line); if (g_dglos.g_playerInfo.button[decipher_savegame] == 9) replace((char*)"&buttoninfo", "Unused", line); if (g_dglos.g_playerInfo.button[decipher_savegame] == 10) replace((char*)"&buttoninfo", "Unused", line); } } if (decipher_savegame != 0) if (compare(line, (char*)"&savegameinfo")) { if (decipher_savegame == 10) { string autoSave = DinkGetSavePath() + "autosave.dat"; if (!FileExists(autoSave)) { sprintf(line, "Auto Save - None yet"); } else { mytime = 0; string description = "Unknown"; VariantDB db; bool bFileExisted = false; if (db.Load(DinkGetSavePath()+"autosavedb.dat", &bFileExisted, false) && bFileExisted ) { mytime = db.GetVar("minutes")->GetUINT32(); description = db.GetVar("description")->GetString(); } sprintf(line, "Auto Save - %d:%02d - %s", (mytime / 60), mytime - ((mytime / 60) * 60), description.c_str()); } } else { sprintf(crap, "%ssave%d.dat",g_dglo.m_savePath.c_str(), decipher_savegame); if (FileExists(crap)) { load_game_small(decipher_savegame, crab, &mytime); //redink1 fix for savegame time bug sprintf(line, "Slot %d - %d:%02d - %s", decipher_savegame, (mytime / 60), mytime - ((mytime / 60) * 60) , crab); //sprintf(line, "In Use"); } else { sprintf(line, "Slot %d - Empty",decipher_savegame); } } } } bool get_parms(char proc_name[20], int32 script, char *h, int32 p[10]) { memset(g_nlist, 0, 10 * sizeof(int)); char crap[256]; strip_beginning_spaces(h); if (h[0] == '(') { //Msg("Found first (."); h = &h[1]; } else { LogMsg("Missing ( in %s, offset %d.", g_scriptInstance[script]->name, g_scriptInstance[script]->current); return(false); } for (int i = 0; i < 10; i++) { strip_beginning_spaces(h); if (p[i] == 1) { // Msg("Checking for number.."); if (strchr(h, ',') != NULL) separate_string(h, 1,',',crap); else if (strchr(h, ')') != NULL) separate_string(h, 1,')',crap); h = &h[strlen(crap)]; if (crap[0] == '&') { replace(" ", "", crap); // Msg("Found %s, 1st is %c",crap, crap[0]); decipher(crap, script); } g_nlist[i] = atol( crap); } else if (p[i] == 2) { // Msg("Checking for string.."); separate_string(h, 2,'"',crap); h = &h[strlen(crap)+2]; //Msg("Found %s",crap); strcpy(slist[i], crap); } if ( p[i+1] == 0) { //finish strip_beginning_spaces(h); if (h[0] == ')') { h = &h[1]; } else { LogMsg("Missing ) in %s, offset %d.", g_scriptInstance[script]->name, g_scriptInstance[script]->current); h = &h[1]; return(false); } strip_beginning_spaces(h); if (h[0] == ';') { // Msg("Found ending ;"); h = &h[1]; } else { //Msg("Missing ; in %s, offset %d.", rinfo[script]->name, rinfo[script]->current); // h = &h[1]; return(true); } return(true); } //got a parm, but there is more to get, lets make sure there is a comma there strip_beginning_spaces(h); if (h[0] == ',') { // Msg("Found expected ,"); h = &h[1]; } else { LogMsg("Procedure %s does not take %d parms in %s, offset %d. (%s?)", proc_name, i+1, g_scriptInstance[script]->name, g_scriptInstance[script]->current, h); return(false); } } return(true); } int GetCallbacksActive() { int count = 0; for (int k = 1; k < C_MAX_SCRIPT_CALLBACKS; k++) { if (g_dglos.g_scriptCallback[k].active) { count++; } } return count; } int GetScriptsActive() { int count = 0; for (int k = 1; k < C_MAX_SCRIPTS; k++) { if (g_scriptInstance[k]) { count++; } } return count; } int add_callback(char name[20], int n1, int n2, int script) { #ifdef _DEBUG //LogMsg("%d callbacks active", GetCallbacksActive()); #endif for (int k = 1; k < C_MAX_SCRIPT_CALLBACKS; k++) { if (g_dglos.g_scriptCallback[k].active == false) { memset(&g_dglos.g_scriptCallback[k],0, sizeof(g_dglos.g_scriptCallback[k])); g_dglos.g_scriptCallback[k].active = true; g_dglos.g_scriptCallback[k].min = n1; g_dglos.g_scriptCallback[k].max = n2; g_dglos.g_scriptCallback[k].owner = script; strcpy(g_dglos.g_scriptCallback[k].name, name); if (debug_mode) LogMsg("Callback added to %d.", k); return(k); } } #ifdef _DEBUG LogMsg("Couldn't add callback, all out of space"); #endif return(0); } int add_sprite(int x1, int y, int brain,int pseq, int pframe ) { for (int x=1; x < C_MAX_SPRITES_AT_ONCE; x++) { if (g_sprite[x].active == false) { SAFE_DELETE(g_customSpriteMap[x]); memset(&g_sprite[x], 0, sizeof(g_sprite[x])); g_sprite[x].active = true; g_sprite[x].x = x1; g_sprite[x].y = y; g_sprite[x].my = 0; g_sprite[x].mx = 0; g_sprite[x].speed = 1; g_sprite[x].brain = brain; g_sprite[x].frame = 0; g_sprite[x].pseq = pseq; g_sprite[x].pframe = pframe; g_sprite[x].seq = 0; if (x > g_dglos.last_sprite_created) g_dglos.last_sprite_created = x; g_sprite[x].timer = 33; g_sprite[x].wait = 0; g_sprite[x].lpx[0] = 0; g_sprite[x].lpy[0] = 0; g_sprite[x].moveman = 0; g_sprite[x].size = 100; g_sprite[x].que = 0; g_sprite[x].strength = 0; g_sprite[x].damage = 0; g_sprite[x].defense = 0; g_sprite[x].hard = 1; if ( g_customSpriteMap[x] == NULL ) { g_customSpriteMap[x] = new std::map; } else { g_customSpriteMap[x]->clear(); } return(x); } } return(0); } LPDIRECTDRAWSURFACE GetSurfaceFromSeq(int seq, int frame = 1) { return g_pSpriteSurface[g_dglos.g_seq[seq].frame[frame]]; } bool check_sprite_status(int spriteID) { check_seq_status(g_sprite[spriteID].pseq, g_sprite[spriteID].pframe); check_seq_status(g_sprite[spriteID].seq, g_sprite[spriteID].frame); return true; } void check_frame_status(int h, int frame) { if (g_dglos.g_seq[h].active == false) return; if (h > 0) { // Msg("Smartload: Loading seq %d..", spr[h].seq); if (GetSurfaceFromSeq(h, frame) == 0) { ReloadSequence(h, frame); } } } void FreeSequence(int seq) { assert(seq && seq < C_MAX_SEQUENCES); if (1) { for (int i=0; i < g_dglos.g_seq[seq].m_spaceAllowed; i++) { //note, instead of doing frame[1+1] we do frame[1]+1, to really delete whatever //was loaded, otherwise things get corrupted because of how the SET_FRAME_FRAME //command allows some frames to be reused. assert(g_dglos.g_seq[seq].s+1 == g_dglos.g_seq[seq].frame[1]); //LogMsg("Deleting seq %d, frame %d (%d) (image: %d)", seq, i, g_dglos.g_seq[seq].frame[1]+i, g_dglos.g_picInfo[g_dglos.g_seq[seq].frame[1]+i] ); SAFE_DELETE(g_pSpriteSurface[g_dglos.g_seq[seq].frame[1] + i]); } } } bool check_pic_status(int picID) { if (picID == 0) return true; assert(g_dglos.g_picInfo[picID].m_parentSeq != 0); if (g_pSpriteSurface[picID]) return true; return check_seq_status(g_dglos.g_picInfo[picID].m_parentSeq); } bool check_seq_status(int seq, int frame) { if (seq == 0) return true; if (g_dglos.g_seq[seq].active == false) { #ifdef _DEBUG LogMsg("Seq %d missing?", seq); #endif return true; } #ifdef _DEBUG if (seq == 180) { //LogMsg("Woah!"); } #endif if (frame != 0) { if (g_pSpriteSurface[g_dglos.g_seq[seq].frame[frame]]) return true; //load a single frame return ReloadSequence(seq, frame); } if (seq > 0) if (seq < C_MAX_SEQUENCES) { // Msg("Smartload: Loading seq %d..", spr[h].seq); for (int i=0; i < g_dglos.g_seq[seq].last; i++) { if (g_pSpriteSurface[g_dglos.g_seq[seq].frame[i + 1]] == NULL) { if (!ReloadSequence(seq, i+1)) return false; } } } return true; //no error } void check_base(int base) { /* for (int i=1; i < 10; i++) { if (g_dglos.g_seq[base+i].active == true) check_seq_status(base+i); } */ } void check_sprite_status_full(int spriteID) { //same as above but checks for all seq's used by the (base) commands //is sprite in memory? //check_seq_status(g_sprite[spriteID].pseq); check_sprite_status(spriteID); //if (g_sprite[spriteID].base_walk > -1) check_base(g_sprite[spriteID].base_walk); } int say_text(char text[200], int h, int script) { int crap2; //Msg("Creating new sprite with %s connect to %d.",text, h); if (h == 1000) crap2 = add_sprite(100,100,8,0,0); else crap2 = add_sprite(g_sprite[h].x,g_sprite[h].y,8,0,0); if (crap2 == 0) { LogMsg("Couldn't say something, out of sprites."); return(0); } *plast_text = crap2; strcpy(g_sprite[crap2].text, text); g_sprite[crap2].kill = strlen(text) * text_timer; if (g_sprite[crap2].kill < text_min) g_sprite[crap2].kill = text_min; g_sprite[crap2].damage = -1; g_sprite[crap2].owner = h; g_sprite[crap2].hard = 1; g_sprite[crap2].script = script; //set X offset for text, using strength var since it's unused g_sprite[crap2].strength = 75; //spr[h].x - spr[crap2; g_sprite[crap2].nohit = 1; check_seq_status(g_sprite[g_sprite[crap2].owner].seq, g_sprite[g_sprite[crap2].owner].frame); g_sprite[crap2].defense = ( ((g_dglos.g_picInfo[getpic(g_sprite[crap2].owner)].box.bottom) - g_dglos.g_picInfo[getpic(g_sprite[crap2].owner)].yoffset) + 100); g_sprite[crap2].x = g_sprite[g_sprite[crap2].owner].x - g_sprite[crap2].strength; g_sprite[crap2].y = g_sprite[g_sprite[crap2].owner].y - g_sprite[crap2].defense; return(crap2); } int say_text_xy(char text[200], int mx, int my, int script) { int crap2; //Msg("Creating new sprite with %s connect to %d.",text, h); crap2 = add_sprite(mx,my,8,0,0); if (crap2 == 0) { LogMsg("Couldn't say something, out of sprites."); return(0); } *plast_text = crap2; strcpy(g_sprite[crap2].text, text); g_sprite[crap2].kill = strlen(text) * text_timer; if (g_sprite[crap2].kill < text_min) g_sprite[crap2].kill = text_min; g_sprite[crap2].damage = -1; g_sprite[crap2].nohit = 1; g_sprite[crap2].owner = 1000; g_sprite[crap2].hard = 1; g_sprite[crap2].script = script; return(crap2); } int does_sprite_have_text(int sprite) { //Msg("getting callback # with %d..", sprite); for (int k = 1; k <= C_MAX_SPRITES_AT_ONCE; k++) { if ( g_sprite[k].active) if (g_sprite[k].owner == sprite) if (g_sprite[k].brain == 8) { //Msg("Found it! returning %d.", k); return(k); } } return(0); } int var_exists(char name[20], int scope) { for (int i = 1; i < max_vars; i++) { if (g_dglos.g_playerInfo.var[i].active) { if (compare(g_dglos.g_playerInfo.var[i].name, name)) { if (g_dglos.g_playerInfo.var[i].scope == scope) //redink1 changed to check recursively... then changed back. Hrm. { //Msg("Found match for %s.", name); return(i); } } } } return(0); } //redink1 added this to make new global functions void make_function(char file[10], char func[20]) { //See if it already exists bool exists = false; int i; for (i = 0; strlen(g_dglos.g_playerInfo.func[i].func) > 0 && i < 100; i++) { if (compare(func, g_dglos.g_playerInfo.func[i].func)) { exists = true; break; } } if (exists) { strncpy(g_dglos.g_playerInfo.func[i].file, file, 10); } else { strncpy(g_dglos.g_playerInfo.func[0].file, file, 10); strncpy(g_dglos.g_playerInfo.func[0].func, func, 20); } } void make_int(char name[80], int value, int scope, int script) { int dupe; if (strlen(name) > 19) { LogMsg("ERROR: Varname %s is too long in script %s.",name, g_scriptInstance[script]->name); return; } dupe = var_exists(name, scope); if (dupe > 0) { if (scope != 0) { #ifdef _DEBUG //LogMsg("Local var %s already used in this procedure in script %s.",name, g_scriptInstance[script]->name); #endif g_dglos.g_playerInfo.var[dupe].var = value; } else { #ifdef _DEBUG LogMsg("Var %s is already a global, not changing value.",name); #endif } return; } //make new var for (int i = 1; i < max_vars; i++) { if (g_dglos.g_playerInfo.var[i].active == false) { g_dglos.g_playerInfo.var[i].active = true; g_dglos.g_playerInfo.var[i].scope = scope; strcpy(g_dglos.g_playerInfo.var[i].name, name); //g("var %s created, used slot %d ", name,i); g_dglos.g_playerInfo.var[i].var = value; return; } } LogMsg("ERROR: Out of var space, all %d used.", max_vars); } int var_equals(char name[20], char newname[20], char math, int script, char rest[200]) { int k; //redink1 set newret to NULL so debug errors did not appear. int newret = NULL; // = NULL; if (name[0] != '&') { LogMsg("ERROR (var equals): Unknown var %s in %s offset %d.",name, g_scriptInstance[script]->name, g_scriptInstance[script]->current); return(0); } int i = get_var(script, name); if (i > 0) { goto next; } LogMsg("ERROR: (var equals2) Unknown var %s in %s offset %d.",name, g_scriptInstance[script]->name, g_scriptInstance[script]->current); return(0); next: int newval = 0; if (strchr(rest, '(') != NULL) { newret = process_line(script, rest, false); newval = g_dglos.g_returnint; goto next2; } if (strchr(newname, ';') != NULL) replace(";", "", newname); //redink1 fixed for scope and such k = get_var(script, newname); if (k > 0) { newval = g_dglos.g_playerInfo.var[k].var; goto next2; } if (compare(newname, (char*)"¤t_sprite")) { newval = g_scriptInstance[script]->sprite; goto next2; } if (compare(newname, (char*)"¤t_script")) { newval = script; goto next2; } //v1.08 special variables. if (compare(newname, (char*)"&return")) { newval = g_dglos.g_returnint; goto next2; } if (compare(newname, (char*)"&arg1")) { newval = g_scriptInstance[script]->arg1; goto next2; } if (compare(newname, (char*)"&arg2")) { newval = g_scriptInstance[script]->arg2; goto next2; } if (compare(newname, (char*)"&arg3")) { newval = g_scriptInstance[script]->arg3; goto next2; } if (compare(newname, (char*)"&arg4")) { newval = g_scriptInstance[script]->arg4; goto next2; } if (compare(newname, (char*)"&arg5")) { newval = g_scriptInstance[script]->arg5; goto next2; } if (compare(newname, (char*)"&arg6")) { newval = g_scriptInstance[script]->arg6; goto next2; } if (compare(newname, (char*)"&arg7")) { newval = g_scriptInstance[script]->arg7; goto next2; } if (compare(newname, (char*)"&arg8")) { newval = g_scriptInstance[script]->arg8; goto next2; } if (compare(newname, (char*)"&arg9")) { newval = g_scriptInstance[script]->arg9; goto next2; } newval = atol(newname); next2: if (math == '=') g_dglos.g_playerInfo.var[i].var = newval; if (math == '+') g_dglos.g_playerInfo.var[i].var += newval; if (math == '-') g_dglos.g_playerInfo.var[i].var -= newval; if (math == '/') g_dglos.g_playerInfo.var[i].var = g_dglos.g_playerInfo.var[i].var / newval; if (math == '*') g_dglos.g_playerInfo.var[i].var = g_dglos.g_playerInfo.var[i].var * newval; return(newret); } void get_word(char line[300], int word, char *crap) { int cur = 0; bool space_mode = false; char save_word[100]; save_word[0] = 0; for (int k = 0; k < strlen(line); k++) { if (space_mode == true) { if (line[k] != ' ') { space_mode = false; strcpy(save_word, ""); } } if (space_mode == false) { if (line[k] == ' ') { cur++; if (word == cur) goto done; space_mode = true; strcpy(save_word, ""); goto dooba; } else { strchar(save_word, line[k]); } } dooba:; } if (space_mode == false) { if (cur+1 != word) strcpy(save_word, ""); } done: strcpy(crap, save_word); //Msg("word %d of %s is %s.", word, line, crap); } int var_figure(char h[200], int script) { char crap[200]; int ret = 0; int n1 = 0, n2 = 0; //Msg("Figuring out %s...", h); get_word(h, 2, crap); //Msg("Word two is %s...", crap); if (compare(crap, (char*)"")) { //one word equation if (h[0] == '&') { //its a var possibly decipher_string(h, script); } //Msg("truth is %s", h); ret = atol(h); // Msg("returning %d, happy?", ret); return(ret); } get_word(h, 1, crap); //Msg("Comparing %s...", crap); decipher_string(crap,script); n1 = atol(crap); get_word(h, 3, crap); replace(")", "", crap); //Msg("to %s...", crap); decipher_string(crap,script); n2 = atol(crap); get_word(h, 2, crap); if (debug_mode) LogMsg("Compared %d to %d",n1, n2); if (compare(crap, (char*)"==")) { if (n1 == n2) ret = 1; else ret = 0; return(ret); } if (compare(crap, (char*)">")) { if (n1 > n2) ret = 1; else ret = 0; return(ret); } if (compare(crap, (char*)"<")) { if (n1 < n2) ret = 1; else ret = 0; return(ret); } if (compare(crap,(char*) "!=")) { if (n1 != n2) ret = 1; else ret = 0; return(ret); } if (compare(crap, (char*)"<=")) { if (n1 <= n2) ret = 1; else ret = 0; return(ret); } if (compare(crap, (char*)">=")) { if (n1 >= n2) ret = 1; else ret = 0; return(ret); } return(ret); } void kill_text_owned_by(int sprite) { for (int i = 1; i < C_MAX_SPRITES_AT_ONCE; i++) { if (g_sprite[i].active) if (g_sprite[i].brain == 8) if (g_sprite[i].owner == sprite) { g_sprite[i].active = false; } } } bool text_owned_by(int sprite) { for (int i = 1; i < C_MAX_SPRITES_AT_ONCE; i++) { if (g_sprite[i].active) if (g_sprite[i].brain == 8) if (g_sprite[i].owner == sprite) { return(true); } } return(false); } void kill_text_owned_by_safe(int sprite) { for (int i = 1; i < C_MAX_SPRITES_AT_ONCE; i++) { if (g_sprite[i].active) if (g_sprite[i].brain == 8) if (g_sprite[i].owner == sprite) { g_sprite[i].active = false; if (g_sprite[i].callback != 0) run_script(g_sprite[i].callback); } } } void kill_scripts_owned_by(int sprite) { for (int i = 1; i < C_MAX_SCRIPTS; i++) { if (g_scriptInstance[i] != NULL) { if (g_scriptInstance[i]->sprite == sprite) { kill_script(i); } } } } void kill_sprite_all (int sprite) { g_sprite[sprite].active = false; kill_text_owned_by(sprite); kill_scripts_owned_by(sprite); } void kill_returning_stuff( int script) { int i; for (i = 1; i < C_MAX_SCRIPT_CALLBACKS; i++) { if (g_dglos.g_scriptCallback[i].active) if (g_dglos.g_scriptCallback[i].owner == script) { //LogMsg("killed a returning callback, ha!"); g_dglos.g_scriptCallback[i].active = false; } } for (i = 1; i <= g_dglos.last_sprite_created; i++) { if (g_sprite[i].active) if (g_sprite[i].brain == 8) if (g_sprite[i].callback == script) { LogMsg("Killed sprites callback command"); g_sprite[i].callback = 0; } } } bool talk_get(int script) { char line[200], check[200], checker[200]; int cur = 1; char *p; int retnum = 0; clear_talk(); g_dglos.g_talkInfo.newy = -5000; while(1) { redo: read_next_line(script, line); strip_beginning_spaces(line); //Msg("Comparing to %s.", line); get_word(line, 1, checker); if (compare(checker, (char*)"set_y")) { get_word(line, 2, checker); g_dglos.g_talkInfo.newy = atol(checker); goto redo; } if (compare(checker, (char*)"set_title_color")) { get_word(line, 2, checker); g_dglos.g_talkInfo.color = atol(checker); goto redo; } if (compare(line, (char*)"\n")) goto redo; if (compare(line, (char*)"\\\\")) goto redo; strip_beginning_spaces(line); //Msg("Comparing to %s.", line); if (compare(line, (char*)"\n")) goto redo; if (compare(line, (char*)"\\\\")) goto redo; morestuff: separate_string(line, 1, '(', check); strip_beginning_spaces(check); if (compare(check, (char*)"title_start")) { while(read_next_line(script, line)) { strcpy(check, line); strip_beginning_spaces(line); get_word(line, 1, checker); separate_string(line, 1, '(', check); strip_beginning_spaces(check); if (compare(check, (char*)"title_end")) { replace((char*)"\n\n\n\n",(char*)"\n \n", g_dglos.g_talkInfo.buffer); replace((char*)"\n\n",(char*)"\n", g_dglos.g_talkInfo.buffer); goto redo; } assert("!You better check this.."); line[strlen(line)] = 0; //Msg("LINE IS: %s: Like it?",line); decipher_string(line, script); strcat(g_dglos.g_talkInfo.buffer, line); //talk.buffer[strlen(talk.buffer)-1] = 0; } goto redo; } if (compare(check, (char*)"choice_end")) { if (cur-1 == 0) { LogMsg("Error: choice() has 0 options in script %s, offset %d.", g_scriptInstance[script]->name, g_scriptInstance[script]->current); return(false); } //all done, lets jam //Msg("found choice_end, leaving!"); g_dglos.g_talkInfo.last = cur-1; g_dglos.g_talkInfo.cur = 1; g_dglos.g_talkInfo.active = true; g_dglos.g_talkInfo.page = 1; g_dglos.g_talkInfo.cur_view = 1; g_dglos.g_talkInfo.script = script; //kill the punch button if it was pressed, otherwise if you punch and talk to someone it crashes the game. //this was also in the original dink, amazing nobody saw it? g_dglo.m_dirInputFinished[DINK_INPUT_BUTTON1] = false; g_dglo.m_dirInput[DINK_INPUT_BUTTON1] = false; g_dglo.m_dirInputFinished[DINK_INPUT_BUTTON2] = false; g_dglo.m_dirInput[DINK_INPUT_BUTTON2] = false; sjoy.button[1] = false; sjoy.button[2] = false; return(true); } separate_string(line, 1, '\"', check); strip_beginning_spaces(check); //Msg("Check is %s.",check); if (strlen(check) > 2) { //found conditional statement if (strchr(check, '(') == NULL) { LogMsg("Error with choice() statement in script %s, offset %d. (%s?)", g_scriptInstance[script]->name, g_scriptInstance[script]->current, check); return(false); } separate_string(check, 2, '(', checker); separate_string(checker, 1, ')', check); //Msg("Running %s through var figure..", check); if (var_figure(check, script) == 0) { //LogMsg("Answer is no."); retnum++; goto redo; //said NO to statement } //Msg("Answer is yes."); separate_string(line, 1, ')', check); p = &line[strlen(check)+1]; strcpy(check, p); strcpy(line, check); //Msg("new line is %s, happy?", line); goto morestuff; } separate_string(line, 2, '\"', check); strip_beginning_spaces(check); #ifdef _DEBUG //LogMsg("Line %d is %s.",cur,check); #endif if (strcmp(check, "Quit to Windows") == 0) { strcpy(check, "Quit"); } retnum++; decipher_savegame = retnum; decipher_string(check, script); decipher_savegame = 0; strcpy(g_dglos.g_talkInfo.line[cur], check); g_dglos.g_talkInfo.line_return[cur] = retnum; cur++; } } bool PlayMidi(const char *sFileName) { //first check for mp3 versions.. string fName = "sound/"+ToLowerCaseString(sFileName); StringReplace("\\", "/", fName); if (GetFileExtension(fName) == "mid") { bool bTryUsingOgg = true; if (!g_dglo.m_dmodGameDir.empty() && FileExists(g_dglo.m_dmodGamePathWithDir+fName)) { //actually, don't replace with ogg, they probably have their own midi stuff here bTryUsingOgg = false; } string tempName = ModifyFileExtension(fName, "ogg"); if (bTryUsingOgg && !g_dglo.m_dmodGameDir.empty() && FileExists(g_dglo.m_dmodGamePathWithDir+tempName)) { //found it fName = tempName; } else if (!g_dglo.m_dmodGameDir.empty() && FileExists(g_dglo.m_dmodGamePathWithDir+fName)) { //found it, no changed needed } else { //try the base dir too if (FileExists(g_dglo.m_gamePathWithDir+tempName)) { //found it fName = tempName; } } } g_dglo.m_lastMusicPath = sFileName; GetAudioManager()->Play(GetFileLocationString(fName), true, true, false); LogMsg("Playing music %s", sFileName); return true; } void check_midi(void) { char hold[20]; if (!g_dglos.midi_active) return; if (g_MapInfo.music[*pmap] != 0) { if (g_MapInfo.music[*pmap] == -1) { //kill music LogMsg("Stopped cd"); StopMidi(); } if (g_MapInfo.music[*pmap] > 1000) { sprintf(hold, "%d.mid",g_MapInfo.music[*pmap]-1000); PlayMidi(hold); } else { //there is music associated with this screen sprintf(hold, "%d.mid",g_MapInfo.music[*pmap]); PlayMidi(hold); } } } //------------------------------------------------------------------ // // Function : StopMidi // // Purpose : Stops a midi file playing // //------------------------------------------------------------------ bool StopMidi() { g_dglo.m_lastMusicPath = ""; LogMsg("Stopping midi"); GetAudioManager()->StopMusic(); // Yahoo! return true; } void get_right(char line[200], char thing[100], char *ret) { char *dumb; int pos = strcspn(line, thing ); if (pos == 0){ strcpy(ret, ""); return; } dumb = &ret[pos+1]; strcpy(ret, dumb); } void int_prepare(char line[256], int script) { int def = 0; char hold[256]; strcpy(hold, line); char name[100]; char crap[256]; replace("="," ",line); strcpy(crap, line); separate_string(crap, 1,';',line); get_word(line, 2, name); if (name[0] != '&') { LogMsg("ERROR: Can't create var %s, should be &%s.", name,name); return; } make_int(name, def,script, script); strcpy(line, hold); } int32 change_sprite(int32 h, int32 val, int32 * change) { //Msg("Searching sprite %s with val %d. Cur is %d", h, val, *change); if (h >= C_MAX_SPRITES_AT_ONCE) { LogMsg("Error: Can't use sp_ commands on a sprite after it's connected to sprite 1000, can crash. Ignoring command."); return 0; } if (h < 1) { #ifdef _DEBUG LogMsg("Error with an SP command - Sprite %d is invalid.", h); #endif return(-1); } if (g_sprite[h].active == false) return(-1); if (val != -1) { *change = val; } return(*change); } int32 change_sprite(int32 h, int32 val, bool * change) { //Msg("Searching sprite %s with val %d. Cur is %d", h, val, *change); if (h < 1) { #ifdef _DEBUG LogMsg("Error with an SP command - Sprite %d is invalid.", h); #endif return(-1); } if (h >= C_MAX_SPRITES_AT_ONCE || g_sprite[h].active == false) return(-1); if (val != -1) { *change = val; } return(*change); } int change_edit(int h, int val, unsigned short * change) { //Msg("Searching sprite %s with val %d. Cur is %d", h, val, *change); if (h > 99) return(-1); if (h < 1) return(-1); if (val != -1) { *change = val; } return(*change); } int change_edit_char(int h, int val, unsigned char * change) { //Msg("Searching sprite %s with val %d. Cur is %d", h, val, *change); // Msg("h is %d..",val); if (h > 99) return(-1); if (h < 1) return(-1); if (val != -1) { *change = val; } return(*change); } int32 change_sprite_noreturn(int32 h, int32 val, int32 * change) { //Msg("Searching sprite %s with val %d. Cur is %d", h, val, *change); if (h >= C_MAX_SPRITES_AT_ONCE || g_sprite[h].active == false) return(-1); { *change = val; } return(*change); } void draw_sprite_game(LPDIRECTDRAWSURFACE lpdest,int h) { if (::g_b_kill_app) return; //don't try, we're quitting if (g_sprite[h].brain == 8) return; if (g_sprite[h].nodraw == 1) return; rtRect32 dstRect,srcRect; int ddrval; DDBLTFX ddbltfx; ddbltfx.dwSize = sizeof( ddbltfx); ddbltfx.dwFillColor = 0; if (getpic(h) < 1) return; if (!check_pic_status(getpic(h))) { LogMsg("Hmm, bad sprite at %d.. you need to setup a way for a pic to load itself", getpic(h)); return; } #ifdef _DEBUG if (!g_pSpriteSurface[getpic(h)]) { int pic = getpic(h); assert(!"The hell?"); } #endif #ifdef _DEBUG if (g_sprite[h].pseq == 66 && g_sprite[h].pframe == 1) { //LogMsg("Drawing it"); } #endif if (get_box(h, &dstRect, &srcRect)) { //redink1 error checking for invalid rectangle if (dstRect.left >= dstRect.right || dstRect.top >= dstRect.bottom) { return; assert(!"Bad rect"); } //check_seq_status(h); //redink1 error checking for out-of-bounds clipping /*if (box_crap.left < 0) box_crap.left = 0; if (box_crap.top < box_real.top) box_crap.top = box_crap.top; if (box_crap.right > box_real.right) box_crap.right = box_real.right; if (box_crap.bottom > box_real.bottom) box_crap.bottom = box_real.bottom;*/ // Msg("Box_crap: %d %d %d %d, Box_real: %d %d %d %d",box_crap.left,box_crap.top, // box_crap.right, box_crap.bottom,box_real.left,box_real.top, // box_real.right, box_real.bottom); /* if (g_sprite[h].pseq != 0) { if (!check_seq_status(g_sprite[h].pseq)) return; assert(!"Bad sprite"); } */ /* if (lpdest->m_pSurf && lpdest->m_pSurf->GetSurfaceType() == SoftSurface::SURFACE_RGBA) { if (g_dglos.g_picInfo[getpic(h)].pSurface->m_pSurf->GetSurfaceType() == SoftSurface::SURFACE_RGBA) { LogMsg("Doing rgba to rgba.."); } } */ //check to see if we need a 32 bit buffer for this or not if (lpdest->m_pSurf && lpdest->m_pSurf->GetSurfaceType() == SoftSurface::SURFACE_PALETTE_8BIT) { if (g_pSpriteSurface[getpic(h)]->m_pSurf->GetSurfaceType() == SoftSurface::SURFACE_RGBA) { //yep, convert what we've got to 32 bit. We don't lose what we've done so far. assert(lpdest == lpDDSBackGround); //convert it to a high color surface on the fly, without losing the data on it LPDIRECTDRAWSURFACE pNewSurf = InitOffscreenSurface(C_DINK_SCREENSIZE_X, C_DINK_SCREENSIZE_Y, IDirectDrawSurface::MODE_SHADOW_GL, true, lpdest->m_pSurf); LogMsg("Detected high color bmps that need to drawn to the static landscape, converting backbuffers to 32 bit on the fly."); delete lpDDSBackGround; lpdest = lpDDSBackGround = pNewSurf; if (lpDDSBuffer->m_pSurf->GetSurfaceType() == SoftSurface::SURFACE_PALETTE_8BIT) { //this one too delete lpDDSBuffer; lpDDSBuffer = InitOffscreenSurface(C_DINK_SCREENSIZE_X, C_DINK_SCREENSIZE_Y, IDirectDrawSurface::MODE_SHADOW_GL, true); } } } ddrval = lpdest->Blt(&dstRect, g_pSpriteSurface[getpic(h)], &srcRect , DDBLT_KEYSRC ,&ddbltfx ); /* LogMsg("MainSpriteDraw(): Could not draw sprite %d, pic %d.",h,getpic(h)); LogMsg("Box_crap: %d %d %d %d, Box_real: %d %d %d %d",box_crap.left,box_crap.top, box_crap.right, box_crap.bottom,box_real.left,box_real.top, box_real.right, box_real.bottom); if (g_sprite[h].pseq != 0) check_seq_status(g_sprite[h].pseq); */ } } void changedir( int dir1, int k,int base) { int hspeed; int speed_hold = g_sprite[k].speed; if (k > 1) if (g_sprite[k].brain != 9) if (g_sprite[k].brain != 10) { //if (mbase_timing > 20) mbase_timing = 20; // Msg(",base_timing is %d", base_timing); hspeed = g_sprite[k].speed * (g_dglos.base_timing / 4); if (hspeed > 49) { #ifdef _DEBUG LogMsg("Speed was %d", hspeed); #endif g_sprite[k].speed = 49; } else g_sprite[k].speed = hspeed; } int old_seq = g_sprite[k].seq; g_sprite[k].dir = dir1; if (dir1 == 1) { g_sprite[k].mx = (0 - g_sprite[k].speed ) + (g_sprite[k].speed / 3); g_sprite[k].my = g_sprite[k].speed - (g_sprite[k].speed / 3); if (base != -1) { g_sprite[k].seq = base + 1; if (g_dglos.g_seq[g_sprite[k].seq].active == false) { g_sprite[k].seq = base + 9; } } if (old_seq != g_sprite[k].seq) { g_sprite[k].frame = 0; g_sprite[k].delay = 0; } } if (dir1 == 2) { g_sprite[k].mx = 0; g_sprite[k].my = g_sprite[k].speed; if (base != -1) g_sprite[k].seq = base + 2; if (g_dglos.g_seq[g_sprite[k].seq].active == false) if (g_dglos.g_seq[base+3].active) g_sprite[k].seq = base +3; if (g_dglos.g_seq[g_sprite[k].seq].active == false) if (g_dglos.g_seq[base+1].active) g_sprite[k].seq = base +1; if (old_seq != g_sprite[k].seq) { g_sprite[k].frame = 0; g_sprite[k].delay = 0; } } if (dir1 == 3) { g_sprite[k].mx = g_sprite[k].speed - (g_sprite[k].speed / 3); g_sprite[k].my = g_sprite[k].speed - (g_sprite[k].speed / 3); if (base != -1) { g_sprite[k].seq = base + 3; if (g_dglos.g_seq[g_sprite[k].seq].active == false) g_sprite[k].seq = base + 7; } if (old_seq != g_sprite[k].seq) { g_sprite[k].frame = 0; g_sprite[k].delay = 0; } } if (dir1 == 4) { //Msg("Changing %d to four..",k); g_sprite[k].mx = (0 - g_sprite[k].speed); g_sprite[k].my = 0; if (base != -1) g_sprite[k].seq = base + 4; if (g_dglos.g_seq[g_sprite[k].seq].active == false) if (g_dglos.g_seq[base+7].active) g_sprite[k].seq = base +7; if (g_dglos.g_seq[g_sprite[k].seq].active == false) if (g_dglos.g_seq[base+1].active) g_sprite[k].seq = base +1; } if (dir1 == 6) { g_sprite[k].mx = g_sprite[k].speed; g_sprite[k].my = 0; if (base != -1) g_sprite[k].seq = base + 6; if (g_dglos.g_seq[g_sprite[k].seq].active == false) if (g_dglos.g_seq[base+3].active) g_sprite[k].seq = base +3; if (g_dglos.g_seq[g_sprite[k].seq].active == false) if (g_dglos.g_seq[base+9].active) g_sprite[k].seq = base +9; } if (dir1 == 7) { g_sprite[k].mx = (0 - g_sprite[k].speed) + (g_sprite[k].speed / 3); g_sprite[k].my = (0 - g_sprite[k].speed)+ (g_sprite[k].speed / 3); if (base != -1) { g_sprite[k].seq = base + 7; if (g_dglos.g_seq[g_sprite[k].seq].active == false) { g_sprite[k].seq = base + 3; } } } if (dir1 == 8) { g_sprite[k].mx = 0; g_sprite[k].my = (0 - g_sprite[k].speed); if (base != -1) g_sprite[k].seq = base + 8; if (g_dglos.g_seq[g_sprite[k].seq].active == false) if (g_dglos.g_seq[base+7].active) g_sprite[k].seq = base +7; if (g_dglos.g_seq[g_sprite[k].seq].active == false) if (g_dglos.g_seq[base+9].active) g_sprite[k].seq = base +9; } if (dir1 == 9) { g_sprite[k].mx = g_sprite[k].speed- (g_sprite[k].speed / 3); g_sprite[k].my = (0 - g_sprite[k].speed)+ (g_sprite[k].speed / 3); if (base != -1) { g_sprite[k].seq = base + 9; if (g_dglos.g_seq[g_sprite[k].seq].active == false) { g_sprite[k].seq = base + 1; } } } if (old_seq != g_sprite[k].seq) { g_sprite[k].frame = 0; g_sprite[k].delay = 0; } if (g_dglos.g_seq[g_sprite[k].seq].active == false) { //spr[k].mx = 0; //spr[k].my = 0; g_sprite[k].seq = old_seq; } //Msg("Leaving with %d..", spr[k].dir); //Msg("Changedir: Tried to switch sprite %d to dir %d",k,dir1); g_sprite[k].speed = speed_hold; } void update_play_changes( void ) { for (int j = 1; j < 100; j++) { if (g_dglos.g_smallMap.sprite[j].active) if (g_dglos.g_playerInfo.spmap[*pmap].type[j] != 0) { //lets make some changes, player has extra info if (g_dglos.g_playerInfo.spmap[*pmap].type[j] == 1) { g_dglos.g_smallMap.sprite[j].active = 0; } if (g_dglos.g_playerInfo.spmap[*pmap].type[j] == 2) { g_dglos.g_smallMap.sprite[j].type = 1; g_dglos.g_smallMap.sprite[j].hard = 1; } if (g_dglos.g_playerInfo.spmap[*pmap].type[j] == 3) { // Msg("Changing sprite %d", j); g_dglos.g_smallMap.sprite[j].type = 0; g_dglos.g_smallMap.sprite[j].hard = 1; } if (g_dglos.g_playerInfo.spmap[*pmap].type[j] == 4) { g_dglos.g_smallMap.sprite[j].type = 1; g_dglos.g_smallMap.sprite[j].hard = 0; } if (g_dglos.g_playerInfo.spmap[*pmap].type[j] == 5) { g_dglos.g_smallMap.sprite[j].type = 0; g_dglos.g_smallMap.sprite[j].hard = 0; } if (g_dglos.g_playerInfo.spmap[*pmap].type[j] == 6) { g_dglos.g_smallMap.sprite[j].active = 0; } if (g_dglos.g_playerInfo.spmap[*pmap].type[j] == 7) { g_dglos.g_smallMap.sprite[j].active = 0; } if (g_dglos.g_playerInfo.spmap[*pmap].type[j] == 8) { g_dglos.g_smallMap.sprite[j].active = 0; } g_dglos.g_smallMap.sprite[j].seq = g_dglos.g_playerInfo.spmap[*pmap].seq[j]; g_dglos.g_smallMap.sprite[j].frame = g_dglos.g_playerInfo.spmap[*pmap].frame[j]; strcpy(g_dglos.g_smallMap.sprite[j].script, ""); } } } void update_status_all(void) { bool drawexp = false; int next = next_raise(); int script; if (next != g_dglos.g_guiRaise) { g_dglos.g_guiRaise += next / 40; if (g_dglos.g_guiRaise > next) g_dglos.g_guiRaise = next; //make noise here drawexp = true; SoundPlayEffect( 13,15050, 0,0 ,0); } if (*pexper != g_dglos.g_guiExp) { if ( ( g_dglos.g_talkInfo.active == false && g_itemScreenActive == false && g_sprite[1].freeze == 0 ) || g_dglos.g_guiExp + 10 < g_dglos.g_guiRaise ) { //update screen experience g_dglos.g_guiExp += 10; //make noise here if (g_dglos.g_guiExp > *pexper) g_dglos.g_guiExp = *pexper; drawexp = true; SoundPlayEffect( 13,29050, 0,0 ,0); if (g_dglos.g_guiExp >= g_dglos.g_guiRaise) { *pexper -= next; g_dglos.g_guiExp = 0; script = load_script("lraise", 1, false); if (locate(script, "raise")) run_script(script); } } } if (drawexp) { draw_exp(false); } if ( (g_dglos.g_guiLifeMax != *plifemax) || (g_dglos.g_guiLife != *plife) ) { if (g_dglos.g_guiLifeMax < *plifemax) g_dglos.g_guiLifeMax++; if (g_dglos.g_guiLifeMax > *plifemax) g_dglos.g_guiLifeMax--; if (g_dglos.g_guiLife > *plife) g_dglos.g_guiLife--; if (g_dglos.g_guiLife < *plife) g_dglos.g_guiLife++; if (g_dglos.g_guiLife > *plife) g_dglos.g_guiLife--; if (g_dglos.g_guiLife < *plife) g_dglos.g_guiLife++; //draw_bar(flifemax, 190); //draw_bar(flife, 451); } if ( g_dglos.g_guiStrength != *pstrength) { if (g_dglos.g_guiStrength < *pstrength) g_dglos.g_guiStrength++; if (g_dglos.g_guiStrength > *pstrength) g_dglos.g_guiStrength--; SoundPlayEffect( 22,22050, 0,0 ,0); draw_strength(false); } if ( g_dglos.g_guiDefense != *pdefense) { if (g_dglos.g_guiDefense < *pdefense) g_dglos.g_guiDefense++; if (g_dglos.g_guiDefense > *pdefense) g_dglos.g_guiDefense--; SoundPlayEffect( 22,22050, 0,0 ,0); draw_defense(false); } if ( g_dglos.g_guiMagic != *pmagic) { if (g_dglos.g_guiMagic < *pmagic) g_dglos.g_guiMagic++; if (g_dglos.g_guiMagic > *pmagic) g_dglos.g_guiMagic--; SoundPlayEffect( 22,22050, 0,0 ,0); draw_magic(false); } if (g_dglos.g_guiGold != *pgold) { if (g_dglos.g_guiGold < *pgold) { g_dglos.g_guiGold += 20; if (g_dglos.g_guiGold > *pgold) g_dglos.g_guiGold = *pgold; } if (g_dglos.g_guiGold > *pgold) { g_dglos.g_guiGold -= 20; if (g_dglos.g_guiGold < *pgold) g_dglos.g_guiGold = *pgold; } SoundPlayEffect( 14,22050, 0,0 ,0); draw_gold(false); } if (*pmagic_level < *pmagic_cost) { if (g_itemScreenActive == false) *pmagic_level += *pmagic; if (*pmagic_level > *pmagic_cost) *pmagic_level = *pmagic_cost; } if (*pmagic_cost > 0) if (*pmagic_level > 0) { double mnumd = *pmagic_level; mnumd *= 100; mnumd /= *pmagic_cost; int mnum = static_cast(mnumd); //int mnum = *pmagic_level / (*pmagic_cost / 100); if (mnum != g_dglos.g_guiLastMagicDraw) { draw_mlevel(mnum, false); //draw_status_all(); g_dglos.g_guiLastMagicDraw = mnum; } } g_sprite[1].strength = g_dglos.g_guiStrength; g_sprite[1].defense = g_dglos.g_guiDefense; if (g_dglos.g_guiLife < 1) { script = load_script("dinfo", 1000, false); if (locate(script, "die")) run_script(script); } } void place_sprites_game(bool bBackgroundOnly ) { int sprite; bool bs[C_MAX_SPRITES_AT_ONCE]; int rank[C_MAX_SPRITES_AT_ONCE]; int highest_sprite; update_play_changes(); memset(&bs,0,sizeof(bs)); memset(&rank,0,sizeof(rank)); int hs; for (int r1 = 1; r1 < 100; r1++) { highest_sprite = 20000; //more than it could ever be rank[r1] = 0; for (int h1 = 1; h1 < 100; h1++) { if (bs[h1] == false) { if (g_dglos.g_smallMap.sprite[h1].active && (!bBackgroundOnly || g_dglos.g_smallMap.sprite[h1].type == 0) ) { if (g_dglos.g_smallMap.sprite[h1].que != 0) hs = g_dglos.g_smallMap.sprite[h1].que; else hs = g_dglos.g_smallMap.sprite[h1].y; if ( hs < highest_sprite ) { highest_sprite =hs; rank[r1] = h1; } } } } if (rank[r1] != 0) bs[rank[r1]] = true; } int j; bool bScaledBackgroundSpritesRequired = false; //if true, we do a different, more memory intensive method for the rest of the sprites for (int oo =1; rank[oo] > 0; oo++) { //Msg("Ok, rank[%d] is %d.",oo,rank[oo]); j = rank[oo]; #ifdef _DEBUG if (g_dglos.g_smallMap.sprite[j].seq == 66 && g_dglos.g_smallMap.sprite[j].frame == 1) { //LogMsg("Drawing it"); } #endif if (g_dglos.g_smallMap.sprite[j].active == true) if ( ( g_dglos.g_smallMap.sprite[j].vision == 0) || (g_dglos.g_smallMap.sprite[j].vision == *pvision)) { check_seq_status(g_dglos.g_smallMap.sprite[j].seq, g_dglos.g_smallMap.sprite[j].frame); //we have instructions to make a sprite if ( (g_dglos.g_smallMap.sprite[j].type == 0) || (g_dglos.g_smallMap.sprite[j].type == 2) ) { //make it part of the background (much faster) sprite = add_sprite_dumb(g_dglos.g_smallMap.sprite[j].x,g_dglos.g_smallMap.sprite[j].y,0, g_dglos.g_smallMap.sprite[j].seq,g_dglos.g_smallMap.sprite[j].frame, g_dglos.g_smallMap.sprite[j].size); //Msg("Background sprite %d has hard of %d..", j, pam.sprite[j].hard); g_sprite[sprite].hard = g_dglos.g_smallMap.sprite[j].hard; g_sprite[sprite].sp_index = j; g_sprite[sprite].alt = g_dglos.g_smallMap.sprite[j].alt; check_sprite_status_full(sprite); if (g_dglos.g_smallMap.sprite[j].type == 0) { if (g_dglos.g_smallMap.sprite[j].size != 0 && g_dglos.g_smallMap.sprite[j].size != 100) { //it requires scaling, need to do things differently as our low mem fast custom blits won't work with this bScaledBackgroundSpritesRequired = true; } if (bScaledBackgroundSpritesRequired) { g_dglo.m_bgSpriteMan.Add(sprite); } else { draw_sprite_game(lpDDSBackGround,sprite); } } if (g_sprite[sprite].hard == 0) { add_hardness(sprite,100+j); } g_sprite[sprite].active = false; } if (g_dglos.g_smallMap.sprite[j].type == 1) { //make it a living sprite sprite = add_sprite_dumb(g_dglos.g_smallMap.sprite[j].x,g_dglos.g_smallMap.sprite[j].y,0, g_dglos.g_smallMap.sprite[j].seq,g_dglos.g_smallMap.sprite[j].frame, g_dglos.g_smallMap.sprite[j].size); g_sprite[sprite].hard = g_dglos.g_smallMap.sprite[j].hard; //assign addition parms to the new sprite g_sprite[sprite].sp_index = j; g_sprite[sprite].brain = g_dglos.g_smallMap.sprite[j].brain; g_sprite[sprite].speed = g_dglos.g_smallMap.sprite[j].speed; g_sprite[sprite].base_walk = g_dglos.g_smallMap.sprite[j].base_walk; g_sprite[sprite].base_idle = g_dglos.g_smallMap.sprite[j].base_idle; g_sprite[sprite].base_attack = g_dglos.g_smallMap.sprite[j].base_attack; g_sprite[sprite].base_hit = g_dglos.g_smallMap.sprite[j].base_hit; g_sprite[sprite].hard = g_dglos.g_smallMap.sprite[j].hard; g_sprite[sprite].timer = g_dglos.g_smallMap.sprite[j].timer; g_sprite[sprite].que = g_dglos.g_smallMap.sprite[j].que; g_sprite[sprite].sp_index = j; g_sprite[sprite].alt = g_dglos.g_smallMap.sprite[j].alt; g_sprite[sprite].base_die = g_dglos.g_smallMap.sprite[j].base_die; g_sprite[sprite].strength = g_dglos.g_smallMap.sprite[j].strength; g_sprite[sprite].defense = g_dglos.g_smallMap.sprite[j].defense; g_sprite[sprite].gold = g_dglos.g_smallMap.sprite[j].gold; g_sprite[sprite].exp = g_dglos.g_smallMap.sprite[j].exp; g_sprite[sprite].nohit = g_dglos.g_smallMap.sprite[j].nohit; g_sprite[sprite].touch_damage = g_dglos.g_smallMap.sprite[j].touch_damage; g_sprite[sprite].hitpoints = g_dglos.g_smallMap.sprite[j].hitpoints; g_sprite[sprite].sound = g_dglos.g_smallMap.sprite[j].sound; check_sprite_status_full(sprite); if (g_dglos.g_smallMap.sprite[j].prop == 0) if (g_sprite[sprite].sound != 0) { //make looping sound #ifdef _DEBUG LogMsg("making sound with sprite %d..", sprite); #endif SoundPlayEffect( g_sprite[sprite].sound,22050, 0,sprite, 1); } if (g_sprite[sprite].hard == 0) { add_hardness(sprite,100+j); } //does it need a script loaded? if (strlen(g_dglos.g_smallMap.sprite[j].script) > 1) { g_sprite[sprite].script = load_script(g_dglos.g_smallMap.sprite[j].script, sprite, true); } } //Msg("I just made sprite %d because rank[%d] told me to..",sprite,j); } } #ifdef _DEBUG LogMsg("Using %d background sprites in realdraw mode.", g_dglo.m_bgSpriteMan.GetCount()); #endif } bool kill_last_sprite(void) { int found; found = 0; bool nosetlast = false; for (int k=1; k < C_MAX_SPRITES_AT_ONCE; k++ ) if (g_sprite[k].active) { if (g_sprite[k].live) { nosetlast = true; goto crazy; } found = k; crazy:; } if (found > 1) {g_sprite[found].active = false; if (nosetlast == false) g_dglos.last_sprite_created = found -1; return(true); } //we didn't kill any sprites, only 1 remains return(false); } void CopyBitmapToBackBuffer (char *pName) { int ddrval; string fName = pName; StringReplace("\\", "/", fName); fName = GetFileLocationString(fName); if (!FileExists(fName)) { LogMsg("Error: Can't find bitmap at %s.",fName.c_str()); return; } SAFE_DELETE(lpDDSBuffer); assert(!lpDDSBuffer); lpDDSBuffer = LoadBitmapIntoSurface(fName.c_str(), TRANSPARENT_NONE); rtRect32 rcRect(0,0,C_DINK_SCREENSIZE_X, C_DINK_SCREENSIZE_Y); ddrval = lpDDSBack->BltFast( 0, 0, lpDDSBuffer, &rcRect, DDBLTFAST_NOCOLORKEY); } void show_bmp( char *pName, int showdot, int reserved, int script) { CopyBitmapToBackBuffer(pName); g_dglos.g_bShowingBitmap.active = true; g_dglos.g_bShowingBitmap.showdot = showdot; g_dglos.g_bShowingBitmap.script = script; strncpy(g_dglos.g_lastBitmapShown, pName, C_SHOWN_BITMAP_SIZE-1); g_abort_this_flip = true; } void copy_bmp( char *pName) { int ddrval; string fName = pName; StringReplace("\\", "/", fName); fName = GetFileLocationString(fName); if (!FileExists(fName)) { LogMsg("Error: Can't find bitmap at %s.",fName.c_str()); return; } SAFE_DELETE(lpDDSBuffer); assert(!lpDDSBuffer); lpDDSBuffer = LoadBitmapIntoSurface(fName.c_str(), TRANSPARENT_NONE); g_abort_this_flip = true; rtRect32 rcRect(0,0,C_DINK_SCREENSIZE_X, C_DINK_SCREENSIZE_Y); ddrval = lpDDSBack->BltFast( 0, 0, lpDDSBuffer, &rcRect, DDBLTFAST_NOCOLORKEY); ddrval = lpDDSBackGround->BltFast( 0, 0, lpDDSBuffer, &rcRect, DDBLTFAST_NOCOLORKEY); } bool playing( int sound) { return false; } int get_pan(int h) { int pan = 0; int x1 = 320; //uncomment to allow math to be done from Dink's current location //x1 = spr[1].x; if (g_sprite[h].active) { if (g_sprite[h].x > x1) pan += (g_sprite[h].x - x1) * 6; if (x1 > g_sprite[h].x) pan -= (x1 - g_sprite[h].x) * 6; } if (pan > 10000) pan = 10000; if (pan < -10000) pan = -10000; return(pan); } int get_vol(int h) { int pan = 0; int pan2 = 0; if (g_sprite[h].active) { if (g_sprite[h].x > g_sprite[1].x) pan -= (g_sprite[h].x - g_sprite[1].x) * 4; if (g_sprite[1].x > g_sprite[h].x) pan -= (g_sprite[1].x - g_sprite[h].x) * 4; if (g_sprite[h].y > g_sprite[1].y) pan2 -= (g_sprite[h].y - g_sprite[1].y) * 4; if (g_sprite[1].y > g_sprite[h].y) pan2 -= (g_sprite[1].y - g_sprite[h].y) * 4; //Msg("pan %d, pan2 %d", pan, pan2); if (pan2 < pan) pan = pan2; } if (pan > -100) pan = 0; if (pan < -10000) pan = -10000; return(pan); } void kill_all_sounds() { for (int i=1; i <= num_soundbanks; i++) { soundbank[i].Stop(); //Msg("REPEAT Sound %d playing.. owner is %d.", i,soundinfo[i].owner); soundinfo[i].owner = 0; soundinfo[i].repeat = 0; soundinfo[i].freq = 0; soundinfo[i].survive = 0; } } void kill_repeat_sounds( void ) { if (!sound_on) return; for (int i=1; i <= num_soundbanks; i++) { if (soundinfo[i].repeat) if (soundinfo[i].owner == 0) if (soundinfo[i].survive == 0) { soundbank[i].Stop(); //Msg("REPEAT Sound %d playing.. owner is %d.", i,soundinfo[i].owner); soundinfo[i].owner = 0; soundinfo[i].repeat = 0; } } } void kill_repeat_sounds_all( void ) { if (!sound_on) return; for (int i=1; i <= num_soundbanks; i++) { if (soundinfo[i].repeat) if (soundinfo[i].owner == 0) { soundbank[i].Stop(); //Msg("REPEAT Sound %d playing.. owner is %d.", i,soundinfo[i].owner); soundinfo[i].owner = 0; soundinfo[i].repeat = 0; } } } void update_sound(void) { if (!sound_on) return; g_soundTimer = 0; if (! (g_soundTimer < GetBaseApp()->GetGameTick())) { //wait before updating return; } g_soundTimer = GetBaseApp()->GetGameTick()+120; for (int i=1; i <= num_soundbanks; i++) { if (soundinfo[i].repeat) if (soundinfo[i].owner != 0) { if ( ( g_sprite[soundinfo[i].owner].sound == 0) || ( soundinfo[i].owner == 0) || (g_sprite[soundinfo[i].owner].active == false) || soundbank[i].m_audioID == 0) { soundbank[i].Stop(); //Msg("Killed bank %d", i); //Msg("REPEAT Sound %d playing.. owner is %d.", i,soundinfo[i].owner); soundinfo[i].owner = 0; soundinfo[i].repeat = 0; } else { soundbank[i].SetPan(get_pan(soundinfo[i].owner)); soundbank[i].SetVolume(get_vol(soundinfo[i].owner)); } } if (soundbank[i].IsInUse()) { { //Msg("Sound %d playing.. owner is %d.", i,soundinfo[i].owner); if (soundinfo[i].owner != 0) { if (g_sprite[soundinfo[i].owner].active == false) { //Msg("Killed bank %d", i); soundbank[i].Stop(); } else { soundbank[i].SetPan(get_pan(soundinfo[i].owner)); soundbank[i].SetVolume(get_vol(soundinfo[i].owner)); } } } } } } int playbank( int sound, int min,int plus, int sound3d, bool repeat, int forceBank = 0 ) { if (GetEmulatedPlatformID() == PLATFORM_ID_ANDROID) { if (repeat) return 0; //we don't support looping sounds because we can't figure out if they are playing or not, missing an IsPlaying() } //Msg("Playing bank %d..", sound); int i; if (forceBank != 0) { i = forceBank; goto madeit; } for (i=1; i <= num_soundbanks; i++) { if (!soundbank[i].IsInUse()) { goto madeit; } } return(false); madeit: soundbank[i].Reset(); StringReplace("\\", "/", g_soundInfo[sound].m_fileName); string soundFilePathAndName = "sound/"+ToLowerCaseString(g_soundInfo[sound].m_fileName); string fName; //hack because android sucks /* if ( (GetEmulatedPlatformID() == PLATFORM_ID_ANDROID) || (GetEmulatedPlatformID() == PLATFORM_ID_WEBOS) || (GetEmulatedPlatformID() == PLATFORM_ID_BBX)) */ if (1) { //hack the sound value a bit if (sound == 10 && g_soundInfo[sound].m_fileName == "SWORD2.WAV" && min == 22050) { GetAudioManager()->Play("dink/sound/sword2_item.wav"); return 0; } //first try with oggs string temp = ModifyFileExtension(soundFilePathAndName, "ogg"); temp = GetFileLocationString(temp); if (FileExists(temp)) { fName = temp; } else { // LogMsg("Can't find %s", GetFileLocationString(temp).c_str()); fName = GetFileLocationString(soundFilePathAndName); } } else { fName = GetFileLocationString(soundFilePathAndName); } //before we load it, let's see how big it really is. int fileSize = GetFileManager()->GetFileSize(fName, false); if (fileSize < 1) { LogMsg("Unable to locate sound %s", fName.c_str()); return 0; } bool bForceStreaming = false; if (fileSize > 1024*1024*2) { //too big, let's stream it bForceStreaming = true; } soundbank[i].m_audioID = GetAudioManager()->Play(fName, repeat != NULL, false, false, bForceStreaming); #ifdef _DEBUG //LogMsg("Got audioid %d when playing %s",soundbank[i].m_audioID, fName.c_str() ); #endif if (soundbank[i].m_audioID == 0) return 0; soundbank[i].m_soundIDThatPlayedUs = sound; int freq = RandomRange(min, min+plus); if (GetEmulatedPlatformID() != PLATFORM_ID_ANDROID) GetAudioManager()->SetFrequency(soundbank[i].m_audioID, freq); if (sound3d > 0) { soundbank[i].SetPan(get_pan(sound3d)); soundbank[i].SetVolume(get_vol(sound3d)); } soundinfo[i].owner = sound3d; soundinfo[i].repeat = repeat; soundinfo[i].survive = 0; soundinfo[i].vol = 0; soundinfo[i].freq = freq; return i; } /* SoundPlayEffect */ int SoundPlayEffect( int sound, int min,int plus , int sound3d, bool repeat) { return playbank(sound, min, plus, sound3d, repeat); } /* SoundPlayEffect */ int hurt_thing(int h, int damage, int special) { //lets hurt this sprite but good if (damage < 1) return(0); int num = damage - g_sprite[h].defense; // Msg("num is %d.. defense was %d.of sprite %d", num, spr[h].defense, h); if (num < 1) num = 0; if (num == 0) { if ((rand() % 2)+1 == 1) num = 1; } g_sprite[h].damage += num; return(num); //draw blood here } void random_blood(int mx, int my, int h) { //if ((rand() % 2) == 1) myseq = 188; else myseq = 187; //redink1 - customizable blood depending on what sprite we hit!! int myseq; int randy; if (g_sprite[h].bloodseq > 0 && g_sprite[h].bloodnum > 0) { myseq = g_sprite[h].bloodseq; randy = g_sprite[h].bloodnum; } else { myseq = 187; randy = 3; } myseq += (rand() % randy); int crap2 = add_sprite(mx,my,5,myseq,1); g_sprite[crap2].speed = 0; g_sprite[crap2].base_walk = -1; g_sprite[crap2].nohit = 1; g_sprite[crap2].seq = myseq; if (h > 0) g_sprite[crap2].que = g_sprite[h].y+1; } bool SoundStopEffect( int sound ) { /* if(!g_soundInfo[sound].sound ) { return false; } g_soundInfo[sound].sound->Stop(); return true; */ return true; } /* SoundStopEffect */ bool InitSound() { for (int i=1; i < num_soundbanks; i++) { soundbank[i].Reset(); } return true; } /* InitSound */ void BuildScreenBackground( bool bFullRebuild ) { rtRect32 rcRect; int pa, cool; *pvision = 0; if (bFullRebuild) { while (kill_last_sprite()); kill_repeat_sounds(); kill_all_scripts(); g_dglo.m_bgSpriteMan.Clear(); } restart: int tileScreenID; for (int x=0; x<96; x++) { cool = g_dglos.g_smallMap.t[x].num / 128; pa = g_dglos.g_smallMap.t[x].num - (cool * 128); rcRect.left = (pa * 50- (pa / 12) * 600); rcRect.top = (pa / 12) * 50; rcRect.right = rcRect.left + 50; rcRect.bottom = rcRect.top + 50; tileScreenID = cool+1; bool bRequireRebuild; if (!LoadTileScreenIfNeeded(tileScreenID, bRequireRebuild)) { continue; } if (bRequireRebuild) goto restart; g_tileScreens[tileScreenID]->UpdateLastUsedTime(); lpDDSBackGround->BltFast( (x * 50 - ((x / 12) * 600))+g_gameAreaLeftOffset, (x / 12) * 50, g_tileScreens[tileScreenID], &rcRect, DDBLTFAST_NOCOLORKEY| DDBLTFAST_WAIT ); } if (bFullRebuild) { if (strlen(g_dglos.g_smallMap.script) > 1) { int ms = load_script(g_dglos.g_smallMap.script,0, true); if (ms > 0) { locate(ms, "main"); g_dglos.no_running_main = true; run_script(ms); g_dglos.no_running_main = false; } } } //lets add the sprites hardness to the real hardness, adding its own uniqueness to our collective. place_sprites_game(!bFullRebuild); if (!bFullRebuild) return; //don't mess with the game tick stuff or initscripts //if script for overall screen, run it g_dglos.g_dinkTick = GetBaseApp()->GetGameTick(); init_scripts(); } void fill_back_sprites(void ) { int sprite; bool bs[C_MAX_SPRITES_AT_ONCE]; int rank[C_MAX_SPRITES_AT_ONCE]; int highest_sprite; memset(&bs,0,sizeof(bs)); int hs; for (int r1 = 1; r1 < 100; r1++) { highest_sprite = 20000; //more than it could ever be rank[r1] = 0; for (int h1 = 1; h1 < 100; h1++) { if (bs[h1] == false) { if (g_dglos.g_smallMap.sprite[h1].active) if (g_dglos.g_smallMap.sprite[h1].type != 1) if (g_dglos.g_smallMap.sprite[h1].hard == 0) { if (g_dglos.g_smallMap.sprite[h1].que != 0) hs = g_dglos.g_smallMap.sprite[h1].que; else hs = g_dglos.g_smallMap.sprite[h1].y; if ( hs < highest_sprite ) { highest_sprite =hs; rank[r1] = h1; } } } } if (rank[r1] != 0) bs[rank[r1]] = true; } int j; for (int oo =1; rank[oo] > 0; oo++) { //Msg("Ok, rank[%d] is %d.",oo,rank[oo]); j = rank[oo]; if (g_dglos.g_smallMap.sprite[j].active == true) if ( ( g_dglos.g_smallMap.sprite[j].vision == 0) || (g_dglos.g_smallMap.sprite[j].vision == *pvision)) { { //make it part of the background (much faster) sprite = add_sprite_dumb(g_dglos.g_smallMap.sprite[j].x,g_dglos.g_smallMap.sprite[j].y,0, g_dglos.g_smallMap.sprite[j].seq,g_dglos.g_smallMap.sprite[j].frame, g_dglos.g_smallMap.sprite[j].size); g_sprite[sprite].hard = g_dglos.g_smallMap.sprite[j].hard; g_sprite[sprite].sp_index = j; g_sprite[sprite].alt = g_dglos.g_smallMap.sprite[j].alt; check_sprite_status_full(sprite); if (g_sprite[sprite].hard == 0) { /*if (pam.sprite[j].prop == 0) add_hardness(sprite, 1); else */ add_hardness(sprite,100+j); } g_sprite[sprite].active = false; } } } } void add_item(char name[10], int mseq, int mframe, bool magic) { if (magic == false) { //add reg item for (int i = 1; i < 17; i ++) { if (g_dglos.g_playerInfo.g_itemData[i].active == false) { if (debug_mode) LogMsg("Weapon/item %s added to inventory.",name); g_dglos.g_playerInfo.g_itemData[i].seq = mseq; g_dglos.g_playerInfo.g_itemData[i].frame = mframe; strcpy(g_dglos.g_playerInfo.g_itemData[i].name, name); g_dglos.g_playerInfo.g_itemData[i].active = true; //if (debug_mode) // LogMsg("wep: Checking seq",name); check_seq_status(mseq, mframe); int crap1 = load_script(g_dglos.g_playerInfo.g_itemData[i].name, 1000, false); if (locate(crap1, "PICKUP")) { run_script(crap1); } return; } } } else { //add magic item for (int i = 1; i < 9; i ++) { if (g_dglos.g_playerInfo.g_MagicData[i].active == false) { if (debug_mode) LogMsg("Magic %s added to inventory.",name); g_dglos.g_playerInfo.g_MagicData[i].seq = mseq; g_dglos.g_playerInfo.g_MagicData[i].frame = mframe; strcpy(g_dglos.g_playerInfo.g_MagicData[i].name, name); g_dglos.g_playerInfo.g_MagicData[i].active = true; //check_seq_status(mseq, mframe); int crap = load_script(g_dglos.g_playerInfo.g_MagicData[i].name, 1000, false); if (locate(crap, "PICKUP")) run_script(crap); return; } } } } void fill_screen(int num) { //assert(!"Seth, fix this"); DDBLTFX ddbltfx; ddbltfx.dwFillColor = num; lpDDSBackGround->Blt(NULL ,NULL,NULL, DDBLT_COLORFILL | DDBLT_WAIT, &ddbltfx); /* DDBLTFX ddbltfx; ZeroMemory(&ddbltfx, sizeof(ddbltfx)); ddbltfx.dwSize = sizeof( ddbltfx); //redink1 fix for correct fill_screen colors in truecolor mode if (truecolor) { lpDDPal->GetEntries(0,0,256,pe); ddbltfx.dwFillColor = pe[num].peBlue << wBPos | pe[num].peGreen << wGPos | pe[num].peRed << wRPos; } else ddbltfx.dwFillColor = num; crap = lpDDSTwo->Blt(NULL ,NULL,NULL, DDBLT_COLORFILL | DDBLT_WAIT, &ddbltfx); */ } void fill_hard_sprites(void ) { bool bs[C_MAX_SPRITES_AT_ONCE]; int rank[C_MAX_SPRITES_AT_ONCE]; int highest_sprite; int h; memset(&bs,0,sizeof(bs)); //Msg("filling sprite hardness..."); int max_s = g_dglos.last_sprite_created; int height; for (int r1 = 1; r1 <= max_s; r1++) { highest_sprite = 22024; //more than it could ever be rank[r1] = 0; for (int h1 = 1; h1 < max_s+1; h1++) { if (g_sprite[h1].active) { if (bs[h1] == false) { //Msg( "Ok, %d is %d", h1,(spr[h1].y + k[spr[h1].pic].yoffset) ); if (g_sprite[h1].que != 0) height = g_sprite[h1].que; else height = g_sprite[h1].y; if ( height < highest_sprite ) { highest_sprite = height; rank[r1] = h1; } } } } if (rank[r1] != 0) bs[rank[r1]] = true; } for ( int j = 1; j <= max_s; j++) { h = rank[j]; if (h > 0) if (g_sprite[h].active) { // Msg("proccesing sprite %d", h); if (g_sprite[h].sp_index != 0) { //Msg("has spindex of %d prop is %d",spr[h].sp_index,pam.sprite[spr[h].sp_index].prop); if (g_dglos.g_smallMap.sprite[g_sprite[h].sp_index].hard == 0) { add_hardness(h,100+g_sprite[h].sp_index); //Msg("added warp hardness for %d", spr[h].sp_index); } } else { if (g_sprite[h].hard == 0) { //Msg("adding a new sprite hardness %d (not from editor)", h); add_hardness(h, 1); } } } } } void LoadGame(int gameSlot) { kill_all_scripts_for_real(); g_dglos.g_returnint = load_game(gameSlot); LogMsg("load completed. "); *pupdate_status = 1; draw_status_all(); } int process_line (int script, char *pLineIn, bool doelse) { char * h, *p; int i; char line[200]; char ev[15][100]; char temp[255]; char first[2]; int sprite = 0; if (g_scriptInstance[script]->level < 1) g_scriptInstance[script]->level = 1; for (int kk =1; kk < 15; kk++) ev[kk][0] = 0; h = pLineIn; if (h[0] == 0) return(0); if ( (h[0] == '/') && (h[1] == '/')) { //Msg("It was a comment!"); goto bad; } for ( i=1; i <= 14; i++) { if (separate_string(h, i,' ',ev[i]) == false) goto pass; } pass: #ifdef _DEBUG //LogMsg("first line is %s (second is %s), third is %s", ev[1], ev[2], ev[3]); #endif if (compare(ev[1], (char*)"VOID")) { if (g_scriptInstance[script]->proc_return != 0) { run_script(g_scriptInstance[script]->proc_return); kill_script(script); } //Msg("returning.."); return(2); } //replace("\n","",ev[1]); if (ev[1][strlen(ev[1]) -1] == ':') if (strlen(ev[2]) < 2) if (strncmp(ev[1],"say",3) != 0) { // Msg("Found label %s..",ev[1]); return(0); //its a label } if (ev[1][0] == '(') { //this procedure has been passed a conditional statement finder //what kind of conditional statement is it? p = h; separate_string(h, 2,')',temp); //Msg("We found %s, woah!", temp); separate_string(h, 1,')',ev[1]); // Msg("Ok, turned h %s to ev1 %s.",h,ev[1]); p = &p[strlen(ev[1])+1]; strip_beginning_spaces(p); // Msg("does %s have a ( in front?", p); //Msg("We found %s, woah!", temp); //These are used for conditionals?? if (strchr(temp, '=') != NULL) { h = &h[1]; strip_beginning_spaces(h); process_line(script, h, false); replace("==", "", temp); sprintf(line, "%d == %s", g_dglos.g_returnint, temp); g_dglos.g_returnint = var_figure(line, script); strcpy(h, "\n"); return(0); } if (strchr(temp, '>') != NULL) { h = &h[1]; strip_beginning_spaces(h); process_line(script, h, false); replace("==", "", temp); sprintf(line, "%d > %s", g_dglos.g_returnint, temp); g_dglos.g_returnint = var_figure(line, script); strcpy(h, "\n"); return(0); } if (strchr(temp, '<') != NULL) { h = &h[1]; strip_beginning_spaces(h); process_line(script, h, false); replace("==", "", temp); sprintf(line, "%d < %s", g_dglos.g_returnint, temp); g_dglos.g_returnint = var_figure(line, script); strcpy(h, "\n"); return(0); } /* if (strchr(temp, '<=') != NULL) { h = &h[1]; strip_beginning_spaces(h); process_line(script, h, false); replace("==", "", temp); sprintf(line, "%d <= %s", returnint, temp); returnint = var_figure(line, script); strcpy(h, "\n"); return(0); } if (strchr(temp, '>=') != NULL) { h = &h[1]; strip_beginning_spaces(h); process_line(script, h, false); replace("==", "", temp); sprintf(line, "%d >= %s", returnint, temp); returnint = var_figure(line, script); strcpy(h, "\n"); return(0); } */ if (strchr(temp, '!') != NULL) { h = &h[1]; strip_beginning_spaces(h); process_line(script, h, false); replace("==", "", temp); sprintf(line, "%d != %s", g_dglos.g_returnint, temp); g_dglos.g_returnint = var_figure(line, script); strcpy(h, "\n"); return(0); } if (p[0] == ')') { //its a procedure in the if statement!!! h = &h[1]; p = &p[1]; strcpy(line, p); process_line(script, h, false); //8 LogMsg("Returned %d for the returnint", g_dglos.g_returnint); h = pLineIn; strcpy(pLineIn, line); // Msg("Returing %s..", s); return(0); } else { h = &h[1]; separate_string(h, 1,')',line); h = &h[strlen(line)+1]; g_dglos.g_returnint = var_figure(line, script); strcpy(pLineIn, h); return(0); } strip_beginning_spaces(h); strip_beginning_spaces(ev[1]); pLineIn = h; } else { } if (strchr(ev[1], '(') != NULL) { //Msg("Has a (, lets change it"); separate_string(h, 1,'(',ev[1]); //Msg("Ok, first is now %s",ev[1]); } first[0] = ev[1][0]; first[1] = 0; // sprintf(first, "%c",ev[1][0]); if (compare(first, "{")) { g_scriptInstance[script]->level++; //Msg("Went up level, now at %d.", rinfo[script]->level); h = &h[1]; if (g_scriptInstance[script]->skipnext) { g_scriptInstance[script]->skipnext = false; g_scriptInstance[script]->onlevel = ( g_scriptInstance[script]->level - 1); //Msg("Skipping until level %d is met..", rinfo[script]->onlevel); } goto good; } if (compare(first, "}")) { g_scriptInstance[script]->level--; //Msg("Went down a level, now at %d.", rinfo[script]->level); h = &h[1]; if (g_scriptInstance[script]->onlevel > 0) if (g_scriptInstance[script]->level == g_scriptInstance[script]->onlevel) { strip_beginning_spaces(h); strcpy(pLineIn, h); return(4); } goto good; } if (g_scriptInstance[script]->level < 0) { g_scriptInstance[script]->level = 0; } if (compare(ev[1], (char*)"void")) { // Msg("Next procedure starting, lets quit"); strcpy(pLineIn, h); if (g_scriptInstance[script]->proc_return != 0) { run_script(g_scriptInstance[script]->proc_return); kill_script(script); } return(2); } { //used to be an if.. if (g_scriptInstance[script]->onlevel > 0) { if (g_scriptInstance[script]->level > g_scriptInstance[script]->onlevel) return(0); } g_scriptInstance[script]->onlevel = 0; if (g_scriptInstance[script]->skipnext) { //sorry, can't do it, you were told to skip the next thing g_scriptInstance[script]->skipnext = false; strcpy(pLineIn, h); return(3); } //if (debug_mode) Msg("%s",s); if (compare(ev[1], (char*)"void")) { LogMsg("ERROR: Missing } in %s, offset %d.", g_scriptInstance[script]->name,g_scriptInstance[script]->current); strcpy(pLineIn, h); return(2); } if (compare(ev[1], (char*)"else")) { //Msg("Found else!"); h = &h[strlen(ev[1])]; if (!doelse) { //they shouldn't run the next thing g_scriptInstance[script]->skipnext = true; //Msg("No to else..."); } strcpy(pLineIn, h); return(1); } if (compare(ev[1], (char*)"unfreeze")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,0,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { //Msg("UnFreeze called for %d.", nlist[0]); if (g_sprite[g_nlist[0]].active) g_sprite[g_nlist[0]].freeze = 0; else LogMsg("Couldn't unfreeze sprite %d in script %d, it doesn't exist.", g_nlist[0], script); } strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"freeze")) { //Msg("Freeze called (%s)", h); h = &h[strlen(ev[1])]; int32 p[20] = {1,0,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { if (g_sprite[g_nlist[0]].active) g_sprite[g_nlist[0]].freeze = script; else LogMsg("Couldn't freeze sprite %d in script %d, it doesn't exist.", g_nlist[0], script); } strcpy(pLineIn, h); return(0); } //redink1 added so we can have return values and crap. if (compare(ev[1], (char*)"return")) { if (debug_mode) LogMsg("Found return; statement"); h = &h[strlen(ev[1])]; strip_beginning_spaces(h); process_line(script, h, false); if (g_scriptInstance[script]->proc_return != 0) { g_dglos.bKeepReturnInt = true; run_script(g_scriptInstance[script]->proc_return); kill_script(script); } return(2); } if (compare(ev[1], (char*)"if")) { h = &h[strlen(ev[1])]; strip_beginning_spaces(h); //LogMsg("running if with string of %s", h); process_line(script, h, false); //Msg("Result is %d", returnint); if (g_dglos.g_returnint != 0) { if (debug_mode) LogMsg("If returned true"); } else { //don't do it! g_scriptInstance[script]->skipnext = true; if (debug_mode) LogMsg("If returned false, skipping next thing"); } //DO STUFF HERE! strcpy(pLineIn, h); //g("continuing to run line %s..", h); return(5); } if (compare(ev[1], (char*)"sp_dir")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = change_sprite(g_nlist[0], g_nlist[1], &g_sprite[g_nlist[0]].dir); if (g_nlist[1] != -1) changedir(g_sprite[g_nlist[0]].dir, g_nlist[0], g_sprite[g_nlist[0]].base_walk); return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[2], "=")) { h = &h[strlen(ev[1])]; strip_beginning_spaces(h); h = &h[1]; strip_beginning_spaces(h); var_equals(ev[1], ev[3], '=', script, h); strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"set_callback_random")) { h = &h[strlen(ev[1])]; int32 p[20] = {2,1,1,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { int cb = add_callback(slist[0],g_nlist[1],g_nlist[2],script); //got all parms, let do it g_dglos.g_returnint = cb; } strcpy(pLineIn, h); return(0); } // redink1 added if (compare(ev[1], (char*)"callback_kill")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,0,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { if ( g_nlist[0] >= 0 && g_nlist[0] <= 99) { g_dglos.g_scriptCallback[g_nlist[0]].active = false; } } strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"set_dink_speed")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,0,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p) && g_nlist[0] != 0) { g_dglos.dinkspeed = g_nlist[0]; } strcpy(pLineIn, h); return(0); } //redink1 if (compare(ev[1], (char*)"set_dink_base_push")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,0,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.mDinkBasePush = g_nlist[0]; } strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"reset_timer")) { h = &h[strlen(ev[1])]; g_dglos.time_start = GetBaseApp()->GetGameTick(); g_dglos.g_playerInfo.minutes = 0; strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"set_keep_mouse")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,0,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.keep_mouse = g_nlist[0]; } strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"add_item")) { h = &h[strlen(ev[1])]; int32 p[20] = {2,1,1,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { add_item(slist[0], g_nlist[1], g_nlist[2], false); } strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"add_exp")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { add_exp(g_nlist[0], g_nlist[1], true); } strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"add_magic")) { h = &h[strlen(ev[1])]; int32 p[20] = {2,1,1,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { add_item(slist[0], g_nlist[1], g_nlist[2], true); } strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"kill_this_item")) { h = &h[strlen(ev[1])]; int32 p[20] = {2,0,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { kill_cur_item_script(slist[0]); } strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"kill_this_magic")) { h = &h[strlen(ev[1])]; int32 p[20] = {2,0,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { kill_cur_magic_script(slist[0]); } strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"show_bmp")) { //LogMsg("showing BMP"); h = &h[strlen(ev[1])]; int32 p[20] = {2,1,1,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_wait_for_button.active = false; show_bmp(slist[0], g_nlist[1], g_nlist[2], script); } strcpy(pLineIn, h); return(2); } if (compare(ev[1], (char*)"wait_for_button")) { //LogMsg("waiting for button with script %d", script); h = &h[strlen(ev[1])]; strcpy(pLineIn, h); g_dglos.g_wait_for_button.script = script; g_dglos.g_wait_for_button.active = true; g_dglos.g_wait_for_button.button = 0; return(2); } if (compare(ev[1], (char*)"stop_wait_for_button")) { g_dglos.g_wait_for_button.active = false; return(0); } if (compare(ev[1], (char*)"copy_bmp_to_screen")) { LogMsg("copying BMP"); h = &h[strlen(ev[1])]; int32 p[20] = {2,0,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { copy_bmp(slist[0]); } strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"say")) { h = &h[strlen(ev[1])]; int32 p[20] = {2,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { if (g_nlist[1] == 0) { LogMsg("Say_stop error: Sprite 0 can talk? Yeah, didn't think so."); return(0); } if (g_nlist[1] != 1000) kill_text_owned_by(g_nlist[1]); decipher_string(slist[0], script); g_dglos.g_returnint = say_text(slist[0], g_nlist[1], script); //Msg("Just said %s.", slist[0]); } strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"draw_screen")) { if (g_dglos.g_gameMode == 1 || g_dglos.g_gameMode == 2) { g_dglos.m_bRenderBackgroundOnLoad = true; } else { g_dglos.m_bRenderBackgroundOnLoad = false; } if (g_scriptInstance[script]->sprite == 1000) { BuildScreenBackground(); return(0); } BuildScreenBackground(); return(2); } if (compare(ev[1], (char*)"free_items")) { g_dglos.g_returnint = 0; for (int i = 1; i < 17; i ++) { if (g_dglos.g_playerInfo.g_itemData[i].active == false) { g_dglos.g_returnint += 1; } } return(0); } if (compare(ev[1], (char*)"kill_cur_item")) { g_dglos.g_returnint = 0; kill_cur_item(); return(2); } if (compare(ev[1], (char*)"kill_cur_magic")) { g_dglos.g_returnint = 0; kill_cur_magic(); return(2); } if (compare(ev[1], (char*)"free_magic")) { g_dglos.g_returnint = 0; for (int i = 1; i < 9; i ++) { if (g_dglos.g_playerInfo.g_MagicData[i].active == false) { g_dglos.g_returnint += 1; } } return(0); } if (compare(ev[1], (char*)"draw_status")) { draw_status_all(); return(0); } if (compare(ev[1], (char*)"arm_weapon")) { if (g_dglos.weapon_script != 0) if (locate(g_dglos.weapon_script, "DISARM")) run_script(g_dglos.weapon_script); g_dglos.weapon_script = load_script(g_dglos.g_playerInfo.g_itemData[*pcur_weapon].name, 1000, false); if (locate(g_dglos.weapon_script, "ARM")) run_script(g_dglos.weapon_script); return(0); } if (compare(ev[1], (char*)"arm_magic")) { if (g_dglos.magic_script != 0) if (locate(g_dglos.magic_script, "DISARM")) run_script(g_dglos.magic_script); g_dglos.magic_script = load_script(g_dglos.g_playerInfo.g_MagicData[*pcur_magic].name, 1000, false); if (locate(g_dglos.magic_script, "ARM")) run_script(g_dglos.magic_script); return(0); } if (compare(ev[1], (char*)"load_screen")) { //Msg("Loading map %d..",*pmap); update_screen_time(); load_map(g_MapInfo.loc[*pmap]); //redink1 fix for correct indicator on mini-map if (g_MapInfo.indoor[*pmap] == 0) g_dglos.g_playerInfo.last_map = *pmap; return(0); } if (compare(ev[1], (char*)"choice_start")) { kill_text_owned_by(1); if (talk_get(script)) { // Msg("Question gathered successfully."); return(2); } return(0); } if (compare(ev[1], (char*)"say_stop")) { h = &h[strlen(ev[1])]; int32 p[20] = {2,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { if (g_nlist[1] == 0) { LogMsg("Say_stop error: Sprite 0 can talk? Yeah, didn't think so."); return(0); } kill_text_owned_by(g_nlist[1]); kill_text_owned_by(1); kill_returning_stuff(script); decipher_string(slist[0], script); sprite = say_text(slist[0], g_nlist[1], script); g_dglos.g_returnint = sprite; g_sprite[sprite].callback = script; g_dglos.g_playerInfo.last_talk = script; //Msg("Sprite %d marked callback true.", sprite); strcpy(pLineIn, h); return(2); } strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"say_stop_npc")) { h = &h[strlen(ev[1])]; int32 p[20] = {2,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { if (text_owned_by(g_nlist[1])) { g_dglos.g_returnint = 0; return(0); } kill_returning_stuff(script); decipher_string(slist[0], script); sprite = say_text(slist[0], g_nlist[1], script); g_dglos.g_returnint = sprite; g_sprite[sprite].callback = script; strcpy(pLineIn, h); return(2); } strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"say_stop_xy")) { h = &h[strlen(ev[1])]; int32 p[20] = {2,1,1,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { //LogMsg("Say_stop_xy: Adding %s", slist[0]); kill_returning_stuff(script); decipher_string(slist[0], script); sprite = say_text_xy(slist[0], g_nlist[1], g_nlist[2], script); g_sprite[sprite].callback = script; g_sprite[sprite].live = true; g_dglos.g_playerInfo.last_talk = script; strcpy(pLineIn, h); return(2); } strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"say_xy")) { h = &h[strlen(ev[1])]; int32 p[20] = {2,1,1,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { kill_returning_stuff(script); decipher_string(slist[0], script); sprite = say_text_xy(slist[0], g_nlist[1], g_nlist[2], script); g_dglos.g_returnint = sprite; strcpy(pLineIn, h); return(0); } strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"restart_game")) { DinkRestartGame(); /* while (kill_last_sprite()); kill_repeat_sounds_all(); kill_all_scripts_for_real(); g_gameMode = 0; screenlock = 0; kill_all_vars(); memset(&g_dglos.g_hitmap, 0, sizeof(g_dglos.g_hitmap)); for (int u = 1; u <= 10; u++) g_dglos.g_playerInfo.button[u] = u; int script = load_script("main", 0, true); locate(script, "main"); run_script(script); //lets attach our vars to the scripts attach(); */ return(2); } if (compare(ev[1], (char*)"wait")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,0,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { // Msg("Wait called for %d.", nlist[0]); strcpy(pLineIn, h); kill_returning_stuff(script); int cb1 = add_callback("",g_nlist[0],0,script); return(2); } strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"preload_seq")) { /* h = &h[strlen(ev[1])]; int32 p[20] = {1,0,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { check_seq_status(g_nlist[0]); } strcpy(pLineIn, h); */ return(0); } if (compare(ev[1], (char*)"script_attach")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,0,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_scriptInstance[script]->sprite = g_nlist[0]; } strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"draw_hard_sprite")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,0,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { update_play_changes(); int l = g_nlist[0]; rtRect32 mhard; mhard = g_dglos.g_picInfo[g_dglos.g_seq[g_sprite[l].pseq].frame[g_sprite[l].pframe]].hardbox; OffsetRect(&mhard, (g_sprite[l].x- 20), g_sprite[l].y); fill_hardxy(mhard); fill_back_sprites(); fill_hard_sprites(); } strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"move")) { // (sprite, direction, until, nohard); h = &h[strlen(ev[1])]; int32 p[20] = {1,1,1,1,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_sprite[g_nlist[0]].move_active = true; g_sprite[g_nlist[0]].move_dir = g_nlist[1]; g_sprite[g_nlist[0]].move_num = g_nlist[2]; g_sprite[g_nlist[0]].move_nohard = g_nlist[3]; g_sprite[g_nlist[0]].move_script = 0; if (debug_mode) LogMsg("Moving: Sprite %d, dir %d, num %d", g_nlist[0],g_nlist[1], g_nlist[2]); } strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"sp_script")) { // (sprite, direction, until, nohard); h = &h[strlen(ev[1])]; int32 p[20] = {1,2,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { if (g_nlist[0] == 0) { LogMsg("Error: sp_script cannot process sprite 0??"); return(0); } kill_scripts_owned_by(g_nlist[0]); if (!slist[1][0] || load_script(slist[1], g_nlist[0], true) == 0) { g_dglos.g_returnint = 0; return(0); } //if (no_running_main == true) LogMsg("Not running %s until later..", g_scriptInstance[g_sprite[g_nlist[0]].script]->name); if (g_dglos.no_running_main == false) locate(g_sprite[g_nlist[0]].script, "MAIN"); int tempreturn = g_sprite[g_nlist[0]].script; if (g_dglos.no_running_main == false) run_script(g_sprite[g_nlist[0]].script); g_dglos.g_returnint = tempreturn; } strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"spawn")) { // (sprite, direction, until, nohard); h = &h[strlen(ev[1])]; int32 p[20] = {2,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { int mysc = load_script(slist[0], 1000, true); if (mysc == 0) { g_dglos.g_returnint = 0; return(0); } locate(mysc, "MAIN"); int tempreturn = mysc; run_script(mysc); g_dglos.g_returnint = tempreturn; } strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"run_script_by_number")) { // (sprite, direction, until, nohard); h = &h[strlen(ev[1])]; int32 p[20] = {1,2,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { if (locate(g_nlist[0], slist[1])) { run_script(g_nlist[0]); } } strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"draw_hard_map")) { // (sprite, direction, until, nohard); LogMsg("Drawing hard map.."); update_play_changes(); fill_whole_hard(); fill_hard_sprites(); fill_back_sprites(); strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"draw_background")) { BuildScreenBackground(false); strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"fade_down")) { g_dglos.process_downcycle = true; g_dglos.process_upcycle = false; g_dglos.cycle_clock = g_dglos.g_dinkTick; g_dglos.cycle_script = script; strcpy(pLineIn, h); return(2); } if (compare(ev[1], (char*)"fade_up")) { h = &h[strlen(ev[1])]; g_dglos.process_upcycle = true; g_dglos.process_downcycle = false; g_dglos.cycle_clock = g_dglos.g_dinkTick; g_dglos.cycle_script = script; g_dinkFadeAlpha = 1; strcpy(pLineIn, h); return(2); } if (compare(ev[1], (char*)"kill_this_task")) { if (g_scriptInstance[script]->proc_return != 0) { run_script(g_scriptInstance[script]->proc_return); } kill_script(script); return(2); } if (compare(ev[1], (char*)"kill_game")) { LogMsg("Was told to kill game, so doing it like a good boy."); g_sprite[1].freeze = 0; SaveState(g_dglo.m_savePath+"continue_state.dat"); WriteLastPathSaved(""); //kill our state.dat if it existed, not needed now, this can exist if an iphone goes into suspend, but then is resumed RemoveFile(GetSavePath()+"state.dat", false); DinkQuitGame(); //uncomment below if you want this to actually work //PostMessage(g_hWndMain, WM_CLOSE, 0, 0); return(2); } //redink1 added if (compare(ev[1], (char*)"loopmidi")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,0,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { if ( g_nlist[0] > 0 ) { g_dglos.mLoopMidi = true; } else { g_dglos.mLoopMidi = false; } } return(0); } if (compare(ev[1], (char*)"playmidi")) { h = &h[strlen(ev[1])]; int32 p[20] = {2,0,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { int regm = atol(slist[0]); LogMsg("Processing playmidi command."); if (regm > 1000) { LogMsg("playmidi - cd play command detected."); PlayMidi((toString(regm-1000)+".mid").c_str()); } else { PlayMidi(slist[0]); } } strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"stopmidi")) { // (sprite, direction, until, nohard); h = &h[strlen(ev[1])]; StopMidi(); strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"LOGMSG")) { h = &h[strlen(ev[1])]; int32 p[20] = {2,0,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { LogMsg(slist[0]); } strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"kill_all_sounds")) { kill_repeat_sounds_all(); strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"turn_midi_off")) { g_dglos.midi_active = false; strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"turn_midi_on")) { g_dglos.midi_active = true; strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"Playsound")) { // (sprite, direction, until, nohard); h = &h[strlen(ev[1])]; int32 p[20] = {1,1,1,1,1,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { if (sound_on) g_dglos.g_returnint = SoundPlayEffect(g_nlist[0], g_nlist[1], g_nlist[2], g_nlist[3],g_nlist[4]); else g_dglos.g_returnint = 0; } else g_dglos.g_returnint = 0; strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"sound_set_survive")) { // (sprite, direction, until, nohard); h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { if (sound_on) { //let's set one sound to survive if (g_nlist[0] > 0) soundinfo[g_nlist[0]].survive = g_nlist[1]; } } strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"sound_set_vol")) { // (sprite, direction, until, nohard); h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { if (sound_on) { //let's set one sound to survive if (g_nlist[0] > 0) { soundinfo[g_nlist[0]].vol = g_nlist[1]; soundbank[g_nlist[0]].SetVolume(g_nlist[1]); } } } strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"sound_set_kill")) { // (sprite, direction, until, nohard); h = &h[strlen(ev[1])]; int32 p[20] = {1,0,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { if (sound_on) { //let's set one sound to survive if (g_nlist[0] > 0) { soundbank[g_nlist[0]].Stop(); } } } strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"save_game")) { // (sprite, direction, until, nohard); h = &h[strlen(ev[1])]; int32 p[20] = {1,0,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { save_game(g_nlist[0]); } strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"force_vision")) { // (sprite, direction, until, nohard); h = &h[strlen(ev[1])]; int32 p[20] = {1,0,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { *pvision = g_nlist[0]; g_scriptInstance[script]->sprite = 1000; fill_whole_hard(); BuildScreenBackground(); } strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"fill_screen")) { // (sprite, direction, until, nohard); h = &h[strlen(ev[1])]; int32 p[20] = {1,0,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { fill_screen(g_nlist[0]); g_dglos.m_bRenderBackgroundOnLoad = false; } strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"load_game")) { // (sprite, direction, until, nohard); h = &h[strlen(ev[1])]; int32 p[20] = {1,0,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { int gameSlot = g_nlist[0]; if (gameSlot == 10) { string fName = DinkGetSavePath()+"autosave.dat"; bool bSuccess = LoadState(fName, true); if (!bSuccess) { RemoveFile(fName, false); GetAudioManager()->Play("audio/buzzer2.wav"); ShowQuickMessage("Error loading save state. Old version?"); } else { GetAudioManager()->Play("audio/quick_load.wav"); LoadState(fName, false); ShowQuickMessage("Game loaded."); } } else { LoadGame(gameSlot); } return(2); } strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"game_exist")) { // (sprite, direction, until, nohard); h = &h[strlen(ev[1])]; int32 p[20] = {1,0,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { if (g_nlist[0] == 10) { //hack to check for the autosave slot instead sprintf(temp, "%sautosavedb.dat",(g_dglo.m_savePath).c_str()); } else { sprintf(temp, "%ssave%d.dat",(g_dglo.m_savePath).c_str(), g_nlist[0]); } if (FileExists(temp)) g_dglos.g_returnint = 1; else g_dglos.g_returnint = 0; } strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"move_stop")) { // (sprite, direction, until, nohard); h = &h[strlen(ev[1])]; int32 p[20] = {1,1,1,1,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { //Msg("Move stop running %d to %d..", nlist[0], nlist[0]); g_sprite[g_nlist[0]].move_active = true; g_sprite[g_nlist[0]].move_dir = g_nlist[1]; g_sprite[g_nlist[0]].move_num = g_nlist[2]; g_sprite[g_nlist[0]].move_nohard = g_nlist[3]; g_sprite[g_nlist[0]].move_script = script; strcpy(pLineIn, h); if (debug_mode) LogMsg("Move_stop: Sprite %d, dir %d, num %d", g_nlist[0],g_nlist[1], g_nlist[2]); return(2); } strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"load_sound")) { h = &h[strlen(ev[1])]; int32 p[20] = {2,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { if (sound_on) { #ifdef _DEBUG LogMsg("getting %s..",slist[0]); #endif CreateBufferFromWaveFile(slist[0],g_nlist[1]); } } strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"debug")) { h = &h[strlen(ev[1])]; int32 p[20] = {2,0,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { decipher_string(slist[0], script); LogMsg(slist[0]); } strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"goto")) { //LogMsg("Goto %s", ev[2]); locate_goto(ev[2], script); return(0); } //redink1 added for global functions if (compare(ev[1], (char*)"make_global_function")) { h = &h[strlen(ev[1])]; int32 p[20] = {2,2,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { make_function(slist[0], slist[1]); //Msg(slist[0]); } strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"make_global_int")) { h = &h[strlen(ev[1])]; int32 p[20] = {2,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { make_int(slist[0], g_nlist[1],0, script); //Msg(slist[0]); } strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"int")) { int_prepare(h, script); //Msg(slist[0]); h = &h[strlen(ev[1])]; //Msg("Int is studying %s..", h); if (strchr(h, '=') != NULL) { strip_beginning_spaces(h); //Msg("Found =...continuing equation"); strcpy(pLineIn, h); return(4); } return(0); } if (compare(ev[1], (char*)"busy")) { h = &h[strlen(ev[1])]; // Msg("Running busy, h is %s", h); int32 p[20] = {1,0,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { if (g_nlist[0] == 0) LogMsg("ERROR: Busy cannot get info on sprite 0 in %s.",g_scriptInstance[script]->name); else { g_dglos.g_returnint = does_sprite_have_text(g_nlist[0]); LogMsg("Busy: Return int is %d and %d. Nlist got %d.", g_dglos.g_returnint,does_sprite_have_text(g_nlist[0]), g_nlist[0]); } } else LogMsg("Failed getting parms for Busy()"); strcpy(pLineIn, h); return(0); } //redink1 added if (compare(ev[1], (char*)"sp_freeze")) { h = &h[strlen(ev[1])]; // Msg("Running busy, h is %s", h); int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { // Set the value if ( g_nlist[1] == 0 ) { g_sprite[g_nlist[0]].freeze = 0; } else if ( g_nlist[1] == 1 ) { g_sprite[g_nlist[0]].freeze = script; } // Return the value if ( g_sprite[g_nlist[0]].freeze > 0 ) { g_dglos.g_returnint = 1; } else { g_dglos.g_returnint = 0; } } strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"inside_box")) { h = &h[strlen(ev[1])]; //LogMsg("Running pigs with h", h); int32 p[20] = {1,1,1,1,1,1,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { rtRect32 myrect(g_nlist[2], g_nlist[3], g_nlist[4], g_nlist[5]); g_dglos.g_returnint = inside_box(g_nlist[0], g_nlist[1], myrect); if (debug_mode) LogMsg("Inbox is int is %d and %d. Nlist got %d.", g_dglos.g_returnint, g_nlist[0], g_nlist[1]); } else LogMsg("Failed getting parms for inside_box"); strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"random")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = (rand() % g_nlist[0])+g_nlist[1]; } else LogMsg("Failed getting parms for Random()"); strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"get_version")) { h = &h[strlen(ev[1])]; g_dglos.g_returnint = C_DINK_VERSION; strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"get_client_version")) { h = &h[strlen(ev[1])]; g_dglos.g_returnint = GetApp()->GetVersion()*100; strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"get_platform")) { //h = &h[strlen(ev[1])]; g_dglos.g_returnint = GetEmulatedPlatformID(); strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"SHOW_POPUP")) { h = &h[strlen(ev[1])]; int32 p[20] = {2,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { LogMsg("Showing %s in %d..",slist[0], g_nlist[1]); Entity *pBG = GetEntityRoot()->GetEntityByName("GameMenu"); assert(pBG); if (!pBG) return 0; VariantList vList(pBG, string(slist[0])); GetMessageManager()->CallEntityFunction(pBG, g_nlist[1], "ShowQuickTip", &vList); } strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"initfont")) { LogMsg("Ignoring Initfont command"); return(0); } if (compare(ev[1], (char*)"get_truecolor")) { //h = &h[strlen(ev[1])]; if (g_dglo.m_dmodGameDir == "lyna/") return 0; g_dglos.g_returnint = 1; strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"get_burn")) { h = &h[strlen(ev[1])]; g_dglos.g_returnint = 0; strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"set_mode")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,0,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_gameMode = g_nlist[0]; g_dglos.g_returnint = g_dglos.g_gameMode; //if (g_dglos.g_gameMode == ) } else LogMsg("Failed to set mode"); strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"kill_shadow")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,0,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { for (int jj = 1; jj <= g_dglos.last_sprite_created; jj++) { if (g_sprite[jj].brain == 15) if (g_sprite[jj].brain_parm == g_nlist[0]) { g_sprite[jj].active = 0; } } } strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"create_sprite")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,1,1,1,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = add_sprite_dumb(g_nlist[0],g_nlist[1],g_nlist[2], g_nlist[3],g_nlist[4], 100); return(0); } g_dglos.g_returnint = 0; return(0); } if (compare(ev[1], (char*)"sp")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,0,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { for (int ii = 1; ii <= g_dglos.last_sprite_created; ii++) { if (g_sprite[ii].sp_index == g_nlist[0]) { if (debug_mode) LogMsg("Sp returned %d.", ii); g_dglos.g_returnint = ii; return(0); } } if (g_dglos.last_sprite_created == 1) { LogMsg("warning - you can't call SP() from a screen-ref, no sprites have been created yet."); } } g_dglos.g_returnint = 0; return(0); } if (compare(ev[1], (char*)"is_script_attached")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,0,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = g_sprite[g_nlist[0]].script; } return(0); } if (compare(ev[1], (char*)"sp_speed")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = change_sprite(g_nlist[0], g_nlist[1], &g_sprite[g_nlist[0]].speed); if (g_nlist[1] != -1) changedir(g_sprite[g_nlist[0]].dir, g_nlist[0], g_sprite[g_nlist[0]].base_walk); return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"sp_range")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = change_sprite(g_nlist[0], g_nlist[1], &g_sprite[g_nlist[0]].range); return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"sp_nocontrol")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = change_sprite(g_nlist[0], g_nlist[1], &g_sprite[g_nlist[0]].nocontrol); return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"sp_nodraw")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = change_sprite(g_nlist[0], g_nlist[1], &g_sprite[g_nlist[0]].nodraw); return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"sp_picfreeze")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = change_sprite(g_nlist[0], g_nlist[1], &g_sprite[g_nlist[0]].picfreeze); return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"get_sprite_with_this_brain")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { for (int i = 1; i <= g_dglos.last_sprite_created; i++) { if ( (g_sprite[i].brain == g_nlist[0]) && (i != g_nlist[1]) ) if (g_sprite[i].active == 1) { //LogMsg("Ok, sprite with brain %d is %d", g_nlist[0], i); g_dglos.g_returnint = i; return(0); } } } //LogMsg("Ok, sprite with brain %d is 0", g_nlist[0], i); g_dglos.g_returnint = 0; return(0); } //redink1 added this to make Paul Pliska's life more fulfilling if (compare(ev[1], (char*)"get_next_sprite_with_this_brain")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,1,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { for (int i = g_nlist[2]; i <= g_dglos.last_sprite_created; i++) { if ( (g_sprite[i].brain == g_nlist[0]) && (i != g_nlist[1]) ) if (g_sprite[i].active == 1) { //LogMsg("Ok, sprite with brain %d is %d", g_nlist[0], i); g_dglos.g_returnint = i; return(0); } } } //LogMsg("Ok, sprite with brain %d is 0", g_nlist[0], i); g_dglos.g_returnint = 0; return(0); } if (compare(ev[1], (char*)"get_rand_sprite_with_this_brain")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { int cter = 0; for (int i = 1; i <= g_dglos.last_sprite_created; i++) { if ( (g_sprite[i].brain == g_nlist[0]) && (i != g_nlist[1]) ) if (g_sprite[i].active == 1) { cter++; } } if (cter == 0) { LogMsg("Get rand brain can't find any brains with %d.",g_nlist[0]); g_dglos.g_returnint = 0; return(0); } int mypick = (rand() % cter)+1; cter = 0; for (int ii = 1; ii <= g_dglos.last_sprite_created; ii++) { if ( (g_sprite[ii].brain == g_nlist[0]) && (ii != g_nlist[1]) ) if (g_sprite[ii].active == 1) { cter++; if (cter == mypick) { g_dglos.g_returnint = ii; return(0); } } } } g_dglos.g_returnint = 0; return(0); } if (compare(ev[1], (char*)"sp_sound")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = change_sprite(g_nlist[0], g_nlist[1], &g_sprite[g_nlist[0]].sound); if (g_nlist[1] > 0) { SoundPlayEffect( g_sprite[g_nlist[0]].sound,22050, 0,g_nlist[0], 1); } return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"sp_attack_wait")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = change_sprite(g_nlist[0], g_nlist[1]+g_dglos.g_dinkTick, &g_sprite[g_nlist[0]].attack_wait); return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"sp_active")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = change_sprite(g_nlist[0], g_nlist[1], &g_sprite[g_nlist[0]].active); return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"sp_disabled")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = change_sprite(g_nlist[0], g_nlist[1], &g_sprite[g_nlist[0]].disabled); return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"sp_size")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = change_sprite(g_nlist[0], g_nlist[1], &g_sprite[g_nlist[0]].size); return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"activate_bow")) { g_sprite[1].seq = 0; g_sprite[1].pseq = 100+g_sprite[1].dir; g_sprite[1].pframe = 1; g_dglos.g_bowStatus.active = true; g_dglos.g_bowStatus.script = script; g_dglos.g_bowStatus.hitme = false; g_dglos.g_bowStatus.time = 0; return(2); } if (compare(ev[1], (char*)"get_last_bow_power")) { g_dglos.g_returnint = g_dglos.g_bowStatus.last_power; return(0); } if (compare(ev[1], (char*)"sp_que")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = change_sprite(g_nlist[0], g_nlist[1], &g_sprite[g_nlist[0]].que); return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"sp_gold")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = change_sprite(g_nlist[0], g_nlist[1], &g_sprite[g_nlist[0]].gold); return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"sp_base_walk")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = change_sprite_noreturn(g_nlist[0], g_nlist[1], &g_sprite[g_nlist[0]].base_walk); return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"sp_target")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = change_sprite(g_nlist[0], g_nlist[1], &g_sprite[g_nlist[0]].target); return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"stopcd")) { LogMsg("Stopped cd"); return(0); } if (compare(ev[1], (char*)"sp_base_hit")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = change_sprite_noreturn(g_nlist[0], g_nlist[1], &g_sprite[g_nlist[0]].base_hit); return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"sp_base_attack")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = change_sprite_noreturn(g_nlist[0], g_nlist[1], &g_sprite[g_nlist[0]].base_attack); return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"sp_base_idle")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = change_sprite_noreturn(g_nlist[0], g_nlist[1], &g_sprite[g_nlist[0]].base_idle); return(0); } g_dglos.g_returnint = -1; return(0); } if ( (compare(ev[1], (char*)"sp_base_die")) || (compare(ev[1], (char*)"sp_base_death")) ) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = change_sprite_noreturn(g_nlist[0], g_nlist[1], &g_sprite[g_nlist[0]].base_die); return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"disable_all_sprites")) { for (int jj = 1; jj < g_dglos.last_sprite_created; jj++) if (g_sprite[jj].active) g_sprite[jj].disabled = true; return(0); } if (compare(ev[1], (char*)"enable_all_sprites")) { for (int jj = 1; jj < g_dglos.last_sprite_created; jj++) if (g_sprite[jj].active) g_sprite[jj].disabled = false; return(0); } if (compare(ev[1], (char*)"sp_pseq")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = change_sprite(g_nlist[0], g_nlist[1], &g_sprite[g_nlist[0]].pseq); return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"sp_pframe")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = change_sprite(g_nlist[0], g_nlist[1], &g_sprite[g_nlist[0]].pframe); return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"sp_seq")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = change_sprite(g_nlist[0], g_nlist[1], &g_sprite[g_nlist[0]].seq); return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"editor_type")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { //Msg("Setting editor_type.."); g_dglos.g_returnint = change_edit_char(g_nlist[0], g_nlist[1], &g_dglos.g_playerInfo.spmap[*pmap].type[g_nlist[0]]); return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"editor_seq")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = change_edit(g_nlist[0], g_nlist[1], &g_dglos.g_playerInfo.spmap[*pmap].seq[g_nlist[0]]); return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"editor_frame")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = change_edit_char(g_nlist[0], g_nlist[1], &g_dglos.g_playerInfo.spmap[*pmap].frame[g_nlist[0]]); return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"sp_editor_num")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,0,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = g_sprite[g_nlist[0]].sp_index; return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"sp_brain")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = change_sprite(g_nlist[0], g_nlist[1], &g_sprite[g_nlist[0]].brain); if (g_nlist[1] == 13) { //a mouse brain was set... g_dglo.SetViewOverride(DinkGlobals::VIEW_FULL); } return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"sp_exp")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = change_sprite(g_nlist[0], g_nlist[1], &g_sprite[g_nlist[0]].exp); return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"set_button")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_playerInfo.button[g_nlist[0]] = g_nlist[1]; return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"sp_reverse")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = change_sprite(g_nlist[0], g_nlist[1], &g_sprite[g_nlist[0]].reverse); return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"sp_noclip")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = change_sprite(g_nlist[0], g_nlist[1], &g_sprite[g_nlist[0]].noclip); return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"sp_touch_damage")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = change_sprite_noreturn(g_nlist[0], g_nlist[1], &g_sprite[g_nlist[0]].touch_damage); return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"sp_brain_parm")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = change_sprite(g_nlist[0], g_nlist[1], &g_sprite[g_nlist[0]].brain_parm); return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"sp_brain_parm2")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = change_sprite(g_nlist[0], g_nlist[1], &g_sprite[g_nlist[0]].brain_parm2); return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"sp_follow")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = change_sprite(g_nlist[0], g_nlist[1], &g_sprite[g_nlist[0]].follow); return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"set_smooth_follow")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,0,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { if ( g_nlist[0] == 0 ) { g_dglos.smooth_follow = false; } else if ( g_nlist[0] == 1 ) { g_dglos.smooth_follow = true; } return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"sp_frame")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = change_sprite(g_nlist[0], g_nlist[1], &g_sprite[g_nlist[0]].frame); return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"sp_frame_delay")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = change_sprite(g_nlist[0], g_nlist[1], &g_sprite[g_nlist[0]].frame_delay); return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"hurt")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { //redink1 fix for freeze if hurt value is less than 0 if (g_nlist[1] < 0) return(0); if (hurt_thing(g_nlist[0], g_nlist[1], 0) > 0) random_blood(g_sprite[g_nlist[0]].x, g_sprite[g_nlist[0]].y-40, g_nlist[0]); if (g_sprite[g_nlist[0]].nohit != 1) if (g_sprite[g_nlist[0]].script != 0) if (locate(g_sprite[g_nlist[0]].script, "HIT")) { if (g_scriptInstance[script]->sprite != 1000) { *penemy_sprite = g_scriptInstance[script]->sprite; //redink1 addition of missle_source stuff *pmissle_source = g_scriptInstance[script]->sprite; } kill_returning_stuff(g_sprite[g_nlist[0]].script); run_script(g_sprite[g_nlist[0]].script); } return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"sp_hard")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = change_sprite(g_nlist[0], g_nlist[1], &g_sprite[g_nlist[0]].hard); if (g_sprite[g_nlist[0]].sp_index != 0) if (g_nlist[1] != -1) { g_dglos.g_smallMap.sprite[g_sprite[g_nlist[0]].sp_index].hard = g_dglos.g_returnint; } return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"sp_move_nohard")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = change_sprite(g_nlist[0], g_nlist[1], &g_sprite[g_nlist[0]].move_nohard); return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"sp_flying")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = change_sprite(g_nlist[0], g_nlist[1], &g_sprite[g_nlist[0]].flying); return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"sp_kill_wait")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,0,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_sprite[g_nlist[0]].wait = 0; return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"sp_kill")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { if (g_nlist[0] < C_MAX_SPRITES_AT_ONCE) //SETH this fixes crash when killing milder { g_sprite[g_nlist[0]].kill = g_nlist[1]; return(0); } else { LogMsg("Aborting crash in sp_kill"); } } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"screenlock")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,0,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { if ( g_nlist[0] == 0 || g_nlist[0] == 1 ) { g_dglos.screenlock = g_nlist[0]; } } //redink1 - set screenlock() to return the screenlock value g_dglos.g_returnint = g_dglos.screenlock; return(0); } if (compare(ev[1], (char*)"stop_entire_game")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,0,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_stopEntireGame = g_nlist[0]; /* rtRect32 rcRect(0,0,C_DINK_SCREENSIZE_X,C_DINK_SCREENSIZE_Y); int ddrval; ddrval = lpDDSBackGround->BltFast( 0, 0, lpDDSBack, &rcRect, DDBLTFAST_NOCOLORKEY); */ return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"dink_can_walk_off_screen")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,0,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.walk_off_screen = g_nlist[0]; return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"push_active")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,0,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_pushingEnabled = g_nlist[0]; return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"sp_x")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = change_sprite(g_nlist[0], g_nlist[1], &g_sprite[g_nlist[0]].x); return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"count_item")) { h = &h[strlen(ev[1])]; int32 p[20] = {2,0,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = 0; for (int i = 1; i < 17; i++) { if (g_dglos.g_playerInfo.g_itemData[i].active) { if (compare(g_dglos.g_playerInfo.g_itemData[i].name, slist[0])) g_dglos.g_returnint++; } } return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"count_magic")) { h = &h[strlen(ev[1])]; int32 p[20] = {2,0,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = 0; for (int i = 1; i < 9; i++) { if (g_dglos.g_playerInfo.g_MagicData[i].active) { if (compare(g_dglos.g_playerInfo.g_MagicData[i].name, slist[0])) g_dglos.g_returnint++; } } return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"sp_mx")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = change_sprite(g_nlist[0], g_nlist[1], &g_sprite[g_nlist[0]].mx); return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"sp_move_x")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { change_sprite_noreturn(g_nlist[0], g_nlist[1], &g_sprite[g_nlist[0]].mx); return(0); } return(0); } if (compare(ev[1], (char*)"sp_my")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = change_sprite(g_nlist[0], g_nlist[1], &g_sprite[g_nlist[0]].my); return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"sp_move_y")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { change_sprite_noreturn(g_nlist[0], g_nlist[1], &g_sprite[g_nlist[0]].my); return(0); } return(0); } if (compare(ev[1], (char*)"scripts_used")) { h = &h[strlen(ev[1])]; int m = 0; for (int i = 1; i < C_MAX_SCRIPTS; i++) if (g_scriptInstance[i] != NULL) m++; g_dglos.g_returnint = m; #ifdef _DEBUG LogMsg("%d scripts used", g_dglos.g_returnint); #endif return(0); } if (compare(ev[1], (char*)"sp_hitpoints")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = change_sprite(g_nlist[0], g_nlist[1], &g_sprite[g_nlist[0]].hitpoints); return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"sp_attack_hit_sound")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = change_sprite(g_nlist[0], g_nlist[1], &g_sprite[g_nlist[0]].attack_hit_sound); return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"sp_attack_hit_sound_speed")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = change_sprite(g_nlist[0], g_nlist[1], &g_sprite[g_nlist[0]].attack_hit_sound_speed); return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"sp_strength")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = change_sprite(g_nlist[0], g_nlist[1], &g_sprite[g_nlist[0]].strength); return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"sp_defense")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = change_sprite(g_nlist[0], g_nlist[1], &g_sprite[g_nlist[0]].defense); return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"init")) { h = &h[strlen(ev[1])]; int32 p[20] = {2,0,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { figure_out(slist[0], 0); return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"sp_distance")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = change_sprite(g_nlist[0], g_nlist[1], &g_sprite[g_nlist[0]].distance); return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"sp_nohit")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = change_sprite(g_nlist[0], g_nlist[1], &g_sprite[g_nlist[0]].nohit); return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"sp_notouch")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = change_sprite(g_nlist[0], g_nlist[1], &g_sprite[g_nlist[0]].notouch); return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"compare_weapon")) { h = &h[strlen(ev[1])]; int32 p[20] = {2,0,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = 0; if (*pcur_weapon == 0) { return(0); } if (compare(g_dglos.g_playerInfo.g_itemData[*pcur_weapon].name, slist[0])) { g_dglos.g_returnint = 1; } return(0); } return(0); } if (compare(ev[1], (char*)"compare_magic")) { h = &h[strlen(ev[1])]; int32 p[20] = {2,0,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = 0; if (*pcur_magic == 0) { return(0); } //redink1 fix so compare_magic works! if (compare(g_dglos.g_playerInfo.g_MagicData[*pcur_magic].name, slist[0])) { g_dglos.g_returnint = 1; } return(0); } return(0); } if (compare(ev[1], (char*)"compare_sprite_script")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,2,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = 0; if (g_nlist[0] == 0) { LogMsg("Error: Can't compare sprite script for sprite 0!??!?!"); return(0); } if (g_sprite[g_nlist[0]].active) { if (g_sprite[g_nlist[0]].script == 0) { LogMsg("Compare sprite script says: Sprite %d has no script.",g_nlist[0]); return(0); } if (compare(slist[1], g_scriptInstance[g_sprite[g_nlist[0]].script]->name)) { g_dglos.g_returnint = 1; return(0); } } else { LogMsg("Can't compare sprite script, sprite not active."); } return(0); } return(0); } if (compare(ev[1], (char*)"sp_y")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = change_sprite(g_nlist[0], g_nlist[1], &g_sprite[g_nlist[0]].y); return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"sp_timing")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = change_sprite(g_nlist[0], g_nlist[1], &g_sprite[g_nlist[0]].timer); return(0); } g_dglos.g_returnint = -1; return(0); } if (compare(ev[1], (char*)"return;")) { if (debug_mode) LogMsg("Found return; statement"); if (g_scriptInstance[script]->proc_return != 0) { g_dglos.bKeepReturnInt = true; run_script(g_scriptInstance[script]->proc_return); kill_script(script); } return(2); } //redink1 - sets font color if (compare(ev[1], (char*)"set_font_color")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,1,1,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { if (g_nlist[0] >= 1 && g_nlist[0] <= 15 && g_nlist[1] >= 0 && g_nlist[1] <= 255 && g_nlist[2] >= 0 && g_nlist[2] <= 255 && g_nlist[3] >= 0 && g_nlist[3] <= 255) { g_dglos.font_colors[g_nlist[0]].red = g_nlist[1]; g_dglos.font_colors[g_nlist[0]].green = g_nlist[2]; g_dglos.font_colors[g_nlist[0]].blue = g_nlist[3]; } } strcpy(pLineIn, h); return(0); } //redink1 - clears the editor information, useful for save games and such if (compare(ev[1], (char*)"clear_editor_info")) { h = &h[strlen(ev[1])]; for (int i = 0; i < 769; i++) { for (int j = 0; j < 100; j++) { g_dglos.g_playerInfo.spmap[i].seq[j] = 0; g_dglos.g_playerInfo.spmap[i].frame[j] = 0; g_dglos.g_playerInfo.spmap[i].type[j] = 0; g_dglos.g_playerInfo.spmap[i].last_time = 0; } } g_dglos.g_returnint = 1; return(0); } //redink1 - returns the number of variables used if (compare(ev[1], (char*)"var_used")) { h = &h[strlen(ev[1])]; int m = 0; for (int i = 1; i < max_vars; i++) if (g_dglos.g_playerInfo.var[i].active == true) m++; g_dglos.g_returnint = m; return(0); } //redink1 added this function to load a new map/dink.dat if (compare(ev[1], (char*)"load_map")) { h = &h[strlen(ev[1])]; int32 p[20] = {2,2,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { strcpy(g_dglos.current_map,slist[0]); strcpy(g_dglos.current_dat,slist[1]); load_info(); } strcpy(pLineIn, h); return(0); } //redink1 added this function to load a pallete from any bmp if (compare(ev[1], (char*)"load_palette")) { h = &h[strlen(ev[1])]; int32 p[20] = {2,0,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { assert(!"We don't support this"); } strcpy(pLineIn, h); return(0); } if (compare(ev[1], "load_tile")) { h = &h[strlen(ev[1])]; int32 p[20] = {2,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { assert(!"Unsupported"); LogMsg("Command load_tile unsupported"); } strcpy(pLineIn, h); return(0); } //redink1 added this function to change the save game 'info' if (compare(ev[1], (char*)"set_save_game_info")) { h = &h[strlen(ev[1])]; int32 p[20] = {2,0,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { strcpy(g_dglos.save_game_info,slist[0]); } strcpy(pLineIn, h); return(0); } //redink1 added this function to show the item screen if (compare(ev[1], (char*)"show_inventory")) { h = &h[strlen(ev[1])]; g_itemScreenActive = true; if (!IsLargeScreen()) { g_dglo.SetViewOverride(DinkGlobals::VIEW_ZOOMED); } strcpy(pLineIn, h); return(0); } //redink1 added this function,, and took it away. /*if (compare(ev[1], (char*)"get_compatibility")) { returnint = 0; h = &h[strlen(ev[1])]; int32 p[20] = {2,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { if (compare(slist[0],"get_compatibility")) { if (nlist[1] <= 1) { returnint = 1; } } } strcpy(s, h); return(0); }*/ //redink1 added this function if (compare(ev[1], (char*)"get_time_game")) { h = &h[strlen(ev[1])]; g_dglos.g_returnint = (GetBaseApp()->GetGameTick()-g_dglos.time_start) / (1000*60); strcpy(pLineIn, h); return(0); } //redink1 added this function if (compare(ev[1], (char*)"get_time_real")) { h = &h[strlen(ev[1])]; h = &h[strlen(ev[1])]; char mytime[5]; time_t ct; struct tm *time_now; time(&ct); time_now = localtime(&ct); strftime(mytime,5,"%M",time_now); g_dglos.g_returnint = atoi(mytime); strftime(mytime,5,"%H",time_now); g_dglos.g_returnint += 60*atoi(mytime); strcpy(pLineIn, h); return(0); } //redink1 added this function if (compare(ev[1], (char*)"get_date_year")) { h = &h[strlen(ev[1])]; char mytime[5]; time_t ct; struct tm *time_now; time(&ct); time_now = localtime(&ct); strftime(mytime,5,"%Y",time_now); g_dglos.g_returnint = atoi(mytime); strcpy(pLineIn, h); return(0); } //redink1 added this function if (compare(ev[1], (char*)"get_date_month")) { h = &h[strlen(ev[1])]; char mytime[5]; time_t ct; struct tm *time_now; time(&ct); time_now = localtime(&ct); strftime(mytime,5,"%m",time_now); g_dglos.g_returnint = atoi(mytime); strcpy(pLineIn, h); return(0); } //redink1 added this function if (compare(ev[1], (char*)"get_date_day")) { h = &h[strlen(ev[1])]; char mytime[5]; time_t ct; struct tm *time_now; time(&ct); time_now = localtime(&ct); strftime(mytime,5,"%d",time_now); g_dglos.g_returnint = atoi(mytime); strcpy(pLineIn, h); return(0); } //redink1 added this function if (compare(ev[1], (char*)"math_abs")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,0,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = abs(g_nlist[0]); } strcpy(pLineIn, h); return(0); } //redink1 added this function /*if (compare(ev[1], (char*)"math_sin")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,0,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { returnint = sin((double)nlist[0]); } strcpy(s, h); return(0); } //redink1 added this function if (compare(ev[1], (char*)"math_cos")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,0,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { returnint = cos((double)nlist[0]); } strcpy(s, h); return(0); } //redink1 added this function if (compare(ev[1], (char*)"math_tan")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,0,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { returnint = tan((double)nlist[0]); } strcpy(s, h); return(0); }*/ //redink1 added this function if (compare(ev[1], (char*)"math_sqrt")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,0,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = sqrt((double)abs(g_nlist[0])); } strcpy(pLineIn, h); return(0); } //redink1 added this function if (compare(ev[1], (char*)"math_mod")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = (g_nlist[0] % g_nlist[1]); } strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"breakpoint")) { h = &h[strlen(ev[1])]; int32 p[20] = {0,0,0,0,0,0,0,0,0,0}; assert(!"Breakpoint!"); return(0); } //redink1 if (compare(ev[1], (char*)"sp_custom")) { h = &h[strlen(ev[1])]; int32 p[20] = {2,1,1,0,0,0,0,0,0,0}; if ( get_parms(ev[1], script, h, p) && g_sprite[g_nlist[1]].active == true ) { if ( g_nlist[1] < 1 || g_sprite[g_nlist[1]].active == false ) { g_dglos.g_returnint = -1; } else { // If key doesn't exist, create it. if ( g_customSpriteMap[g_nlist[1]]->find( slist[0] ) == g_customSpriteMap[g_nlist[1]]->end() ) { g_customSpriteMap[g_nlist[1]]->insert( std::make_pair( slist[0], 0 ) ); } // Set the value if ( g_nlist[2] != -1 ) { g_customSpriteMap[g_nlist[1]]->erase( slist[0] ); g_customSpriteMap[g_nlist[1]]->insert( std::make_pair( slist[0], g_nlist[2] ) ); } g_dglos.g_returnint = g_customSpriteMap[g_nlist[1]]->find( slist[0] )->second; } return(0); } g_dglos.g_returnint = -1; return(0); } //redink1 if (compare(ev[1], (char*)"sp_blood_seq")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { change_sprite(g_nlist[0], g_nlist[1], &g_sprite[g_nlist[0]].bloodseq); g_dglos.g_returnint = g_sprite[g_nlist[0]].bloodseq; return(0); } g_dglos.g_returnint = -1; return(0); } //redink1 if (compare(ev[1], (char*)"sp_blood_num")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { change_sprite(g_nlist[0], g_nlist[1], &g_sprite[g_nlist[0]].bloodnum); g_dglos.g_returnint = g_sprite[g_nlist[0]].bloodseq; return(0); } g_dglos.g_returnint = -1; return(0); } //redink1 added to get index of specified item if (compare(ev[1], (char*)"get_item")) { h = &h[strlen(ev[1])]; int32 p[20] = {2,0,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = 0; for (int i = 1; i < 17; i++) { if (g_dglos.g_playerInfo.g_itemData[i].active) { if (compare(g_dglos.g_playerInfo.g_itemData[i].name, slist[0])) { g_dglos.g_returnint = i; break; } } } return(0); } g_dglos.g_returnint = -1; return(0); } //redink1 added to get index of specified magic spell if (compare(ev[1], (char*)"get_magic")) { h = &h[strlen(ev[1])]; int32 p[20] = {2,0,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { g_dglos.g_returnint = 0; for (int i = 1; i < 9; i++) { if (g_dglos.g_playerInfo.g_MagicData[i].active) { if (compare(g_dglos.g_playerInfo.g_MagicData[i].name, slist[0])) { g_dglos.g_returnint = i; break; } } } return(0); } g_dglos.g_returnint = -1; return(0); } //redink1 clip stuff if (compare(ev[1], (char*)"sp_clip_left")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { change_sprite(g_nlist[0], g_nlist[1], &g_sprite[g_nlist[0]].alt.left); g_dglos.g_returnint = g_sprite[g_nlist[0]].alt.left; return(0); } g_dglos.g_returnint = -1; return(0); } //redink1 clip stuff if (compare(ev[1], (char*)"sp_clip_top")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { change_sprite(g_nlist[0], g_nlist[1], &g_sprite[g_nlist[0]].alt.top); g_dglos.g_returnint = g_sprite[g_nlist[0]].alt.top; return(0); } g_dglos.g_returnint = -1; return(0); } //redink1 clip stuff if (compare(ev[1], (char*)"sp_clip_right")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { change_sprite(g_nlist[0], g_nlist[1], &g_sprite[g_nlist[0]].alt.right); g_dglos.g_returnint = g_sprite[g_nlist[0]].alt.right; return(0); } g_dglos.g_returnint = -1; return(0); } //redink1 clip stuff if (compare(ev[1], (char*)"sp_clip_bottom")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { change_sprite(g_nlist[0], g_nlist[1], &g_sprite[g_nlist[0]].alt.bottom); g_dglos.g_returnint = g_sprite[g_nlist[0]].alt.bottom; return(0); } g_dglos.g_returnint = -1; return(0); } //redink1 added so developers can change or see what tile is at any given position if (compare(ev[1], (char*)"map_tile")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { //Yeah... they can only modify valid tiles if (g_nlist[0] > 0 && g_nlist[0] <= 96) { //Only change the value if it is greater than 0... if (g_nlist[1] > 0) { g_dglos.g_smallMap.t[g_nlist[0]-1].num = g_nlist[1]; } g_dglos.g_returnint = g_dglos.g_smallMap.t[g_nlist[0]-1].num; return(0); } } g_dglos.g_returnint = -1; return(0); } //redink1 added so a developer can retrieve/modify a hard tile if (compare(ev[1], (char*)"map_hard_tile")) { h = &h[strlen(ev[1])]; int32 p[20] = {1,1,0,0,0,0,0,0,0,0}; if (get_parms(ev[1], script, h, p)) { //Yeah... they can only modify valid tiles if (g_nlist[0] > 0 && g_nlist[0] <= 96) { //Only change the value if it is greater than 0... if (g_nlist[1] > 0) { g_dglos.g_smallMap.t[g_nlist[0]-1].althard = g_nlist[1]; } g_dglos.g_returnint = g_dglos.g_smallMap.t[g_nlist[0]-1].althard; return(0); } } g_dglos.g_returnint = -1; return(0); } if (compare(ev[2], "+=")) { h = &h[strlen(ev[1])]; strip_beginning_spaces(h); h = &h[2]; strip_beginning_spaces(h); var_equals(ev[1], ev[3], '+', script, h); strcpy(pLineIn, h); return(0); } if (compare(ev[2], "*=")) { h = &h[strlen(ev[1])]; strip_beginning_spaces(h); h = &h[2]; strip_beginning_spaces(h); var_equals(ev[1], ev[3], '*', script, h); strcpy(pLineIn, h); return(0); } if (compare(ev[2], "-=")) { h = &h[strlen(ev[1])]; strip_beginning_spaces(h); h = &h[2]; strip_beginning_spaces(h); var_equals(ev[1], ev[3], '-', script, h); strcpy(pLineIn, h); return(0); } if (compare(ev[2], "/") || compare(ev[2], "/=")) { h = &h[strlen(ev[1])]; strip_beginning_spaces(h); h = &h[1]; strip_beginning_spaces(h); var_equals(ev[1], ev[3], '/', script, h); strcpy(pLineIn, h); return(0); } if (compare(ev[2], "*") || compare(ev[2], "*=")) { h = &h[strlen(ev[1])]; strip_beginning_spaces(h); h = &h[1]; strip_beginning_spaces(h); var_equals(ev[1], ev[3], '*', script, h); strcpy(pLineIn, h); return(0); } if (compare(ev[1], (char*)"external")) { h = &h[strlen(ev[1])]; int32 p[20] = {2,2,1,1,1,1,1,1,1,1}; memset(slist, 0, 10 * 200); get_parms(ev[1], script, h, p); if (slist[0][0] && slist[1][0]) { int myscript1 = load_script(slist[0],g_scriptInstance[script]->sprite, false); if (myscript1 == 0) { LogMsg("Error: Couldn't find %s.c (for procedure %s)", slist[0], slist[1]); return(0); } g_scriptInstance[myscript1]->arg1 = g_nlist[2]; g_scriptInstance[myscript1]->arg2 = g_nlist[3]; g_scriptInstance[myscript1]->arg3 = g_nlist[4]; g_scriptInstance[myscript1]->arg4 = g_nlist[5]; g_scriptInstance[myscript1]->arg5 = g_nlist[6]; g_scriptInstance[myscript1]->arg6 = g_nlist[7]; g_scriptInstance[myscript1]->arg7 = g_nlist[8]; g_scriptInstance[myscript1]->arg8 = g_nlist[9]; if (locate( myscript1, slist[1])) { g_scriptInstance[myscript1]->proc_return = script; run_script(myscript1); return(2); } else { LogMsg("Error: Couldn't find procedure %s in %s.", slist[1], slist[0]); kill_script(myscript1); } } strcpy(pLineIn, h); return(0); } if (strchr(h, '(') != NULL) { //lets attempt to run a procedure int myscript = load_script(g_scriptInstance[script]->name, g_scriptInstance[script]->sprite, false); h = &h[strlen(ev[1])]; int32 p[20] = {1,1,1,1,1,1,1,1,1,1}; get_parms(ev[1], script, h, p); if (locate( myscript, ev[1])) { g_scriptInstance[myscript]->arg1 = g_nlist[0]; g_scriptInstance[myscript]->arg2 = g_nlist[1]; g_scriptInstance[myscript]->arg3 = g_nlist[2]; g_scriptInstance[myscript]->arg4 = g_nlist[3]; g_scriptInstance[myscript]->arg5 = g_nlist[4]; g_scriptInstance[myscript]->arg6 = g_nlist[5]; g_scriptInstance[myscript]->arg7 = g_nlist[6]; g_scriptInstance[myscript]->arg8 = g_nlist[7]; g_scriptInstance[myscript]->arg9 = g_nlist[8]; g_scriptInstance[myscript]->proc_return = script; run_script(myscript); return(2); } else { for (int i = 0; strlen(g_dglos.g_playerInfo.func[i].func) > 0 && i < 100; i++) { if (compare(g_dglos.g_playerInfo.func[i].func, ev[1])) { myscript = load_script(g_dglos.g_playerInfo.func[i].file, g_scriptInstance[script]->sprite, false); g_scriptInstance[myscript]->arg1 = g_nlist[0]; g_scriptInstance[myscript]->arg2 = g_nlist[1]; g_scriptInstance[myscript]->arg3 = g_nlist[2]; g_scriptInstance[myscript]->arg4 = g_nlist[3]; g_scriptInstance[myscript]->arg5 = g_nlist[4]; g_scriptInstance[myscript]->arg6 = g_nlist[5]; g_scriptInstance[myscript]->arg7 = g_nlist[6]; g_scriptInstance[myscript]->arg8 = g_nlist[7]; g_scriptInstance[myscript]->arg9 = g_nlist[8]; if (locate(myscript, ev[1])) { g_scriptInstance[myscript]->proc_return = script; run_script(myscript); return(2); } break; } } LogMsg("ERROR: Procedure void %s( void ); not found in script %s. (word 2 was %s) ", line, ev[2], g_scriptInstance[myscript]->name); kill_script(myscript); } return(0); } LogMsg("MERROR: \"%s\" unknown in %s, offset %d.",ev[1], g_scriptInstance[script]->name,g_scriptInstance[script]->current); } bad: strcpy(pLineIn, h); return(0); good: strcpy(pLineIn, h); //s = h //Msg("ok, continuing with running %s..",s); return(1); } void run_script (int script) { int result; char line[200]; if (g_dglos.bKeepReturnInt) { g_dglos.bKeepReturnInt = false; } else { g_dglos.g_returnint = 0; } returnstring[0] = 0; if (g_scriptInstance[script] != NULL) { if (debug_mode) LogMsg("Script %s is entered at offset %d.", g_scriptInstance[script]->name, g_scriptInstance[script]->current); } else { LogMsg("Error: Tried to run a script that doesn't exist in memory. Nice work."); } while(read_next_line(script, line)) { while(1) { if (ScriptEOF(script)) { if (g_scriptInstance[script]->proc_return != 0) { run_script(g_scriptInstance[script]->proc_return); kill_script(script); } return; } strip_beginning_spaces(line); if (compare(line, "\n")) break; result = process_line(script,line, false); if (result == 3) { redo: if (!read_next_line(script, line)) { //we've reached the end of the script return; } crappa: strip_beginning_spaces(line); if (compare(line, "\n")) goto redo; if (compare(line, "\\\\")) goto redo; // Msg("processing %s knowing we are going to skip it...", line); result = process_line(script,line, true); } if (result == 5) goto crappa; if (result == 3) { goto redo; } if (result == 2) { if (debug_mode) LogMsg("giving script the boot"); //quit script return; } if (result == 0) break; if (result == 4) { // Msg("Was sent %s, length %d", line, strlen(line)); if (strlen(line) < 2) { redo2: if (!read_next_line(script, line)) { //script is actualyl empty break; } strip_beginning_spaces(line); //Msg("Comparing to %s.", line); if (compare(line, "\n")) goto redo2; if (compare(line, "\\\\")) goto redo2; } result = process_line(script,line, true); } if (result == 2) { if (debug_mode) LogMsg("giving script the boot"); //quit script return; } if (result == 0) break; } } if (g_scriptInstance[script] != NULL) { if (g_scriptInstance[script]->proc_return != 0) { run_script(g_scriptInstance[script]->proc_return); kill_script(script); } } } void process_callbacks(void) { uint32 thist = (int)GetBaseApp()->GetGameTick(); for (int i = 1; i < C_MAX_SCRIPTS; i++) { if (g_scriptInstance[i] != NULL) { if (g_scriptInstance[i]->sprite > 0) if (g_scriptInstance[i]->sprite != 1000) if (g_sprite[g_scriptInstance[i]->sprite].active == false) { //kill this script, owner is dead //if (debug_mode) LogMsg("Killing script Set%s, owner sprite %d is dead.",g_scriptInstance[i]->name, g_scriptInstance[i]->sprite); kill_script(i); } } } for (int k = 1; k < C_MAX_SCRIPT_CALLBACKS; k++) { if (g_dglos.g_scriptCallback[k].active) { if (g_dglos.g_scriptCallback[k].owner > 0) if (g_scriptInstance[g_dglos.g_scriptCallback[k].owner] == NULL) { //kill this process, it's owner sprite is 'effin dead. if (debug_mode) LogMsg("Killed callback %s because script %d is dead.", k, g_dglos.g_scriptCallback[k].owner); g_dglos.g_scriptCallback[k].active = false; } else { if (g_dglos.g_scriptCallback[k].timer == 0) { //set timer if (g_dglos.g_scriptCallback[k].max > 0) g_dglos.g_scriptCallback[k].timer = thist + (rand() % g_dglos.g_scriptCallback[k].max)+g_dglos.g_scriptCallback[k].min; else g_dglos.g_scriptCallback[k].timer = thist + g_dglos.g_scriptCallback[k].min; } else { if (g_dglos.g_scriptCallback[k].timer < thist) { g_dglos.g_scriptCallback[k].timer = 0; //g_dglos.g_scriptCallback[k].active = false; //SETH Adding this fixes one prob, but breaks others? if (compare(g_dglos.g_scriptCallback[k].name, "")) { //callback defined no proc name, so lets assume they want to start the script where it //left off //kill this callback g_dglos.g_scriptCallback[k].active = false; run_script(g_dglos.g_scriptCallback[k].owner); if (debug_mode) LogMsg("Called script %d with callback %d.", g_dglos.g_scriptCallback[k].owner, k); } else { if (debug_mode) LogMsg("Called proc %s with callback %d.", g_dglos.g_scriptCallback[k].name, k); //callback defined a proc name if (locate(g_dglos.g_scriptCallback[k].owner,g_dglos.g_scriptCallback[k].name)) { //found proc, lets run it run_script(g_dglos.g_scriptCallback[k].owner); } } } } } } } } void init_scripts(void) { for (int k = 1; k < C_MAX_SCRIPTS; k++) { if (g_scriptInstance[k] != NULL && g_scriptInstance[k]->sprite != 0 && g_scriptInstance[k]->sprite < 300 && g_sprite[g_scriptInstance[k]->sprite].active ) { if (locate(k,"main")) { if (debug_mode) LogMsg("Screendraw: running main of script %s..", g_scriptInstance[k]->name); run_script(k); } } } } //redink1 added for font colors void init_font_colors(void) { //Light Magenta g_dglos.font_colors[1].red = 255; g_dglos.font_colors[1].green = 198; g_dglos.font_colors[1].blue = 255; //Dark Green g_dglos.font_colors[2].red = 131; g_dglos.font_colors[2].green = 181; g_dglos.font_colors[2].blue = 74; //Bold Cyan g_dglos.font_colors[3].red = 99; g_dglos.font_colors[3].green = 242; g_dglos.font_colors[3].blue = 247; //Orange g_dglos.font_colors[4].red = 255; g_dglos.font_colors[4].green = 156; g_dglos.font_colors[4].blue = 74; //Magenta g_dglos.font_colors[5].red = 222; g_dglos.font_colors[5].green = 173; g_dglos.font_colors[5].blue = 255; //Brown Orange g_dglos.font_colors[6].red = 244; g_dglos.font_colors[6].green = 188; g_dglos.font_colors[6].blue = 73; //Light Gray g_dglos.font_colors[7].red = 173; g_dglos.font_colors[7].green = 173; g_dglos.font_colors[7].blue = 173; //Dark Gray g_dglos.font_colors[8].red = 85; g_dglos.font_colors[8].green = 85; g_dglos.font_colors[8].blue = 85; //Sky Blue g_dglos.font_colors[9].red = 148; g_dglos.font_colors[9].green = 198; g_dglos.font_colors[9].blue = 255; //Bright Green g_dglos.font_colors[10].red = 0; g_dglos.font_colors[10].green = 255; g_dglos.font_colors[10].blue = 0; //Yellow g_dglos.font_colors[11].red = 255; g_dglos.font_colors[11].green = 255; g_dglos.font_colors[11].blue = 2; //Yellow g_dglos.font_colors[12].red = 255; g_dglos.font_colors[12].green = 255; g_dglos.font_colors[12].blue = 2; //Hot Pink g_dglos.font_colors[13].red = 255; g_dglos.font_colors[13].green = 132; g_dglos.font_colors[13].blue = 132; //Yellow g_dglos.font_colors[14].red = 255; g_dglos.font_colors[14].green = 255; g_dglos.font_colors[14].blue = 2; //White g_dglos.font_colors[15].red = 255; g_dglos.font_colors[15].green = 255; g_dglos.font_colors[15].blue = 255; } void text_draw(int h) { char crap[200]; char *cr; rtRect32 rcRect; int color = 15; int maxX = 620; int minX = 0; if (g_dglo.m_curView == DinkGlobals::VIEW_ZOOMED) { //maxX = 600; minX = 20; } if (g_sprite[h].damage == -1) { //redink1 fix for : and '%deee bugs? strcpy(crap, g_sprite[h].text); //sprintf(crap, "%s", spr[h].text); cr = &crap[0]; color = 14; while( cr[0] == '`') { //color code at top if (cr[1] == '#') color = 13; if (cr[1] == '1') color = 1; if (cr[1] == '2') color = 2; if (cr[1] == '3') color = 3; if (cr[1] == '5') color = 5; if (cr[1] == '6') color = 6; if (cr[1] == '7') color = 7; if (cr[1] == '8') color = 8; if (cr[1] == '9') color = 9; if (cr[1] == '0') color = 10; if (cr[1] == '$') color = 14; if (cr[1] == '%') color = 15; //redink1 support for additional colors if (cr[1] == '@') color = 12; if (cr[1] == '!') color = 11; if (cr[1] == '4') color = 4; cr = &cr[2]; } //Msg("Final is %s.",cr); if (g_sprite[h].owner == 1000) { rcRect = rtRect32 (g_sprite[h].x,g_sprite[h].y,g_sprite[h].x+620,g_sprite[h].y+400); } else { rcRect = rtRect32 (g_sprite[h].x,g_sprite[h].y,g_sprite[h].x+150,g_sprite[h].y+150); if (g_sprite[h].x+150 > maxX) OffsetRect(&rcRect, ((g_sprite[h].x+150)-maxX) - (((g_sprite[h].x+150)-maxX) * 2), 0); if (rcRect.left < minX && rcRect.left >= 0) { OffsetRect(&rcRect, minX - rcRect.left, 0); } } } else { sprintf(crap, "%d", g_sprite[h].damage); cr = &crap[0]; if (g_sprite[h].brain_parm == 5000) color = 14; if (g_sprite[h].y < minX) g_sprite[h].y = minX; rcRect = rtRect32 (g_sprite[h].x,g_sprite[h].y,g_sprite[h].x+50 ,g_sprite[h].y+50); } /* if (g_dglos.bFadedDown || g_dglos.process_downcycle) color = 15; */ uint32 rgbColor = MAKE_RGBA(g_dglos.font_colors[color].red, g_dglos.font_colors[color].green, g_dglos.font_colors[color].blue, 255); uint32 bgColor = MAKE_RGBA(0,0,0,100); rtRect rTemp(rcRect); // SetTextColor(hdc,RGB(8,14,21)); if (g_sprite[h].owner == 1200) { GetApp()->GetFont(FONT_SMALL)->DrawWrapped(rTemp, cr, false, false, rgbColor, g_dglo.m_fontSize, false, bgColor); } else { if ( (cr[0] == ' ' && cr[1] == 0) || (cr[0] == ' ' && cr[1] == ' ' && cr[2] == 0) || (cr[0] == ' ' && cr[1] == ' ' && cr[2] == ' ' && cr[3] == 0) ) { //skip it, it's just blank, otherwise it will draw the bg which looks dumb } else { GetApp()->GetFont(FONT_SMALL)->DrawWrapped(rTemp, cr, true, false, rgbColor, g_dglo.m_fontSize, false , bgColor); } } OffsetRect(&rTemp,0,1); } void get_last_sprite(void) { for (int i = C_MAX_SPRITES_AT_ONCE - 1; i > 2; i--) { if (g_sprite[i].active) { g_dglos.last_sprite_created = i; // Msg("last sprite created is %d.", i); return; } } } bool DestroySound( void ) { /* uint32 idxKill; for( idxKill = 0; idxKill < max_sounds; idxKill++ ) { SoundDestroyEffect( idxKill ); } return true; */ return true; } /* DestroySound */ /* * SoundDestroyEffect * * Frees up resources associated with a sound effect */ bool SoundDestroyEffect( int sound ) { /* if(g_soundInfo[sound].sound) { delete g_soundInfo[sound].sound; g_soundInfo[sound].sound = NULL; } return true; */ return true; } #ifdef C_DINK_KEYBOARD_INPUT short GetKeyboard(int key) { // returns 0 if the key has been depressed, else returns 1 and sets key to code recd. return (GetAsyncKeyState(key) & 0x8000); } BOOL keypressed( void ) { for (int x=0; x<256; x++) { if (GetKeyboard(x) > 0) { return(TRUE); } } return(FALSE); } #endif void check_joystick(void) { for (int e2=1; e2 <=10; e2++) { sjoy.joybit[e2] = false; } sjoy.right = false; sjoy.left = false; sjoy.up = false; sjoy.down = false; sjoy.rightd = false; sjoy.leftd = false; sjoy.upd = false; sjoy.downd = false; for (int i=0; i < 7; i++) { if (g_dglo.m_dirInput[DINK_INPUT_BUTTON1+i]) sjoy.joybit[1+i] = true; } for (int x5=1; x5 <=10; x5++) sjoy.button[x5] = false; for (int x=1; x <=10; x++) { if (sjoy.joybit[x]) { if (sjoy.letgo[x] == true) { sjoy.button[x] = true; sjoy.letgo[x] = false; } } } if (g_dglo.m_dirInput[DINK_INPUT_LEFT]) sjoy.left = true; if (g_dglo.m_dirInput[DINK_INPUT_RIGHT]) sjoy.right = true; if (g_dglo.m_dirInput[DINK_INPUT_UP]) sjoy.up = true; if (g_dglo.m_dirInput[DINK_INPUT_DOWN]) sjoy.down = true; for (int x2=1; x2 <=10; x2++) { if (sjoy.joybit[x2]) sjoy.letgo[x2] = false; else sjoy.letgo[x2] = true; } if (sjoy.right) if (sjoy.rightold == true) { sjoy.rightd = true; sjoy.rightold = false; } if (sjoy.right) sjoy.rightold = false; else sjoy.rightold = true; if (sjoy.left) if (sjoy.leftold == true) { sjoy.leftd = true; sjoy.leftold = false; } if (sjoy.left) sjoy.leftold = false; else sjoy.leftold = true; if (sjoy.up) if (sjoy.upold == true) { sjoy.upd = true; sjoy.upold = false; } if (sjoy.up) sjoy.upold = false; else sjoy.upold = true; if (sjoy.down) if (sjoy.downold == true) { sjoy.downd = true; sjoy.downold = false; } if (sjoy.down) sjoy.downold = false; else sjoy.downold = true; if (g_dglos.g_wait_for_button.active) { //check for dirs if (sjoy.rightd) g_dglos.g_wait_for_button.button = 16; if (sjoy.leftd) g_dglos.g_wait_for_button.button = 14; if (sjoy.upd) g_dglos.g_wait_for_button.button = 18; if (sjoy.downd) g_dglos.g_wait_for_button.button = 12; sjoy.rightd = false; sjoy.downd = false; sjoy.upd = false; sjoy.leftd = false; //check buttons for (int ll=1; ll <= 10; ll++) { if (sjoy.button[ll]) { //button was pressed g_dglos.g_wait_for_button.button = ll; } sjoy.button[ll] = false; } if (g_dglos.g_wait_for_button.button != 0) { *presult = g_dglos.g_wait_for_button.button; g_dglos.g_wait_for_button.active = false; run_script(g_dglos.g_wait_for_button.script); } } for (int i=0; i < DINK_INPUT_COUNT; i++) { if (g_dglo.m_dirInputFinished[i]) { g_dglo.m_dirInput[i] = false; g_dglo.m_dirInputFinished[i] = false; } } } // ********* CHECK TO SEE IF THIS CORD IS ON A HARD SPOT ********* bool not_in_this_base(int seq, int base) { int realbase = (seq / 10) * 10; if (realbase != base) { return(true); } else { return(false); } } bool in_this_base(int seq, int base) { int realbase = (seq / 10) * 10; if (realbase == base) { // Msg("TRUE - Ok, realbase is %d, compared to the base, which is %d.", realbase, base); return(true); } else { // Msg("FALSE - Ok, realbase is %d, compared to the base, which is %d.", realbase, base); return(false); } } void automove (int j) { char kindx,kindy; int speedx = 0; int speedy = 0; if (g_sprite[j].mx != 0) { if (g_sprite[j].mx < 0) kindx = '-'; else kindx = '+'; if (kindx == '-') speedx = (g_sprite[j].mx - (g_sprite[j].mx * 2)); else speedx = g_sprite[j].mx; } else kindx = '0'; if (g_sprite[j].my != 0) { if (g_sprite[j].my < 0) kindy = '-'; else kindy = '+'; if (kindy == '-') speedy = (g_sprite[j].my - (g_sprite[j].my * 2)); else speedy = g_sprite[j].my; } else kindy = '0'; int speed = speedx; if (speedy > speedx) speed = speedy; if (speed > 0) move(j,speed,kindx,kindy); //move(j, 1, '+','+'); } int autoreverse(int j) { //Msg("reversing die %d",spr[j].dir); int r = ((rand() % 2)+1); if ( (g_sprite[j].dir == 1) || (g_sprite[j].dir == 2) ) { if (r == 1) return(8); if (r == 2) return(6); } if ( (g_sprite[j].dir == 3) || (g_sprite[j].dir == 6) ) { if (r == 1) return(2); if (r == 2) return(4); } if ( (g_sprite[j].dir == 9) || (g_sprite[j].dir == 8) ) { if (r == 1) return(2); if (r == 2) return(6); } if ( (g_sprite[j].dir == 7) || (g_sprite[j].dir == 4) ) { if (r == 1) return(8); if (r == 2) return(6); } return(0); } int autoreverse_diag(int j) { if (g_sprite[j].dir == 0) g_sprite[j].dir = 7; int r = ((rand() % 2)+1); if ( (g_sprite[j].dir == 1) || (g_sprite[j].dir == 3) ) { if (r == 1) return(9); if (r == 2) return(7); } if ( (g_sprite[j].dir == 3) || (g_sprite[j].dir == 6) ) { if (r == 1) return(7); if (r == 2) return(1); } if ( (g_sprite[j].dir == 9) || (g_sprite[j].dir == 8) ) { if (r == 1) return(1); if (r == 2) return(7); } if ( (g_sprite[j].dir == 7) || (g_sprite[j].dir == 4) ) { if (r == 1) return(3); if (r == 2) return(9); } #ifdef _DEBUG LogMsg("Auto Reverse Diag was sent a dir %d sprite, base %d walk.",g_sprite[j].dir, g_sprite[j].base_walk); #endif return(0); } void draw_damage(int h) { int crap2 = add_sprite(g_sprite[h].x,g_sprite[h].y,8,0,0); g_sprite[crap2].y -= g_dglos.g_picInfo[g_dglos.g_seq[g_sprite[h].pseq].frame[g_sprite[h].pframe]].yoffset; g_sprite[crap2].x -= g_dglos.g_picInfo[g_dglos.g_seq[g_sprite[h].pseq].frame[g_sprite[h].pframe]].xoffset; g_sprite[crap2].y -= g_dglos.g_picInfo[g_dglos.g_seq[g_sprite[h].pseq].frame[g_sprite[h].pframe]].box.bottom / 3; g_sprite[crap2].x += g_dglos.g_picInfo[g_dglos.g_seq[g_sprite[h].pseq].frame[g_sprite[h].pframe]].box.right / 5; g_sprite[crap2].speed = 1; g_sprite[crap2].hard = 1; g_sprite[crap2].brain_parm = h; g_sprite[crap2].my = -1; g_sprite[crap2].kill = 1000; g_sprite[crap2].dir = 8; g_sprite[crap2].damage = g_sprite[h].damage; } void add_kill_sprite(int h) { if ( (g_sprite[h].dir > 9) || (g_sprite[h].dir < 1) ) { LogMsg("Error: Changing sprites dir from %d (!?) to 3.", g_sprite[h].dir); g_sprite[h].dir = 3; } int dir = g_sprite[h].dir; int base = g_sprite[h].base_die; //Msg("Base die is %d", base); if (base == -1) { if (g_dglos.g_seq[g_sprite[h].base_walk+5].active != 0) { add_exp(g_sprite[h].exp, h); int crap2 = add_sprite(g_sprite[h].x,g_sprite[h].y,5,g_sprite[h].base_walk +5,1); g_sprite[crap2].speed = 0; g_sprite[crap2].seq = g_sprite[h].base_walk + 5; //redink1 added this so corpses are the same size g_sprite[crap2].size = g_sprite[h].size; return; } else { dir = 0; base = 164; } } if (g_dglos.g_seq[base+dir].active == false) { if (dir == 1) dir = 9; else if (dir == 3) dir = 7; else if (dir == 7) dir = 3; else if (dir == 9) dir = 1; else if (dir == 4) dir = 6; else if (dir == 6) dir = 4; else if (dir == 8) dir = 2; else if (dir == 2) dir = 8; } if (g_dglos.g_seq[base+dir].active == false) { LogMsg("Can't make a death sprite for dir %d!", base+dir); } int crap2 = add_sprite(g_sprite[h].x,g_sprite[h].y,5,base +dir,1); g_sprite[crap2].speed = 0; g_sprite[crap2].base_walk = 0; g_sprite[crap2].seq = base + dir; if (base == 164) g_sprite[crap2].brain = 7; g_sprite[crap2].size = g_sprite[h].size; add_exp(g_sprite[h].exp, h); } void done_moving(int h) { g_sprite[h].move_active = false; g_sprite[h].move_nohard = false; if (g_sprite[h].move_script > 0) { // Msg("mover running script %d..", spr[h].move_script); run_script(g_sprite[h].move_script); } } int get_distance_and_dir(int h, int h1, int *dir) { if ( g_dglos.smooth_follow ) { unsigned int x_diff( abs( g_sprite[h].x - g_sprite[h1].x ) ); unsigned int y_diff( abs( g_sprite[h].y - g_sprite[h1].y ) ); if ( g_sprite[h].x < g_sprite[h1].x ) { if ( g_sprite[h].y < g_sprite[h1].y ) { // 6, 3, 2 if ( y_diff * 4 < x_diff ) { *dir = 6; } else if ( x_diff * 4 < y_diff ) { *dir = 2; } else { *dir = 3; } } else if ( g_sprite[h].y > g_sprite[h1].y ) { // 4, 9, 8 if ( y_diff * 4 < x_diff ) { *dir = 6; } else if ( x_diff * 4 < y_diff ) { *dir = 8; } else { *dir = 9; } } else { *dir = 6; } } else if ( g_sprite[h].x > g_sprite[h1].x ) { if ( g_sprite[h].y < g_sprite[h1].y ) { // 4, 1, 2 if ( y_diff * 4 < x_diff ) { *dir = 4; } else if ( x_diff * 4 < y_diff ) { *dir = 2; } else { *dir = 1; } } else if ( g_sprite[h].y > g_sprite[h1].y ) { // 4, 7, 8 if ( y_diff * 4 < x_diff ) { *dir = 4; } else if ( x_diff * 4 < y_diff ) { *dir = 8; } else { *dir = 7; } } else { *dir = 4; } } else { if ( g_sprite[h].y < g_sprite[h1].y ) { *dir = 2; } else if ( g_sprite[h].y > g_sprite[h1].y ) { *dir = 8; } } return max( x_diff, y_diff ); } int distancex = 5000; int distancey = 5000; int dirx = *dir; int diry = *dir; if (g_sprite[h].x > g_sprite[h1].x) if ((g_sprite[h].x - g_sprite[h1].x) < distancex) { distancex = (g_sprite[h].x - g_sprite[h1].x); dirx = 4; } if (g_sprite[h].x <= g_sprite[h1].x) if ((g_sprite[h1].x - g_sprite[h].x) < distancex) { distancex = (g_sprite[h1].x - g_sprite[h].x); dirx = 6; } if (g_sprite[h].y > g_sprite[h1].y) if ((g_sprite[h].y - g_sprite[h1].y) < distancey) { distancey = (g_sprite[h].y - g_sprite[h1].y); diry = 8; } if (g_sprite[h].y <= g_sprite[h1].y) if ((g_sprite[h1].y - g_sprite[h].y) < distancey) { distancey = (g_sprite[h1].y - g_sprite[h].y); diry = 2; } if (distancex > distancey) { *dir = dirx; return(distancex); } else { *dir = diry; return(distancey); } } void process_follow(int h) { int hx, hy; if (g_sprite[h].follow > 299) { LogMsg("ERROR: Sprite %d cannot 'follow' sprite %d??",h,g_sprite[h].follow); return; } if (g_sprite[g_sprite[h].follow].active == false) { LogMsg("Killing follow"); g_sprite[h].follow = 0; return; } hx = g_sprite[g_sprite[h].follow].x; hy = g_sprite[g_sprite[h].follow].y; int dir; int distance = get_distance_and_dir(h, g_sprite[h].follow, &dir); if (distance < 40) return; changedir(dir,h,g_sprite[h].base_walk); automove(h); } void process_target(int h) { int hx, hy; if (g_sprite[h].target > 299) { LogMsg("ERROR: Sprite %d cannot 'target' sprite %d??",h,g_sprite[h].follow); return; } if (g_sprite[g_sprite[h].target].active == false) { LogMsg("Killing target"); g_sprite[h].target = 0; return; } hx = g_sprite[g_sprite[h].target].x; hy = g_sprite[g_sprite[h].target].y; int dir; int distance = get_distance_and_dir(h, g_sprite[h].target, &dir); if (distance < g_sprite[h].distance) return; changedir(dir,h,g_sprite[h].base_walk); automove(h); } bool check_for_kill_script(int i) { if (g_sprite[i].script > 0) { //if ( (spr[i].brain == 0) | (spr[i].brain == 5) | (spr[i].brain == 6) | (spr[i].brain == 7)) if (locate(g_sprite[i].script, "DIE")) run_script(g_sprite[i].script); return(true); } return(false); } bool check_for_duck_script(int i) { if (g_sprite[i].script > 0) { //if ( (spr[i].brain == 0) | (spr[i].brain == 5) | (spr[i].brain == 6) | (spr[i].brain == 7)) if (locate(g_sprite[i].script, "DUCKDIE")) run_script(g_sprite[i].script); return(true); } return(false); } void process_move(int h) { // Msg("Proccesing sprite %d, dir %d (script is %d)", h, spr[h].dir, spr[h].move_script); if ((g_sprite[h].move_dir == 4) | (g_sprite[h].move_dir == 1) | (g_sprite[h].move_dir == 7) ) { if (g_sprite[h].x <= g_sprite[h].move_num) { //done moving done_moving(h); return; } changedir(g_sprite[h].move_dir,h,g_sprite[h].base_walk); automove(h); } if ( (g_sprite[h].move_dir == 6) | (g_sprite[h].move_dir == 9) | (g_sprite[h].move_dir == 3)) { if (g_sprite[h].x >= g_sprite[h].move_num) { //done moving done_moving(h); return; } changedir(g_sprite[h].move_dir,h,g_sprite[h].base_walk); automove(h); } if (g_sprite[h].move_dir == 2) { if (g_sprite[h].y >= g_sprite[h].move_num) { //done moving done_moving(h); return; } changedir(g_sprite[h].move_dir,h,g_sprite[h].base_walk); automove(h); } if (g_sprite[h].move_dir == 8) { if (g_sprite[h].y <= g_sprite[h].move_num) { //done moving done_moving(h); return; } changedir(g_sprite[h].move_dir,h,g_sprite[h].base_walk); automove(h); } } void duck_brain(int h) { int hold; if ( (g_sprite[h].damage > 0) && (in_this_base(g_sprite[h].pseq, 110) ) ) { check_for_duck_script(h); //hit a dead duck int crap2 = add_sprite(g_sprite[h].x,g_sprite[h].y,7,164,1); g_sprite[crap2].speed = 0; g_sprite[crap2].base_walk = 0; g_sprite[crap2].seq = 164; draw_damage(h); g_sprite[h].damage = 0; add_exp(g_sprite[h].exp, h); kill_sprite_all(h); return; } if ( (g_sprite[h].damage > 0) && (in_this_base(g_sprite[h].pseq, g_sprite[h].base_walk) ) ) { draw_damage(h); add_exp(g_sprite[h].exp, h); g_sprite[h].damage = 0; //lets kill the duck here, ha. check_for_kill_script(h); g_sprite[h].follow = 0; int crap = add_sprite(g_sprite[h].x,g_sprite[h].y,5,1,1); g_sprite[crap].speed = 0; g_sprite[crap].base_walk = 0; g_sprite[crap].size = g_sprite[h].size; g_sprite[crap].speed = ((rand() % 3)+1); g_sprite[h].base_walk = 110; g_sprite[h].speed = 1; g_sprite[h].timer = 0; g_sprite[h].wait = 0; g_sprite[h].frame = 0; if (g_sprite[h].dir == 0) g_sprite[h].dir = 1; if (g_sprite[h].dir == 4) g_sprite[h].dir = 7; if (g_sprite[h].dir == 6) g_sprite[h].dir = 3; changedir(g_sprite[h].dir,h,g_sprite[h].base_walk); g_sprite[crap].dir = g_sprite[h].dir; g_sprite[crap].base_walk = 120; changedir(g_sprite[crap].dir,crap,g_sprite[crap].base_walk); automove(h); return; } if (g_sprite[h].move_active) { process_move(h); return; } if (g_sprite[h].freeze) { return; } if (g_sprite[h].follow > 0) { process_follow(h); return; } if (g_sprite[h].base_walk == 110) { if ( (rand() % 100)+1 == 1) random_blood(g_sprite[h].x, g_sprite[h].y-18, h); goto walk; } if (g_sprite[h].seq == 0 ) { if (((rand() % 12)+1) == 1 ) { hold = ((rand() % 9)+1); if ((hold != 2) && (hold != 8) && (hold != 5)) { //Msg("random dir change started.. %d", hold); changedir(hold,h,g_sprite[h].base_walk); } else { int junk = g_sprite[h].size; if (junk >= 100) junk = 18000 - (junk * 50); if (junk < 100) junk = 16000 + (junk * 100); SoundPlayEffect( 1,junk, 800,h ,0); g_sprite[h].mx = 0; g_sprite[h].my = 0; g_sprite[h].wait = g_dglos.g_dinkTick + (rand() % 300)+200; } return; } if ((g_sprite[h].mx != 0) || (g_sprite[h].my != 0)) { g_sprite[h].seq = g_sprite[h].seq_orig; } } walk: if (g_sprite[h].y > C_DINK_ORIGINAL_GAME_AREA_Y) { changedir(9,h,g_sprite[h].base_walk); } if (g_sprite[h].x > g_gameAreaRightBarStartX-30) { changedir(7,h,g_sprite[h].base_walk); } if (g_sprite[h].y < 10) { changedir(1,h,g_sprite[h].base_walk); } if (g_sprite[h].x < 30) { changedir(3,h,g_sprite[h].base_walk); } // Msg("Duck dir is %d, seq is %d.", spr[h].dir, spr[h].seq); automove(h); if (check_if_move_is_legal(h) != 0) { if (g_sprite[h].dir != 0) changedir(autoreverse_diag(h),h,g_sprite[h].base_walk); } } // end duck_brain void change_dir_to_diag( int32 *dir) { if (*dir == 8) *dir = 7; if (*dir == 4) *dir = 1; if (*dir == 2) *dir = 3; if (*dir == 6) *dir = 9; } void pill_brain(int h) { int hold; if (g_sprite[h].damage > 0) { //got hit if (g_sprite[h].hitpoints > 0) { draw_damage(h); if (g_sprite[h].damage > g_sprite[h].hitpoints) g_sprite[h].damage = g_sprite[h].hitpoints; g_sprite[h].hitpoints -= g_sprite[h].damage; if (g_sprite[h].hitpoints < 1) { //they killed it check_for_kill_script(h); if (g_sprite[h].brain == 9) { if (g_sprite[h].dir == 0) g_sprite[h].dir = 3; change_dir_to_diag(&g_sprite[h].dir); add_kill_sprite(h); g_sprite[h].active = false; } return; } } g_sprite[h].damage = 0; } if (g_sprite[h].move_active) { process_move(h); return; } if (g_sprite[h].freeze) return; if (g_sprite[h].follow > 0) { process_follow(h); } if (g_sprite[h].target != 0) { if (in_this_base(g_sprite[h].seq, g_sprite[h].base_attack)) { //still attacking return; } int dir; if (g_sprite[h].distance == 0) g_sprite[h].distance = 5; int distance = get_distance_and_dir(h, g_sprite[h].target, &dir); if (distance < g_sprite[h].distance) if (g_sprite[h].attack_wait < g_dglos.g_dinkTick) { // Msg("base attack is %d.",spr[h].base_attack); if (g_sprite[h].base_attack != -1) { int attackdir; bool old_smooth_follow = g_dglos.smooth_follow; g_dglos.smooth_follow = false; get_distance_and_dir(h, g_sprite[h].target, &attackdir); g_dglos.smooth_follow = old_smooth_follow; //Msg("attacking with %d..", spr[h].base_attack+dir); g_sprite[h].dir = attackdir; g_sprite[h].seq = g_sprite[h].base_attack+g_sprite[h].dir; g_sprite[h].frame = 0; if (g_sprite[h].script != 0) { if (locate(g_sprite[h].script, "ATTACK")) run_script(g_sprite[h].script); } else g_sprite[h].move_wait = g_dglos.g_dinkTick + ((rand() % 300)+10);; return; } } if (g_sprite[h].move_wait < g_dglos.g_dinkTick) { process_target(h); g_sprite[h].move_wait = g_dglos.g_dinkTick + 200; } else { goto walk_normal; } return; } walk_normal: if (g_sprite[h].base_walk != -1) { if ( g_sprite[h].seq == 0) goto recal; } if (( g_sprite[h].seq == 0) && (g_sprite[h].move_wait < g_dglos.g_dinkTick)) { recal: if (((rand() % 12)+1) == 1 ) { hold = ((rand() % 9)+1); if ( (hold != 4) && (hold != 6) && (hold != 2) && (hold != 8) && (hold != 5)) { changedir(hold,h,g_sprite[h].base_walk); g_sprite[h].move_wait = g_dglos.g_dinkTick +((rand() % 2000)+200); } } else { //keep going the same way if (in_this_base(g_sprite[h].seq_orig, g_sprite[h].base_attack)) goto recal; g_sprite[h].seq = g_sprite[h].seq_orig; if (g_sprite[h].seq_orig == 0) goto recal; } } if (g_sprite[h].y > (C_DINK_ORIGINAL_GAME_AREA_Y - 15)) { changedir(9,h,g_sprite[h].base_walk); } if (g_sprite[h].x > (g_gameAreaRightBarStartX - 15)) { changedir(1,h,g_sprite[h].base_walk); } if (g_sprite[h].y < 18) { changedir(1,h,g_sprite[h].base_walk); } if (g_sprite[h].x < 18) { changedir(3,h,g_sprite[h].base_walk); } automove(h); if (check_if_move_is_legal(h) != 0) { g_sprite[h].move_wait = g_dglos.g_dinkTick + 400; changedir(autoreverse_diag(h),h,g_sprite[h].base_walk); } } void find_action(int h) { g_sprite[h].action = (rand() % 2)+1; if (g_sprite[h].action == 1) { //sit and think g_sprite[h].move_wait = g_dglos.g_dinkTick +((rand() % 3000)+400); if (g_sprite[h].base_walk != -1) { int dir = (rand() % 4)+1; g_sprite[h].pframe = 1; if (dir == 1) g_sprite[h].pseq = g_sprite[h].base_walk+1; if (dir == 2) g_sprite[h].pseq = g_sprite[h].base_walk+3; if (dir == 3) g_sprite[h].pseq = g_sprite[h].base_walk+7; if (dir == 4) g_sprite[h].pseq = g_sprite[h].base_walk+9; } return; } if (g_sprite[h].action == 2) { //move g_sprite[h].move_wait = g_dglos.g_dinkTick +((rand() % 3000)+500); int dir = (rand() % 4)+1; g_sprite[h].pframe = 1; if (dir == 1) changedir(1,h,g_sprite[h].base_walk); if (dir == 2) changedir(3,h,g_sprite[h].base_walk); if (dir == 3) changedir(7,h,g_sprite[h].base_walk); if (dir == 4) changedir(9,h,g_sprite[h].base_walk); return; } LogMsg("Internal error: Brain 16, unknown action."); } void people_brain(int h) { if (g_sprite[h].damage > 0) { //got hit if (g_sprite[h].hitpoints > 0) { draw_damage(h); if (g_sprite[h].damage > g_sprite[h].hitpoints) g_sprite[h].damage = g_sprite[h].hitpoints; g_sprite[h].hitpoints -= g_sprite[h].damage; if (g_sprite[h].hitpoints < 1) { //they killed it check_for_kill_script(h); if (g_sprite[h].brain == 16) { if (g_sprite[h].dir == 0) g_sprite[h].dir = 3; g_sprite[h].brain = 0; change_dir_to_diag(&g_sprite[h].dir); add_kill_sprite(h); g_sprite[h].active = false; } return; } } g_sprite[h].damage = 0; } if (g_sprite[h].move_active) { process_move(h); return; } if (g_sprite[h].freeze) return; if (g_sprite[h].follow > 0) { process_follow(h); return; } if ((g_sprite[h].move_wait < g_dglos.g_dinkTick) && (g_sprite[h].seq == 0)) { g_sprite[h].action = 0; } if (g_sprite[h].action == 0) find_action(h); if (g_sprite[h].action != 2) { g_sprite[h].seq = 0; return; } if (g_sprite[h].seq_orig != 0) if (g_sprite[h].seq == 0) g_sprite[h].seq = g_sprite[h].seq_orig; if (g_sprite[h].y > C_DINK_ORIGINAL_GAME_AREA_Y) { if ( ((rand() % 2)+1) == 1) changedir(9,h,g_sprite[h].base_walk); else changedir(7,h,g_sprite[h].base_walk); } if (g_sprite[h].x > g_gameAreaRightBarStartX) { if ( ((rand() % 2)+1) == 1) changedir(1,h,g_sprite[h].base_walk); else changedir(7,h,g_sprite[h].base_walk); } if (g_sprite[h].y < 20) { if ( ((rand() % 2)+1) == 1) changedir(1,h,g_sprite[h].base_walk); else changedir(3,h,g_sprite[h].base_walk); } if (g_sprite[h].x < 30) { if ( ((rand() % 2)+1) == 1) changedir(3,h,g_sprite[h].base_walk); else changedir(9,h,g_sprite[h].base_walk); } automove(h); if (check_if_move_is_legal(h) != 0) { if ((rand() % 3) == 2) { changedir(autoreverse_diag(h),h,g_sprite[h].base_walk); } else { g_sprite[h].move_wait = 0; g_sprite[h].pframe = 1; g_sprite[h].seq = 0; } } } void no_brain(int h) { if (g_sprite[h].move_active) { process_move(h); return; } if (g_sprite[h].freeze) return; if (g_sprite[h].follow > 0) { process_follow(h); return; } } void shadow_brain(int h) { if (g_sprite[g_sprite[h].brain_parm].active == false) { g_sprite[h].active = false; return; } g_sprite[h].x = g_sprite[g_sprite[h].brain_parm].x; g_sprite[h].y = g_sprite[g_sprite[h].brain_parm].y; g_sprite[h].size = g_sprite[g_sprite[h].brain_parm].size; if (g_sprite[h].seq == 0) if (g_sprite[h].seq_orig != 0) g_sprite[h].seq = g_sprite[h].seq_orig; } void dragon_brain(int h) { int hold; if (g_sprite[h].damage > 0) { //got hit if (g_sprite[h].hitpoints > 0) { draw_damage(h); if (g_sprite[h].damage > g_sprite[h].hitpoints) g_sprite[h].damage = g_sprite[h].hitpoints; g_sprite[h].hitpoints -= g_sprite[h].damage; if (g_sprite[h].hitpoints < 1) { //they killed it check_for_kill_script(h); if (g_sprite[h].brain == 10) { add_kill_sprite(h); g_sprite[h].active = false; } return; } } g_sprite[h].damage = 0; } if (g_sprite[h].move_active) { process_move(h); return; } if (g_sprite[h].freeze) return; if (g_sprite[h].follow > 0) { process_follow(h); return; } if (g_sprite[h].target != 0) if (g_sprite[h].attack_wait < g_dglos.g_dinkTick) { if (g_sprite[h].script != 0) { if (locate(g_sprite[h].script, "ATTACK")) run_script(g_sprite[h].script); } } if (g_sprite[h].seq == 0) { recal: if (((rand() % 12)+1) == 1 ) { hold = ((rand() % 9)+1); if ( (hold != 1) && (hold != 3) && (hold != 7) && (hold != 9) && (hold != 5)) { changedir(hold,h,g_sprite[h].base_walk); } } else { //keep going the same way g_sprite[h].seq = g_sprite[h].seq_orig; if (g_sprite[h].seq_orig == 0) goto recal; } } if (g_sprite[h].y > C_DINK_ORIGINAL_GAME_AREA_Y) { changedir(8,h,g_sprite[h].base_walk); } if (g_sprite[h].x > C_DINK_SCREENSIZE_X) { changedir(4,h,g_sprite[h].base_walk); } if (g_sprite[h].y < 0) { changedir(2,h,g_sprite[h].base_walk); } if (g_sprite[h].x < 0) { changedir(6,h,g_sprite[h].base_walk); } automove(h); if (check_if_move_is_legal(h) != 0) { int mydir = autoreverse(h); // Msg("Real dir now is %d, autoresver changed to %d.",spr[h].dir, mydir); changedir(mydir,h,g_sprite[h].base_walk); #ifdef _DEBUG LogMsg("real dir changed to %d",g_sprite[h].dir); #endif } } void pig_brain(int h) { int hold; if (g_sprite[h].move_active) { process_move(h); return; } if ( (g_sprite[h].damage > 0) ) { draw_damage(h); g_sprite[h].hitpoints -= g_sprite[h].damage; g_sprite[h].damage = 0; if (g_sprite[h].hitpoints < 1) { add_exp(g_sprite[h].exp, h); g_sprite[h].damage = 0; //lets kill the duck here, ha. check_for_kill_script(h); g_sprite[h].speed = 0; g_sprite[h].base_walk = -1; g_sprite[h].seq = 164; g_sprite[h].brain = 7; } return; } if (g_sprite[h].freeze) return; if (g_sprite[h].seq == 0 ) { if (((rand() % 12)+1) == 1 ) { hold = ((rand() % 9)+1); if ( (hold != 4) && (hold != 6) && (hold != 2) && (hold != 8) && (hold != 5)) { changedir(hold,h,g_sprite[h].base_walk); } else { int junk = g_sprite[h].size; if (junk >= 100) junk = 18000 - (junk * 50); if (junk < 100) junk = 16000 + (junk * 100); hold = ((rand() % 4)+1); if (!playing(g_sprite[h].last_sound)) g_sprite[h].last_sound = 0; if (g_sprite[h].last_sound == 0) { if (hold == 1) g_sprite[h].last_sound = SoundPlayEffect( 2,junk, 800 ,h,0); if (hold == 2) g_sprite[h].last_sound = SoundPlayEffect( 3,junk, 800,h ,0); if (hold == 3) g_sprite[h].last_sound = SoundPlayEffect( 4,junk, 800 ,h,0); if (hold == 4) g_sprite[h].last_sound = SoundPlayEffect( 5,junk, 800,h,0 ); } g_sprite[h].mx = 0; g_sprite[h].my = 0; g_sprite[h].wait = g_dglos.g_dinkTick + (rand() % 300)+200; } } else { if ((g_sprite[h].mx != 0) || (g_sprite[h].my != 0)) { g_sprite[h].seq = g_sprite[h].seq_orig; } } } if (g_sprite[h].y > (C_DINK_ORIGINAL_GAME_AREA_Y-g_dglos.g_picInfo[getpic(h)].box.bottom / 4)) { changedir(9,h,g_sprite[h].base_walk); } if (g_sprite[h].x > (C_DINK_SCREENSIZE_X-g_dglos.g_picInfo[getpic(h)].box.right-10)) { changedir(1,h,g_sprite[h].base_walk); } if (g_sprite[h].y < 10) { changedir(1,h,g_sprite[h].base_walk); } if (g_sprite[h].x < 10) { changedir(3,h,g_sprite[h].base_walk); } automove(h); if (check_if_move_is_legal(h) != 0) { changedir(autoreverse_diag(h),h,g_sprite[h].base_walk); } } // end duck_brain int check_if_move_is_legal(int u) { //redink1 removed so move_nohard is active for all movements, not just active moves. //if (spr[u].move_active) if (g_sprite[u].move_nohard == 1) return(0); if (u == 1) if (in_this_base(g_sprite[u].seq, g_dglos.mDinkBasePush)) return(0); if (u == 1) if (!no_cheat) if (debug_mode) return(0); int hardness = 0; if (g_sprite[u].moveman > 0) { for (int i=1; i <= g_sprite[u].moveman; i++) { hardness = get_hard(u,g_sprite[u].lpx[i]-20 , g_sprite[u].lpy[i]); if (hardness == 2) if (g_sprite[u].flying) { g_sprite[u].moveman = 0; // redink1 changed so flying works properly return(0); } if (hardness > 0) { g_sprite[u].x = g_sprite[u].lpx[i-1]; g_sprite[u].y = g_sprite[u].lpy[i-1]; g_sprite[u].moveman = 0; if (g_dglos.g_pushingEnabled) if (u == 1) if (hardness != 2) if (g_dglos.g_playerInfo.push_active == false) { if ( (g_sprite[u].dir == 2) | (g_sprite[u].dir == 4) | (g_sprite[u].dir == 6) | (g_sprite[u].dir == 8) ) { //he (dink) is definatly pushing on something g_dglos.g_playerInfo.push_active = true; g_dglos.g_playerInfo.push_dir = g_sprite[u].dir; g_dglos.g_playerInfo.push_timer = g_dglos.g_dinkTick; } } else { if (g_dglos.g_playerInfo.push_dir != g_sprite[1].dir) g_dglos.g_playerInfo.push_active = false; } return(hardness); } } } if (u == 1) g_dglos.g_playerInfo.push_active = false; return(0); } void move(int u, int amount, char kind, char kindy) { int mx = 0; int my = 0; bool clearx; bool cleary; clearx = false; cleary = false; for (int i=1; i <= amount; i++) { g_sprite[u].moveman++; if (mx >= g_sprite[u].mx) clearx = true; if (my >= g_sprite[u].my) clearx = true; if ((clearx) && (cleary)) { mx = 0; my = 0; clearx = false; cleary = false; } if (kind == '+') { if (mx < g_sprite[u].mx) g_sprite[u].x++; mx++; } if (kind == '-') { if (mx < (g_sprite[u].mx - (g_sprite[u].mx * 2))) g_sprite[u].x--; mx++; } if (kindy == '+') { if (my < g_sprite[u].my) g_sprite[u].y++; my++; } if (kindy == '-') { if (my < (g_sprite[u].my - (g_sprite[u].my * 2))) g_sprite[u].y--; my++; } g_sprite[u].lpx[g_sprite[u].moveman] = g_sprite[u].x; g_sprite[u].lpy[g_sprite[u].moveman] = g_sprite[u].y; } } void bounce_brain(int h) { if (g_sprite[h].y > (C_DINK_ORIGINAL_GAME_AREA_Y-g_dglos.g_picInfo[getpic(h)].box.bottom)) { g_sprite[h].my -= (g_sprite[h].my * 2); } if (g_sprite[h].x > (C_DINK_SCREENSIZE_X-g_dglos.g_picInfo[getpic(h)].box.right)) { g_sprite[h].mx -= (g_sprite[h].mx * 2); } if (g_sprite[h].y < 0) { g_sprite[h].my -= (g_sprite[h].my * 2); } if (g_sprite[h].x < 0) { g_sprite[h].mx -= (g_sprite[h].mx * 2); } g_sprite[h].x += g_sprite[h].mx; g_sprite[h].y += g_sprite[h].my; } //end bounce brain void CheckTransitionSurface() { if (!g_transitionSurf.IsLoaded()) { g_transitionSurf.SetUsesAlpha(false); g_transitionSurf.InitBlankSurface(GetPrimaryGLX(), GetPrimaryGLY()); g_transitionSurf.SetSmoothing(false); g_transitionSurf.SetBlendingMode(SurfaceAnim::BLENDING_PREMULTIPLIED_ALPHA); } } void UpdateFrameWithoutTransitionAndThinking() { SetOrthoRenderSize(g_dglo.m_orthoRenderRect.right, g_dglo.m_orthoRenderRect.GetHeight(), -g_dglo.m_orthoRenderRect.left, -g_dglo.m_orthoRenderRect.top); GetBaseApp()->SetGameTickPause(true); //don't let logic actually happen in here rtRect32 rcRect; rcRect.left = 0; rcRect.top = 0; rcRect.right = C_DINK_SCREENSIZE_X; rcRect.bottom = C_DINK_SCREENSIZE_Y; //Blit from Two, which holds the base scene. lpDDSBack->BltFast( 0, 0, lpDDSBackGround, &rcRect, DDBLTFAST_NOCOLORKEY); g_dglo.m_bgSpriteMan.Render(lpDDSBack); //blit sprites that have been shoved into the bg, too slow to actually add them, so we fake it until the screen is rebuilt //render sprites int h= 0; for (int j = 1; j < C_MAX_SPRITES_AT_ONCE; j++) { if (g_dglos.plane_process) h = g_spriteRank[j]; else h = j; //Msg( "Ok, rank %d is %d", j,h); if (h > 0) { ThinkSprite(h, g_bTransitionActive || g_dglos.g_stopEntireGame == 1); } } GetBaseApp()->SetGameTickPause(false); RemoveOrthoRenderSize(); } void StartScreenScrollTransition(int direction) { //this is where we grab a screenshot of the current pic before scrolling to the next screen rtRect32 rcRect; if (no_transition) { //g_bInitiateScreenMove = true; return; } CheckTransitionSurface(); //remember this for later //remove the aspect ratio hack glMatrixMode(GL_MODELVIEW); glPopMatrix(); UpdateFrameWithoutTransitionAndThinking(); g_transitionSurf.CopyFromScreen(); ApplyAspectRatioGLMatrix(); if (g_dglo.GetActiveView() != DinkGlobals::VIEW_ZOOMED) { //clear background if needed glClearColor(0, 0, 0, 1); glClear(GL_COLOR_BUFFER_BIT); } //redraw it the correct way, otherwise we can see a flash UpdateFrameWithoutTransitionAndThinking(); g_bInitiateScreenMove = true; g_bTransitionActive = true; g_dglo.m_transitionTimer = 0; //look at your numpad.., that's the dir we're going //here we're set an offset needed for where we START FROM for the animation. When the anim is done, this will be applied 0% switch(direction) { case 4: g_dglo.m_transitionOffsetNative = CL_Vec2f((int32)-g_dglo.m_nativeGameArea.GetWidth(), 0); g_dglo.m_transitionOffset = CL_Vec2f((int32)-g_dglo.m_gameArea.GetWidth(), 0); break; case 6: g_dglo.m_transitionOffsetNative = CL_Vec2f((int32)g_dglo.m_nativeGameArea.GetWidth(), 0); g_dglo.m_transitionOffset = CL_Vec2f((int32)g_dglo.m_gameArea.GetWidth(), 0); break; case 8: g_dglo.m_transitionOffsetNative = CL_Vec2f(0, -g_dglo.m_nativeGameArea.GetHeight()); g_dglo.m_transitionOffset = CL_Vec2f(0, -g_dglo.m_gameArea.GetHeight()); break; case 2: g_dglo.m_transitionOffsetNative = CL_Vec2f(0, (int32)g_dglo.m_nativeGameArea.GetHeight()); g_dglo.m_transitionOffset = CL_Vec2f(0, (int32)g_dglo.m_gameArea.GetHeight()); break; default: assert(!"er"); } } void ProcessTransition(void) { if (!g_bTransitionActive) return; g_dglo.m_transitionProgress = float(GetBaseApp()->GetGameTick()-g_dglo.m_transitionTimer) / C_DINK_SCREEN_TRANSITION_TIME_MS; if (g_dglo.m_transitionTimer == 0) { g_dglo.m_transitionProgress = 0; } float inverseProg = 1.0f - g_dglo.m_transitionProgress; if (g_dglo.m_transitionProgress >= 1) { g_bTransitionActive = false; g_bInitiateScreenMove = 0; g_dglo.m_transitionOffset = CL_Vec2f(0,0); g_dglo.m_transitionTimer = 0; } //float offsetX = 0.5f; float fTemp = inverseProg; //fTemp = 1.0f; glTranslatef((g_dglo.m_transitionOffset.x*fTemp),(g_dglo.m_transitionOffset.y*fTemp), 0); //LogMsg("Trans: %.2f", g_dglo.m_transitionProgress); //glScalef(G_TRANSITION_SCALE_TRICK,G_TRANSITION_SCALE_TRICK,1); } void EndProcessTransition() { if (!g_bTransitionActive) return; float inverseProg = 1.0f - g_dglo.m_transitionProgress; //glScalef(1/G_TRANSITION_SCALE_TRICK,1/G_TRANSITION_SCALE_TRICK,1); glTranslatef((-g_dglo.m_transitionOffset.x*inverseProg), (- ( (g_dglo.m_transitionOffset.y*inverseProg))), 0); }; void BlitSecondTransitionScreen() { if (g_bTransitionActive) { CheckTransitionSurface(); glMatrixMode(GL_MODELVIEW); glPushMatrix(); float offsetX = g_dglo.m_centeringOffset.x*(1 - ((float)GetFakePrimaryScreenSizeX() / (float)C_DINK_SCREENSIZE_X)); float offsetY = g_dglo.m_centeringOffset.y*(1 - ((float)GetFakePrimaryScreenSizeY() / (float)C_DINK_SCREENSIZE_Y)); //for some reason, after doing the aspect ratio scale trick, I need to also move it over a bit for this second blit to line up //glTranslatef(offsetX, //Let me write a long explanation of why these numbers are used. It's be... sorry, uhh.. phone call glTranslatef(-offsetX, -offsetY, 0); rtRectf dstRect = g_dglo.m_nativeGameArea; rtRectf dstOffset = rtRectf(0.5f,0.5f,-0.5f,-0.5f); /* //old code for when we manually rotated the screen, these days we let iOS do it, it's not a horrible performance penalty anymore if (GetPrimaryGLX() < GetPrimaryGLY() && GetEmulatedPlatformID() != PLATFORM_ID_WINDOWS) { swap(dstRect.left, dstRect.top); swap(dstRect.right, dstRect.bottom); rtRectf srcRect = ConvertFakeScreenRectToReal(dstRect); //CHECK the fakescreen stuff.. if (GetOrientation() == ORIENTATION_LANDSCAPE_LEFT) { glTranslatef((-g_dglo.m_transitionOffsetNative.x*g_dglo.m_transitionProgress), (g_dglo.m_nativeGameArea.GetHeight()-g_dglo.m_transitionOffsetNative.y*g_dglo.m_transitionProgress),0); glRotatef(-90, 0, 0, 1); srcRect.AdjustPosition(GetScreenSizeYf()-g_dglo.m_nativeGameArea.GetHeight(), 0); g_transitionSurf.BlitEx(dstRect, srcRect); } else { glTranslatef( ( ( g_dglo.m_nativeGameArea.left*2+g_dglo.m_nativeGameArea.GetWidth())-g_dglo.m_transitionOffsetNative.x*g_dglo.m_transitionProgress), ( (g_dglo.m_nativeGameArea.top) -g_dglo.m_transitionOffsetNative.y*g_dglo.m_transitionProgress ),0); glRotatef(90, 0, 0, 1); g_transitionSurf.BlitEx(dstRect, srcRect); } } else \*/ { dstRect.AdjustPosition( ( -g_dglo.m_transitionOffsetNative.x*g_dglo.m_transitionProgress), ( -g_dglo.m_transitionOffsetNative.y*g_dglo.m_transitionProgress)); //dstRect.AdjustPosition(-g_dglo.m_centeringOffset.x*g_dglo.m_transitionProgress, -g_dglo.m_centeringOffset.y*g_dglo.m_transitionProgress); rtRectf srcRect = ConvertFakeScreenRectToReal(g_dglo.m_nativeGameArea); // LogMsg("Dest rect: %s",PrintRect(dstRect)); g_transitionSurf.BlitEx(dstRect, srcRect); } //g_globalBatcher.Flush(); if (!g_onePixelSurf.IsLoaded()) { g_onePixelSurf.InitBlankSurface(1, 1); g_onePixelSurf.FillColor(glColorBytes(255, 255, 255, 255)); } if (g_dglo.GetActiveView() != DinkGlobals::VIEW_ZOOMED) { static uint32 blackBarsColor = MAKE_RGBA(0, 0, 0, 255); g_onePixelSurf.BlitScaled(g_dglo.m_nativeGameArea.left, 0, CL_Vec2f(5000, 5000), ALIGNMENT_RIGHT_CENTER, blackBarsColor); g_onePixelSurf.BlitScaled(g_dglo.m_nativeGameArea.right, 0, CL_Vec2f(5000, 5000), ALIGNMENT_LEFT_CENTER, blackBarsColor); g_onePixelSurf.BlitScaled(0, g_dglo.m_nativeGameArea.top, CL_Vec2f(5000, 5000), ALIGNMENT_DOWN_CENTER, blackBarsColor); g_onePixelSurf.BlitScaled(0, g_dglo.m_nativeGameArea.bottom, CL_Vec2f(5000, 5000), ALIGNMENT_UPPER_CENTER, blackBarsColor); } //s.Blit(0, 0); //g_globalBatcher.Flush(); glPopMatrix( ); //well, at this point we're done except there is garbage on the area outside the playfield if we're letterboxed so aspect ratio is right. This could have all been //avoided with a render to surface but I think this will be faster } } void did_player_cross_screen(bool bCheckWithoutMoving, int playerID) { bool move_gonna = false; if (g_dglos.walk_off_screen == 1) return; //DO MATH TO SEE IF THEY HAVE CROSSED THE SCREEN, IF SO LOAD NEW ONE if ((g_sprite[playerID].x) < g_gameAreaLeftOffset) { if ((g_MapInfo.loc[*pmap-1] > 0) && (g_dglos.screenlock == 0) ) { //move one map to the left if (bCheckWithoutMoving) { move_gonna = true; return; } update_screen_time(); StartScreenScrollTransition(4); *pmap -= 1; load_map(g_MapInfo.loc[*pmap]); if (g_MapInfo.indoor[*pmap] == 0) g_dglos.g_playerInfo.last_map = *pmap; BuildScreenBackground(); g_sprite[playerID].x = 619; g_sprite[playerID].y = g_sprite[playerID].lpy[0]; goto b1end; } else { g_sprite[playerID].x = g_gameAreaLeftOffset; } } if ((g_sprite[playerID].x) > 619) { if ((g_MapInfo.loc[*pmap+1] > 0) && (g_dglos.screenlock == 0) ) { //move one map to the right if (bCheckWithoutMoving) { move_gonna = true; return; } update_screen_time(); StartScreenScrollTransition(6); *pmap += 1; load_map(g_MapInfo.loc[*pmap]); if (g_MapInfo.indoor[*pmap] == 0) g_dglos.g_playerInfo.last_map = *pmap; BuildScreenBackground(); g_sprite[playerID].x = g_gameAreaLeftOffset; g_sprite[playerID].y = g_sprite[playerID].lpy[0]; goto b1end; } else { g_sprite[playerID].x = 619; } } if (g_sprite[playerID].y < 0) { if ((g_MapInfo.loc[*pmap-32] > 0) && (g_dglos.screenlock == 0) ) { //move one map up if (bCheckWithoutMoving) { move_gonna = true; return; } update_screen_time(); StartScreenScrollTransition(8); *pmap -= 32; load_map(g_MapInfo.loc[*pmap]); if (g_MapInfo.indoor[*pmap] == 0) g_dglos.g_playerInfo.last_map = *pmap; g_sprite[playerID].x = g_sprite[playerID].lpx[0]; BuildScreenBackground(); g_sprite[playerID].y = 399; goto b1end; } else { g_sprite[playerID].y = 0; } } if ( (g_sprite[playerID].y > 399 ) ) { if ( (g_MapInfo.loc[*pmap+32] > 0) && (g_dglos.screenlock == 0) ) { //move one map down if (bCheckWithoutMoving) { move_gonna = true; return; } update_screen_time(); StartScreenScrollTransition(2); *pmap += 32; load_map(g_MapInfo.loc[*pmap]); if (g_MapInfo.indoor[*pmap] == 0) g_dglos.g_playerInfo.last_map = *pmap; BuildScreenBackground(); g_sprite[playerID].y = 0; g_sprite[playerID].x = g_sprite[playerID].lpx[0]; goto b1end; } else { g_sprite[playerID].y = 399; } } b1end:; } bool run_through_tag_list_talk(int h) { rtRect32 box; int amount, amounty; for (int i = 1; i <= g_dglos.last_sprite_created; i++) { if (g_sprite[i].active) if (i != h) if (g_sprite[i].brain != 8) { box = g_dglos.g_picInfo[getpic(i)].hardbox; OffsetRect(&box, g_sprite[i].x, g_sprite[i].y); InflateRect(&box, 10,10); amount = 50; amounty = 35; if (g_sprite[h].dir == 6) { box.left -= amount; } if (g_sprite[h].dir == 4) { box.right += amount; } if (g_sprite[h].dir == 2) { box.top -= amounty; } if (g_sprite[h].dir == 8) { box.bottom += amounty; } // draw_box(box, 33); if (inside_box(g_sprite[h].x, g_sprite[h].y, box)) { //Msg("Talking to sprite %d", i); if (g_sprite[i].script > 0) { //Msg("trying to find TALK in script %d", spr[i].script); if (locate(g_sprite[i].script, "TALK")) { kill_returning_stuff(g_sprite[i].script); run_script(g_sprite[i].script); return(true); } } } } } return(false); } void make_missile(int x1, int y1, int dir, int speed, int seq, int frame, int strength) { int crap = add_sprite(x1,y1,11,seq,frame); g_sprite[crap].speed = speed; g_sprite[crap].seq = seq; g_sprite[crap].timer = 0; g_sprite[crap].strength = strength; g_sprite[crap].flying = true; changedir(dir, crap, 430); } void missile_brain( int h, bool repeat) { rtRect32 box; automove(h); *pmissle_source = h; int hard = check_if_move_is_legal(h); if (repeat) if (g_sprite[h].seq == 0) g_sprite[h].seq = g_sprite[h].seq_orig; g_sprite[1].hitpoints = *plife; if (hard > 0) if (hard != 2) { //lets check to see if they hit a sprites hardness if (hard > 100) { for (int ii = 1; ii < g_dglos.last_sprite_created; ii++) { if (g_sprite[ii].sp_index == hard-100) { if (g_sprite[ii].script > 0) { *pmissile_target = 1; *penemy_sprite = 1; if (locate(g_sprite[ii].script, "HIT")) { kill_returning_stuff(g_sprite[ii].script); run_script(g_sprite[ii].script); } } if (g_sprite[h].script > 0) { *pmissile_target = ii; *penemy_sprite = 1; if (locate(g_sprite[h].script, "DAMAGE")) { kill_returning_stuff(g_sprite[h].script); run_script(g_sprite[h].script); } } else { if (g_sprite[h].attack_hit_sound == 0) { SoundPlayEffect( 9,22050, 0 ,0,0); } else { SoundPlayEffect( g_sprite[h].attack_hit_sound,g_sprite[h].attack_hit_sound_speed, 0 ,0,0); } g_sprite[h].active = 0; } //run missile end return; } } } //run missile end if (g_sprite[h].script > 0) { *pmissile_target = 0; if (locate(g_sprite[h].script, "DAMAGE")) run_script(g_sprite[h].script); } else { if (g_sprite[h].attack_hit_sound == 0) { SoundPlayEffect( 9,22050, 0 ,0,0); } else { SoundPlayEffect( g_sprite[h].attack_hit_sound,g_sprite[h].attack_hit_sound_speed, 0 ,0,0); } g_sprite[h].active = 0; return; } } if (g_sprite[h].x > 1000) g_sprite[h].active = false; if (g_sprite[h].y > 700) g_sprite[h].active = false; if (g_sprite[h].y < -500) g_sprite[h].active = false; if (g_sprite[h].x < -500) g_sprite[h].active = false; //did we hit anything that can die? for (int j = 1; j <= g_dglos.last_sprite_created; j++) { if (g_sprite[j].active) if (h != j) if (g_sprite[j].nohit != 1) if (g_sprite[j].notouch == false) if (g_sprite[h].brain_parm != j) if (g_sprite[h].brain_parm2!= j) //if (spr[j].brain != 15) if //(spr[j].brain != 11) { box = g_dglos.g_picInfo[getpic(j)].hardbox; OffsetRect(&box, g_sprite[j].x, g_sprite[j].y); if (g_sprite[h].range != 0) InflateRect(&box, g_sprite[h].range,g_sprite[h].range); if (debug_mode) draw_box(box, 33); if (inside_box(g_sprite[h].x, g_sprite[h].y, box)) { g_sprite[j].notouch = true; g_sprite[j].notouch_timer = g_dglos.g_dinkTick+100; g_sprite[j].target = 1; *penemy_sprite = 1; //change later to reflect REAL target if (g_sprite[h].script > 0) { *pmissile_target = j; if (locate(g_sprite[h].script, "DAMAGE")) run_script(g_sprite[h].script); } else { if (g_sprite[h].attack_hit_sound == 0) { SoundPlayEffect( 9,22050, 0 ,0,0); } else { SoundPlayEffect( g_sprite[h].attack_hit_sound,g_sprite[h].attack_hit_sound_speed, 0 ,0,0); } } if ( g_sprite[j].hitpoints > 0) if (g_sprite[h].strength != 0) { int hit = 0; if (g_sprite[h].strength == 1) hit = g_sprite[h].strength - g_sprite[j].defense; else hit = (g_sprite[h].strength / 2) + ((rand() % (g_sprite[h].strength / 2))+1) - g_sprite[j].defense; if (hit < 0) hit = 0; g_sprite[j].damage += hit; if (hit > 0) { random_blood(g_sprite[j].x, g_sprite[j].y-40, j); } g_sprite[j].last_hit = 1; //Msg("Damage done is %d..", spr[j].damage); } if (g_sprite[j].script > 0) { //CHANGED did = h *pmissile_target = 1; if (locate(g_sprite[j].script, "HIT")) { kill_returning_stuff(g_sprite[j].script); run_script(g_sprite[j].script); } } } } } } void missile_brain_expire(int h) { missile_brain(h, false); if (g_sprite[h].seq == 0) g_sprite[h].active = 0; } void run_through_mouse_list(int h, bool special) { rtRect32 box; for (int i = 1; i <= g_dglos.last_sprite_created; i++) { if (g_sprite[i].active) if (i != h) if ((g_sprite[i].touch_damage != 0) ) { if (g_sprite[i].touch_damage != -1) if (g_sprite[h].notouch) return; box = g_dglos.g_picInfo[getpic(i)].hardbox; OffsetRect(&box, g_sprite[i].x, g_sprite[i].y); if (inside_box(g_sprite[h].x, g_sprite[h].y, box)) { if ((g_sprite[i].touch_damage == -1) && (g_sprite[i].script != 0)) { LogMsg("running %d's script..",g_sprite[i].script); if (locate(g_sprite[i].script, "CLICK")) run_script(g_sprite[i].script); } else { if (g_sprite[i].touch_damage == -1) { LogMsg("Sprites touch damage is set to -1 but there is no script set!"); } else { //lets hurt the guy } } if (special) return; } } } if (special) SoundPlayEffect(19, 22050, 0, 0,0); } void mouse_brain(int h) { if (g_sprite[h].move_active) { process_move(h); return; } int diag = 0; if (sjoy.right) diag++; if (sjoy.left) diag++; if (sjoy.down) diag++; if (sjoy.up) diag++; //*********************************PROCESS MOVEMENT if (diag == 1) { if (sjoy.right) { move(h,g_sprite[h].speed,'+','0'); changedir(6,h,g_sprite[h].base_walk); } if (sjoy.left) { move(h,g_sprite[h].speed,'-','0'); changedir(4,h,g_sprite[h].base_walk); } if (sjoy.down) { move(h,g_sprite[h].speed,'0','+'); changedir(2,h,g_sprite[h].base_walk); } if (sjoy.up) { move(h,g_sprite[h].speed,'0','-'); changedir(8,h,g_sprite[h].base_walk); } } // ***************** DIAGONAL!!!! if (diag > 1) { if ( (sjoy.up) && (sjoy.left) ) { changedir(7,h,g_sprite[h].base_walk); move(h,g_sprite[h].speed - (g_sprite[h].speed / 3),'-','-'); } if ( (sjoy.down) && (sjoy.left)) { changedir(1,h,g_sprite[h].base_walk); move(h,g_sprite[h].speed - (g_sprite[h].speed / 3),'-','+'); } if ( (sjoy.down) && (sjoy.right)) { changedir(3,h,g_sprite[h].base_walk); move(h,g_sprite[h].speed - (g_sprite[h].speed / 3),'+','+'); } if ( (sjoy.up) && (sjoy.right)) { changedir(9,h,g_sprite[h].base_walk); move(h,g_sprite[h].speed - (g_sprite[h].speed / 3),'+','-'); } } if ( (sjoy.button[1] == true)) { LogMsg("running through mouse list.."); run_through_mouse_list(h, true); sjoy.button[1] = false; } } void process_bow( int h) { int timetowait = 100; if (g_dglos.g_bowStatus.wait < g_dglos.g_dinkTick) { if (sjoy.right) g_sprite[h].dir = 6; if (sjoy.left) g_sprite[h].dir = 4; if (sjoy.up) g_sprite[h].dir = 8; if (sjoy.down) g_sprite[h].dir = 2; } if (sjoy.right) if (sjoy.up) { g_sprite[h].dir = 9; g_dglos.g_bowStatus.wait = g_dglos.g_dinkTick + timetowait; } if (sjoy.left) if (sjoy.up) { g_sprite[h].dir = 7; g_dglos.g_bowStatus.wait = g_dglos.g_dinkTick + timetowait; } if (sjoy.right) if (sjoy.down) { g_sprite[h].dir = 3; g_dglos.g_bowStatus.wait = g_dglos.g_dinkTick + timetowait; } if (sjoy.left) if (sjoy.down) { g_sprite[h].dir = 1; g_dglos.g_bowStatus.wait = g_dglos.g_dinkTick + timetowait; } g_sprite[h].pseq = 100+g_sprite[h].dir; if (g_dglos.g_bowStatus.pull_wait < g_dglos.g_dinkTick) { g_dglos.g_bowStatus.pull_wait = g_dglos.g_dinkTick + 10; if (g_dglos.g_bowStatus.hitme) g_dglos.g_bowStatus.time += 7; if (g_dglos.g_bowStatus.time > 500) g_dglos.g_bowStatus.time = 500; float progress = (float(g_dglos.g_bowStatus.time)/500); //was +1 g_sprite[h].pframe = (float(4)*progress)+1; #ifdef _DEBUG //LogMsg("sprite %d's pframe is now %d", h, g_sprite[h].pframe); #endif } if (sjoy.letgo[1]) { g_dglos.g_bowStatus.active = false; g_dglos.g_bowStatus.last_power = g_dglos.g_bowStatus.time; run_script(g_dglos.g_bowStatus.script); return; } } bool DinkIsWaitingForSkippableDialog() { return (g_sprite[1].active && g_sprite[1].brain == 1 && g_sprite[1].freeze && !g_dglos.g_talkInfo.active); } bool DinkSkipDialogLine() { bool bSkipped = false; for (int jj = 1; jj <= g_dglos.last_sprite_created; jj++) { //Msg("Checking %d, brain %d, script %d, my freeze is %d",jj, spr[jj].brain, spr[jj].script, spr[h].freeze); if (g_sprite[jj].brain == 8) if (g_sprite[jj].script == g_dglos.g_playerInfo.last_talk) { //this sprite owns its freeze g_sprite[jj].kill_timer = 1; //force the message to be over bSkipped = true; } } return bSkipped; } bool DinkCanRunScriptNow() { if (GetDinkGameMode() != DINK_GAME_MODE_NORMAL) return false; if (!g_sprite[1].active) return false; if (g_sprite[1].move_active) return false; if (g_sprite[1].nocontrol) return false; if (g_sprite[1].freeze) return false; if (GetDinkSubGameMode() == DINK_SUB_GAME_MODE_DIALOG) return false; if (GetDinkSubGameMode() == DINK_SUB_GAME_MODE_SHOWING_BMP) return false; if (g_bTransitionActive) return false; return true; } bool DinkLoadPlayerScript(const string fileName) { int mycrap = load_script(fileName.c_str(), 1, false, true); if (locate(mycrap, (char*)"MAIN")) { run_script(mycrap); return true; } return false; } void human_brain(int h) { int diag; int crap; bool bad; if (g_dglos.g_gameMode == 0) goto b1end; if (g_sprite[h].move_active) { process_move(h); return; } if (g_sprite[h].damage > 0) { draw_damage(h); *plife -= g_sprite[h].damage; g_sprite[h].damage = 0; if (*plife < 0) *plife = 0; int hurt = (rand() % 2)+1; if (hurt == 1) SoundPlayEffect( 15,25050, 2000 ,0,0); if (hurt == 2) SoundPlayEffect( 16,25050, 2000 ,0,0); //draw blood } if (g_dglos.g_playerInfo.push_active) { if (g_dglos.g_playerInfo.push_dir == 2) if (!sjoy.down) { g_sprite[h].nocontrol = false; g_dglos.g_playerInfo.push_active = false; } if (g_dglos.g_playerInfo.push_dir == 4) if (!sjoy.left) { g_sprite[h].nocontrol = false; g_dglos.g_playerInfo.push_active = false; } if (g_dglos.g_playerInfo.push_dir == 6) if (!sjoy.right) { g_sprite[h].nocontrol = false; g_dglos.g_playerInfo.push_active = false; } if (g_dglos.g_playerInfo.push_dir == 8) if (!sjoy.up) { g_sprite[h].nocontrol = false; g_dglos.g_playerInfo.push_active = false; } } if (g_sprite[h].nocontrol) return; if (g_dglos.g_talkInfo.active) goto freeze; if ( g_sprite[h].freeze) { //they are frozen if ( (sjoy.button[2] == true) || (sjoy.key[32])) { //they hit the talk button while frozen, lets hurry up the process DinkSkipDialogLine(); } goto freeze; } //****************************** KEYS THAT CAN BE PRESSED AT ANY TIME ************** if (g_dglos.g_bowStatus.active) { //bow is active!! process_bow(h); return; } if (g_dglos.g_playerInfo.push_active) if (g_dglos.g_playerInfo.push_timer + 600 < g_dglos.g_dinkTick) { g_sprite[h].seq = g_dglos.mDinkBasePush+g_sprite[h].dir; g_sprite[h].frame = 1; g_sprite[h].nocontrol = true; //play.push_active = false; run_through_tag_list_push(h); return; } if ( (sjoy.button[2] == true) ) { if (!run_through_tag_list_talk(h)) { //redink1 addition of 'not talking to anything' script int sc = load_script("DNOTALK", 0, false, true); if (sc != 0 && locate(sc,"MAIN")) { run_script(sc); } else { kill_text_owned_by(h); int randy = (rand() % 6)+1; if (randy == 1) say_text((char*)"`$I don't see anything here.",h,0); if (randy == 2) say_text((char*)"`$Huh?",h,0); if (randy == 3) say_text((char*)"`$I'm fairly sure I can't talk to or use that.",h,0); if (randy == 4) say_text((char*)"`$What?",h,0); if (randy == 5) say_text((char*)"`$I'm bored.",h,0); if (randy == 6) say_text((char*)"`$Not much happening here.",h,0); } } } if ( (sjoy.button[1] == true) && (g_dglos.weapon_script != 0) && (!sjoy.button[2] == true)) { if (g_sprite[h].base_hit > 0) { if (locate(g_dglos.weapon_script, "USE")) run_script(g_dglos.weapon_script); goto b1end; } } #ifdef C_DINK_KEYBOARD_INPUT //added AGAIN 10-19-99 //Let's check keys for getting hit /* int x5; if (g_bHasFocus) { if (g_dglos.but_timer < g_dglos.g_dinkTick) { for (x5=29; x5<255; x5++) { if (x5 == 32) x5++; if (x5 == 54) x5++; if (x5 == 55) x5++; if (x5 == 37) x5++; if (x5 == 38) x5++; if (x5 == 39) x5++; if (x5 == 40) x5++; if (x5 == 77) x5++; char msg[32]; if (GetKeyboard(x5)) { sprintf(msg, "key-%d",x5); g_dglos.but_timer = g_dglos.g_dinkTick+200; if (DinkLoadPlayerScript(msg)) { goto b1end; } } } } } */ #endif if ( sjoy.button[6] == true ) { int mycrap = load_script("BUTTON6", 1, false, true); //map if (locate(mycrap, (char*)"MAIN")) run_script(mycrap); goto b1end; } if ( sjoy.button[7] == true ) { int mycrap = load_script("BUTTON7", 1, false, true); if (locate(mycrap, (char*)"MAIN")) run_script(mycrap); goto b1end; } if ( sjoy.button[8] == true ) { int mycrap = load_script("BUTTON8", 1, false, true); if (locate(mycrap, (char*)"MAIN")) run_script(mycrap); goto b1end; } if ( sjoy.button[9] == true ) { int mycrap = load_script("BUTTON9", 1, false, true); if (locate(mycrap, (char*)"MAIN")) run_script(mycrap); goto b1end; } if ( sjoy.button[10] == true ) { int mycrap = load_script("BUTTON10", 1, false, true); if (locate(mycrap, (char*)"MAIN")) run_script(mycrap); goto b1end; } if (g_dglos.magic_script != 0) if (sjoy.joybit[3]) goto shootm; if ( (sjoy.button[3] == true) ) { if (g_dglos.magic_script == 0) { //redink1 addition of 'no magic' script int sc = load_script("DNOMAGIC", 0, false, true); if (sc != 0 && locate(sc,"MAIN")) { run_script(sc); } else { int randy = (rand() % 6)+1; kill_text_owned_by(h); if (randy == 1) say_text((char*)"`$I don't know any magic.",h,0); if (randy == 2) say_text((char*)"`$I'm no wizard!",h,0); if (randy == 3) say_text((char*)"`$I need to learn magic before trying this.",h,0); if (randy == 4) say_text((char*)"`$I'm gesturing wildly to no avail!",h,0); //redink1 removed an extra space if (randy == 5) say_text((char*)"`$Nothing happened.",h,0); if (randy == 6) say_text((char*)"`$Hocus pocus!",h,0); } goto b1end; } //player pressed 1 //lets magiced something shootm: if (*pmagic_level >= *pmagic_cost) { if (locate(g_dglos.magic_script, "USE")) run_script(g_dglos.magic_script); goto b1end; } } if (sjoy.button[4]) { //redink1 addition of 'enter key/inventory' script int sc = load_script("BUTTON4", 0, false, true); if (sc != 0) { if (locate(sc,"MAIN")) { run_script(sc); return; } } g_itemScreenActive = true; if (!IsLargeScreen() || IsIphone4Size) { g_dglo.SetViewOverride(DinkGlobals::VIEW_ZOOMED); } SoundPlayEffect(18, 22050,0,0,0); return; } #if defined(C_DINK_KEYBOARD_INPUT) && defined(_DEBUG) if ( GetKeyboard(50) ) { if (g_bHasFocus) { //player pressed 2 //lets add a duck with brain 2 crap = add_sprite(g_sprite[h].x-20,g_sprite[h].y-50,3,26,1); g_sprite[crap].speed = 1; g_sprite[crap].base_walk = 20; g_sprite[crap].exp = 11; g_sprite[crap].hitpoints = 5; } } #endif if ( (sjoy.button[5] == true) ) { if (!g_dglos.g_bShowingBitmap.active) if (!g_dglos.g_bowStatus.active) if (!g_dglos.g_talkInfo.active) { int sc = load_script("ESCAPE", 1000, false); if (sc != 0) if (locate(sc,"MAIN")) run_script(sc); return; } } if (g_sprite[h].skip > 0) if (g_sprite[h].skip <= g_sprite[h].skiptimer) { g_sprite[h].skiptimer = 0; goto b1end; } diag = 0; if (sjoy.right) diag++; if (sjoy.left) diag++; if (sjoy.down) diag++; if (sjoy.up) diag++; //*********************************PROCESS MOVEMENT if (diag == 1) { if (sjoy.right) { move(h,g_sprite[h].speed,'+','0'); changedir(6,h,g_sprite[h].base_walk); } if (sjoy.left) { move(h,g_sprite[h].speed,'-','0'); changedir(4,h,g_sprite[h].base_walk); } if (sjoy.down) { move(h,g_sprite[h].speed,'0','+'); changedir(2,h,g_sprite[h].base_walk); } if (sjoy.up) { move(h,g_sprite[h].speed,'0','-'); changedir(8,h,g_sprite[h].base_walk); } } // ***************** DIAGONAL!!!! if (diag > 1) if (diag < 3) { if ( (sjoy.up) && (sjoy.left) ) { changedir(7,h,g_sprite[h].base_walk); move(h,g_sprite[h].speed - (g_sprite[h].speed / 3),'-','-'); } if ( (sjoy.down) && (sjoy.left)) { changedir(1,h,g_sprite[h].base_walk); move(h,g_sprite[h].speed - (g_sprite[h].speed / 3),'-','+'); } if ( (sjoy.down) && (sjoy.right)) { changedir(3,h,g_sprite[h].base_walk); move(h,g_sprite[h].speed - (g_sprite[h].speed / 3),'+','+'); } if ( (sjoy.up) && (sjoy.right)) { changedir(9,h,g_sprite[h].base_walk); move(h,g_sprite[h].speed - (g_sprite[h].speed / 3),'+','-'); } } bad = false; if (sjoy.right) bad = true; if (sjoy.left) bad = true; if (sjoy.up) bad = true; if (sjoy.down) bad = true; if (bad) { if (g_sprite[h].idle) { g_sprite[h].frame = 1; g_sprite[h].idle = false; } goto badboy; } if (not_in_this_base(g_sprite[h].seq, g_sprite[h].base_idle)) //uncomment to allow walk anim to end before idle anim to start { freeze: if (g_sprite[h].dir == 1) g_sprite[h].dir = 2; if (g_sprite[h].dir == 3) g_sprite[h].dir = 2; if (g_sprite[h].dir == 7) g_sprite[h].dir = 8; if (g_sprite[h].dir == 9) g_sprite[h].dir = 8; if (g_sprite[h].base_idle != 0) changedir(g_sprite[h].dir,h,g_sprite[h].base_idle); g_sprite[h].idle = true; } badboy: b1end:; check_sprite_status(h); if ( (g_sprite[h].dir == 2) | (g_sprite[h].dir == 4) | (g_sprite[h].dir == 6) | (g_sprite[h].dir == 8)) goto smoothend; crap = check_if_move_is_legal(h); if (crap != 0) { if (g_dglos.g_smallMap.sprite[crap-100].prop != 0) g_dglos.flub_mode = crap; //hit something, can we move around it? if( (g_sprite[h].seq == g_sprite[h].base_walk + 4) | (g_sprite[h].seq == g_sprite[h].base_walk + 6) ) { int hardm = get_hard_play(h, g_sprite[h].x, g_sprite[h].y-1); if (hardm == 0) { g_sprite[h].y -= 1; } } if( (g_sprite[h].seq == g_sprite[h].base_walk + 8) | (g_sprite[h].seq == g_sprite[h].base_walk + 2) ) { int hardm = get_hard_play(h, g_sprite[h].x-1, g_sprite[h].y); if (hardm == 0) { g_sprite[h].x -= 1; } } if (g_sprite[h].seq == g_sprite[h].base_walk + 9) { int hardm = get_hard_play(h, g_sprite[h].x+1, g_sprite[h].y); if (hardm == 0) { g_sprite[h].x += 1; } else { int hardm = get_hard_play(h, g_sprite[h].x+1, g_sprite[h].y+1); if (hardm == 0) { g_sprite[h].x += 1; g_sprite[h].y += 1; } else { int hardm = get_hard_play(h, g_sprite[h].x+1, g_sprite[h].y+2); if (hardm == 0) { g_sprite[h].x += 1; g_sprite[h].y += 2; } else { int hardm = get_hard_play(h, g_sprite[h].x, g_sprite[h].y-1); if (hardm == 0) { g_sprite[h].y -= 1; } else { int hardm = get_hard_play(h, g_sprite[h].x-1, g_sprite[h].y-1); if (hardm == 0) { g_sprite[h].x -= 1; g_sprite[h].y -= 1; } } } } } } if (g_sprite[h].seq == g_sprite[h].base_walk + 7) { int hardm = get_hard_play(h, g_sprite[h].x-1, g_sprite[h].y); if (hardm == 0) { g_sprite[h].x -= 1; } else { int hardm = get_hard_play(h, g_sprite[h].x-1, g_sprite[h].y+1); if (hardm == 0) { g_sprite[h].x -= 1; g_sprite[h].y += 1; } else { int hardm = get_hard_play(h, g_sprite[h].x-1, g_sprite[h].y+2); if (hardm == 0) { g_sprite[h].x -= 1; g_sprite[h].y += 2; } else { int hardm = get_hard_play(h, g_sprite[h].x, g_sprite[h].y-1); if (hardm == 0) { g_sprite[h].y -= 1; } else { int hardm = get_hard_play(h, g_sprite[h].x+1, g_sprite[h].y-1); if (hardm == 0) { g_sprite[h].x += 1; g_sprite[h].y -= 1; } } } } } } if (g_sprite[h].seq == g_sprite[h].base_walk + 1) { int hardm = get_hard_play(h, g_sprite[h].x-1, g_sprite[h].y); if (hardm == 0) { g_sprite[h].x -= 1; } else { int hardm = get_hard_play(h, g_sprite[h].x-1, g_sprite[h].y-1); if (hardm == 0) { g_sprite[h].x -= 1; g_sprite[h].y -= 1; } else { int hardm = get_hard_play(h, g_sprite[h].x-1, g_sprite[h].y-2); if (hardm == 0) { g_sprite[h].x -= 1; g_sprite[h].y -= 2; } else { int hardm = get_hard_play(h, g_sprite[h].x, g_sprite[h].y+1); if (hardm == 0) { g_sprite[h].y += 1; } else { int hardm = get_hard_play(h, g_sprite[h].x+1, g_sprite[h].y+1); if (hardm == 0) { g_sprite[h].x += 1; g_sprite[h].y += 1; } } } } } } if (g_sprite[h].seq == g_sprite[h].base_walk + 3) { int hardm = get_hard_play(h, g_sprite[h].x+1, g_sprite[h].y); if (hardm == 0) { g_sprite[h].x += 1; } else { int hardm = get_hard_play(h, g_sprite[h].x+1, g_sprite[h].y-1); if (hardm == 0) { g_sprite[h].x += 1; g_sprite[h].y -= 1; } else { int hardm = get_hard_play(h, g_sprite[h].x+1, g_sprite[h].y-2); if (hardm == 0) { g_sprite[h].x += 1; g_sprite[h].y -= 2; } else { int hardm = get_hard_play(h, g_sprite[h].x, g_sprite[h].y+1); if (hardm == 0) { g_sprite[h].y += 1; } else { int hardm = get_hard_play(h, g_sprite[h].x-1, g_sprite[h].y+1); if (hardm == 0) { g_sprite[h].x -= 1; g_sprite[h].y += 1; } } } } } } } smoothend:; } int find_sprite(int block) { for (int k = 1; k <= g_dglos.last_sprite_created; k++) { if (g_sprite[k].sp_index == block) { return(k); } } return(0); } int special_block(int block, int h) { if (g_dglos.g_smallMap.sprite[block].prop == 1) { //they touched a warp if (g_dglos.g_smallMap.sprite[block].sound == 0) SoundPlayEffect( 7,12000, 0 , 0,0); else SoundPlayEffect( g_dglos.g_smallMap.sprite[block].sound,22050, 0 , 0,0); if (g_dglos.g_smallMap.sprite[block].parm_seq != 0) { //we'll also play an animation here int sprite = find_sprite(block); if (sprite > 0) { g_sprite[sprite].seq = g_dglos.g_smallMap.sprite[block].parm_seq; g_dglos.process_warp = block; } return(1); } g_dglos.process_warp = block; return(1); //redraw screen with fade } return(0); } void down_cycle() { //redink1 truecolor fadedown... g_dglos.process_downcycle = true; float alpha = float(g_dglos.g_dinkTick - g_dglos.cycle_clock)/ (float)C_DINK_FADE_TIME_MS; ForceRange(alpha, 0, 1); g_dinkFadeAlpha = alpha; // LogMsg("Alpha is %.2f", alpha); } void up_cycle(void) { //redink1 added this for true-color fade support g_dglos.process_upcycle = true; float alpha = float(g_dglos.g_dinkTick - g_dglos.cycle_clock)/ (float)C_DINK_FADE_TIME_MS; ForceRange(alpha, 0, 1); g_dinkFadeAlpha = 1-alpha; // LogMsg("Alpha is %.2f", alpha); } void draw_box(rtRect32 box, int color) { DrawRect(box); //DDBLTFX ddbltfx; //ddbltfx.dwSize = sizeof(ddbltfx); //ddbltfx.dwFillColor = color; //ddrval = lpDDSBack->Blt(&box ,NULL, NULL, DDBLT_COLORFILL| DDBLT_WAIT, &ddbltfx); } //redink1 and Invertigo fix for windowed/high color mode void flip_it(void) { //redink1 fix for true-color transition //The idea is to apply the fade to the backbuffer right before the main flip/blt. if (g_dglos.process_downcycle || g_dglos.process_upcycle || g_dglos.bFadedDown) { //Make sure we're not 'stuck'... i.e. fade down when already black, or fade up when not black if (g_dglos.process_downcycle && g_dglos.bFadedDown || g_dglos.process_upcycle && !g_dglos.bFadedDown) { if (g_dglos.process_downcycle) g_dglos.process_downcycle = false; if (g_dglos.process_upcycle) { g_dglos.process_upcycle = false; if ( g_dglos.mSwapped ) { g_dglos.mSwapped = false; } } if (g_dglos.cycle_script != 0) { int junk = g_dglos.cycle_script; g_dglos.cycle_script = 0; run_script(junk); } } if ( g_dglos.process_downcycle || g_dglos.bFadedDown || g_dglos.process_upcycle ) { //just tell them the fade is complete for now if ( g_dglos.process_downcycle == true ) { if (g_dglos.g_dinkTick > g_dglos.cycle_clock+C_DINK_FADE_TIME_MS) { g_dglos.bFadedDown = true; } } else if ( g_dglos.process_upcycle == true ) { if (g_dglos.g_dinkTick > g_dglos.cycle_clock+C_DINK_FADE_TIME_MS) { g_dglos.bFadedDown = false; } } } } } void run_through_tag_list(int h, int strength) { rtRect32 box; int amount, amounty; for (int i = 1; i <= g_dglos.last_sprite_created; i++) { if (g_sprite[i].active) if (i != h) if (! ( (g_sprite[i].nohit == 1) && (g_sprite[i].script == 0)) ) { box = g_dglos.g_picInfo[getpic(i)].hardbox; OffsetRect(&box, g_sprite[i].x, g_sprite[i].y); box.right += 5; box.left -= 5; box.top -= 5; box.bottom += 10; if (g_sprite[h].range == 0) amount = 28; else amount = g_sprite[h].range; if (g_sprite[h].range == 0) amounty = 36; else amounty = (g_sprite[h].range + (g_sprite[h].range / 6)); int range_amount = g_sprite[h].range / 8; if (g_sprite[h].dir == 6) { box.top -= 10; box.bottom += 10; if (g_sprite[h].range != 0) box.top -= range_amount; if (g_sprite[h].range != 0) box.bottom += range_amount; box.left -= amount; } if (g_sprite[h].dir == 4) { box.right += amount; box.top -= 10; box.bottom += 10; if (g_sprite[h].range != 0) box.top -= range_amount; if (g_sprite[h].range != 0) box.bottom += range_amount; } if (g_sprite[h].dir == 2) { box.right += 10; box.left -= 10; box.top -= amounty; if (g_sprite[h].range != 0) box.right += range_amount; if (g_sprite[h].range != 0) box.left -= range_amount; } if (g_sprite[h].dir == 8) { box.right += 10; box.left -= 10; box.bottom += amounty; if (g_sprite[h].range != 0) box.right += range_amount; if (g_sprite[h].range != 0) box.right -= range_amount; } if (debug_mode) draw_box(box, 33); if (inside_box(g_sprite[h].x, g_sprite[h].y, box)) { //redink1 addition for fixing missle_source problems *pmissle_source = h; if (g_sprite[i].nohit == 1) { if (g_sprite[i].script > 0) { //if ( (spr[i].brain == 0) | (spr[i].brain == 5) | (spr[i].brain == 6) | (spr[i].brain == 7)) *penemy_sprite = h; if ( (g_sprite[i].base_attack != -1) || (g_sprite[i].touch_damage > 0)) g_sprite[i].target = h; if (locate(g_sprite[i].script, "HIT")) { kill_returning_stuff(g_sprite[i].script); run_script(g_sprite[i].script); } } } else { //hit this personb/thing if (g_sprite[h].attack_hit_sound == 0) { SoundPlayEffect( 9,22050, 0 ,0,0); } else { SoundPlayEffect( g_sprite[h].attack_hit_sound,g_sprite[h].attack_hit_sound_speed, 0 ,0,0); } if ( (g_sprite[i].base_attack != -1) || (g_sprite[i].touch_damage > 0)) g_sprite[i].target = h; if (g_sprite[h].strength == 0) { } else { if ( (g_sprite[i].hitpoints > 0) || (i == 1) ) { g_sprite[i].last_hit = h; if ( hurt_thing(i, (g_sprite[h].strength / 2) + ((rand() % ((g_sprite[h].strength+1) / 2))+1), 0) > 0) random_blood(g_sprite[i].x, g_sprite[i].y-40, i); //redink1 } } if (g_sprite[i].script > 0) { //if ( (spr[i].brain == 0) | (spr[i].brain == 5) | (spr[i].brain == 6) | (spr[i].brain == 7)) g_sprite[i].last_hit = h; *penemy_sprite = h; if ( (g_sprite[i].base_attack != -1) || (g_sprite[i].touch_damage > 0)) g_sprite[i].target = h; if (locate(g_sprite[i].script, "HIT")) { kill_returning_stuff(g_sprite[i].script); run_script(g_sprite[i].script); } } } } } } } void run_through_tag_list_push(int h) { rtRect32 box; for (int i = 1; i <= g_dglos.last_sprite_created; i++) { if (g_sprite[i].active) if (i != h) if ((g_sprite[i].script != 0) ) { box = g_dglos.g_picInfo[getpic(i)].hardbox; OffsetRect(&box, g_sprite[i].x, g_sprite[i].y); //InflateRect(&box, 10,10); box.right += 2; box.left -= 2; box.top -= 2; box.bottom += 2; //draw_box(box, 33); if (inside_box(g_sprite[h].x, g_sprite[h].y, box)) { if (locate(g_sprite[i].script, "PUSH")) run_script(g_sprite[i].script); } } } } void run_through_touch_damage_list(int h) { rtRect32 box; for (int i = 1; i <= g_dglos.last_sprite_created; i++) { if (g_sprite[i].active) if (i != h) if ((g_sprite[i].touch_damage != 0) ) { if (g_sprite[i].touch_damage != -1) if (g_sprite[h].notouch) return; box = g_dglos.g_picInfo[getpic(i)].hardbox; OffsetRect(&box, g_sprite[i].x, g_sprite[i].y); //InflateRect(&box, 10,10); box.right += 2; box.left -= 2; box.top -= 2; box.bottom += 2; if (debug_mode) draw_box(box, 33); if (inside_box(g_sprite[h].x, g_sprite[h].y, box)) { if ((g_sprite[i].touch_damage == -1) && (g_sprite[i].script != 0)) { if (locate(g_sprite[i].script, "TOUCH")) run_script(g_sprite[i].script); } else { if (g_sprite[i].touch_damage == -1) { LogMsg("Sprites touch damage is set to -1 but there is no script set!"); } else { //lets hurt the guy g_sprite[h].notouch = true; g_sprite[h].notouch_timer = g_dglos.g_dinkTick+400; g_sprite[h].last_hit = i; if (g_sprite[i].script != 0) if (locate(g_sprite[i].script, "TOUCH")) run_script(g_sprite[i].script); if (hurt_thing(h, g_sprite[i].touch_damage, 0) > 0) random_blood(g_sprite[h].x, g_sprite[h].y-40, h); } } } } } } void process_warp_man(void) { rtRect32 box_crap; DDBLTFX ddbltfx; int sprite = find_sprite(g_dglos.process_warp); if (sprite == 0 || g_sprite[sprite].seq == 0) { g_dglos.process_count++; if (g_dglos.process_count == 1) { g_dglos.cycle_clock = g_dglos.g_dinkTick; //redink1 Limit palette cycles for true color mode down_cycle(); } if (g_dglos.process_downcycle == false) //redink1 more limits for fade down stuff { ddbltfx.dwSize = sizeof(ddbltfx); ddbltfx.dwFillColor = 0; box_crap = rtRect32 (0,0,C_DINK_SCREENSIZE_X,C_DINK_SCREENSIZE_Y); //int ddrval = lpDDSBack->Blt(&box_crap ,NULL, NULL, DDBLT_COLORFILL| DDBLT_WAIT, &ddbltfx); flip_it(); g_dglos.process_count = 0; int block = g_dglos.process_warp; update_screen_time(); g_sprite[1].x = g_dglos.g_smallMap.sprite[block].warp_x; g_sprite[1].y = g_dglos.g_smallMap.sprite[block].warp_y; *pmap = g_dglos.g_smallMap.sprite[block].warp_map; //redink1 change so map indicator is correct on warp. if (g_MapInfo.indoor[g_dglos.g_smallMap.sprite[block].warp_map] == 0) g_dglos.g_playerInfo.last_map = g_dglos.g_smallMap.sprite[block].warp_map; load_map(g_MapInfo.loc[g_dglos.g_smallMap.sprite[block].warp_map]); BuildScreenBackground(); g_dglos.cycle_clock = g_dglos.g_dinkTick; g_dinkFadeAlpha = 1; g_dglos.process_upcycle = true; g_dglos.process_warp = 0; } } else { g_dglos.process_count = 0; } } void one_time_brain(int h) { //goes once then draws last frame to background if (g_sprite[h].move_active) { process_move(h); return; } if (g_sprite[h].follow > 0) { process_follow(h); } if (g_sprite[h].seq == 0) { g_dglo.m_bgSpriteMan.Add(h); //draw_sprite_game(lpDDSTwo,h); g_sprite[h].active = false; return; } changedir(g_sprite[h].dir,h,-1); automove(h); } void one_time_brain_for_real(int h) { if (g_sprite[h].move_active) { process_move(h); } if (g_sprite[h].follow > 0) { process_follow(h); } if (g_sprite[h].seq == 0) { g_sprite[h].active = false; return; } if (g_sprite[h].dir > 0) { changedir(g_sprite[h].dir,h,-1); automove(h); } } void scale_brain(int h) { if (g_sprite[h].size == g_sprite[h].brain_parm) { g_sprite[h].active = false; return; } int num = 5 * (g_dglos.base_timing / 4); if (g_sprite[h].size > g_sprite[h].brain_parm) { if (g_sprite[h].size - num < g_sprite[h].brain_parm) num = g_sprite[h].size - g_sprite[h].brain_parm; g_sprite[h].size -= num; } if (g_sprite[h].size < g_sprite[h].brain_parm) { if (g_sprite[h].size + num > g_sprite[h].brain_parm) num = g_sprite[h].brain_parm - g_sprite[h].size; g_sprite[h].size += num; } if (g_sprite[h].move_active) { process_move(h); return; } if (g_sprite[h].dir > 0) { changedir(g_sprite[h].dir,h,-1); automove(h); } } void repeat_brain(int h) { if (g_sprite[h].move_active) { process_move(h); } if (g_sprite[h].seq_orig == 0) if (g_sprite[h].sp_index != 0) { g_sprite[h].seq_orig = g_dglos.g_smallMap.sprite[g_sprite[h].sp_index].seq; g_sprite[h].frame = g_dglos.g_smallMap.sprite[g_sprite[h].sp_index].frame; g_sprite[h].wait = 0; } if (g_sprite[h].seq == 0) g_sprite[h].seq = g_sprite[h].seq_orig; } void text_brain(int h) { if ( (g_sprite[h].damage == -1) && (g_sprite[h].owner != 1000)) { if (g_sprite[g_sprite[h].owner].active == false) { //msg("Killing text brain %d, because owner %d is dead.",h, spr[h].owner); g_sprite[h].active = false; return; } //give this text the cords from it's owner sprite g_sprite[h].x = g_sprite[g_sprite[h].owner].x - g_sprite[h].strength; g_sprite[h].y = g_sprite[g_sprite[h].owner].y - g_sprite[h].defense; if (g_sprite[h].x < 1) g_sprite[h].x = 1; if (g_sprite[h].y < 1) g_sprite[h].y = 1; } else { //Msg("automoving %d.. ", h); if (g_sprite[h].move_active) { process_move(h); return; } automove(h); } } void process_talk() { int px = 48, py = 44; int sx = 184; int sy = 94, sy_hold, sy_ho; int spacing = 12; int curxl = 126; int curxr = 462; int curyr = 200; int curyl = 200; int y_last = 0, y_hold = 0, y_ho = 0; rtRect32 rcRect; int i; int x_depth = 335; if (g_dglos.g_talkInfo.newy != -5000) sy = g_dglos.g_talkInfo.newy; sy_hold = sy; sy_ho = sy; int ddrval; int fake_page; if (check_seq_status(30)) { ddrval = lpDDSBack->BltFast( px, py, g_pSpriteSurface[g_dglos.g_seq[30].frame[2]], &g_dglos.g_picInfo[g_dglos.g_seq[30].frame[2]].box , DDBLTFAST_SRCCOLORKEY ); ddrval = lpDDSBack->BltFast( px+169, py+42, g_pSpriteSurface[g_dglos.g_seq[30].frame[3]], &g_dglos.g_picInfo[g_dglos.g_seq[30].frame[3]].box , DDBLTFAST_SRCCOLORKEY ); ddrval = lpDDSBack->BltFast( px+169+180, py+1, g_pSpriteSurface[g_dglos.g_seq[30].frame[4]], &g_dglos.g_picInfo[g_dglos.g_seq[30].frame[4]].box , DDBLTFAST_SRCCOLORKEY ); } int talk_hold = g_dglos.g_talkInfo.cur; // if (sjoy.rightd) g_dglos.g_talkInfo.cur++; // if (sjoy.leftd) g_dglos.g_talkInfo.cur--; if (sjoy.downd) g_dglos.g_talkInfo.cur++; if (sjoy.upd) g_dglos.g_talkInfo.cur--; if (g_dglos.g_playerInfo.mouse > 20) { g_dglos.g_talkInfo.cur++; g_dglos.g_playerInfo.mouse = 0; } if (g_dglos.g_playerInfo.mouse < -20) { g_dglos.g_talkInfo.cur--; g_dglos.g_playerInfo.mouse = 0; } if (talk_hold != g_dglos.g_talkInfo.cur) { if (g_dglos.g_talkInfo.cur >= g_dglos.g_talkInfo.cur_view) if (g_dglos.g_talkInfo.cur <= g_dglos.g_talkInfo.cur_view_end) SoundPlayEffect(11, 22050,0,0,0); } uint32 rgbColor = MAKE_RGBA(255,255,255,255); if (strlen(g_dglos.g_talkInfo.buffer) > 0) { rcRect = rtRect32 (sx,94,463,400); if (g_dglos.g_talkInfo.newy != -5000) rcRect.bottom = g_dglos.g_talkInfo.newy+15; int color = 15; // SetTextColor(hdc,RGB(8,14,21)); //DrawText(hdc,talk.buffer,strlen(talk.buffer),&rcRect,DT_VCENTER | DT_CENTER | DT_WORDBREAK); if (g_dglos.g_talkInfo.color >= 1 && g_dglos.g_talkInfo.color <= 15) { color = g_dglos.g_talkInfo.color; } rgbColor = MAKE_RGBA(g_dglos.font_colors[color].red, g_dglos.font_colors[color].green, g_dglos.font_colors[color].blue, 255); // OffsetRect(&rcRect, 1, 1); //DrawText(hdc,talk.buffer,strlen(talk.buffer),&rcRect,DT_VCENTER | DT_CENTER | DT_WORDBREAK); rtRect rTemp(rcRect); GetApp()->GetFont(FONT_SMALL)->DrawWrapped(rTemp, g_dglos.g_talkInfo.buffer, true, false, rgbColor, g_dglo.m_fontSize) ; // SetTextColor(hdc,RGB(8,14,21)); } //tabulate distance needed by text, LORDII experience helped here for (i = g_dglos.g_talkInfo.cur_view; i < g_dglos.g_talkInfo.last; i++) { rcRect = rtRect32 (sx,y_hold,463,x_depth+100); rtRect rTemp(rcRect); y_hold = (int)GetApp()->GetFont(FONT_SMALL)->DrawWrapped(rTemp, g_dglos.g_talkInfo.line[i], true, false, rgbColor, g_dglo.m_fontSize, true).y; sy_hold += y_hold; //Msg("Sy_hold = %d (%d)", sy_hold,i); if (sy_hold > x_depth) { g_dglos.g_talkInfo.cur_view_end = i-1; //Msg("Sy is over, sp cur_view is %d ", talk.cur_view_end); goto death; } } g_dglos.g_talkInfo.cur_view_end = i; if (g_dglos.g_talkInfo.cur_view == 1) if (g_dglos.g_talkInfo.cur_view_end == g_dglos.g_talkInfo.last) { //Msg("Small enough to fit on one screen, lets center it!"); sy += ( (x_depth - sy_hold) / 2) - 20; } death: if (g_dglos.g_talkInfo.cur > g_dglos.g_talkInfo.last) { SoundPlayEffect(11, 22050,0,0,0); g_dglos.g_talkInfo.cur = 1; } if (g_dglos.g_talkInfo.cur < 1) { SoundPlayEffect(11, 22050,0,0,0); g_dglos.g_talkInfo.cur = g_dglos.g_talkInfo.last; } //Msg("Talkcur is %d, talk cur view is %d", talk.cur, talk.cur_view); //total options too large for page, lets scroll if (g_dglos.g_talkInfo.cur > g_dglos.g_talkInfo.cur_view_end) { // Msg("advancing page: talkcur is %d, changing cur_view to same", talk.cur, talk.cur_view); g_dglos.g_talkInfo.cur_view = g_dglos.g_talkInfo.cur; g_dglos.g_talkInfo.page ++; // Msg("Page advanced to %d. (cur_end is %d, cur is %d)", talk.page,talk.cur_view_end, talk.cur); goto fin; } if (g_dglos.g_talkInfo.cur < g_dglos.g_talkInfo.cur_view) { // Msg("Turning back the clock from page %d..", talk.page); g_dglos.g_talkInfo.cur_view = 1; // talk.cur = 1; g_dglos.g_talkInfo.page--; LogMsg("Page backed to %d.", g_dglos.g_talkInfo.page); fake_page = 1; for (i = 1; i < g_dglos.g_talkInfo.last; i++) { rcRect = rtRect32 (sx,sy_ho,463,x_depth); rtRect rTemp = rtRect(rcRect); y_ho += (int)GetApp()->GetFont(FONT_SMALL)->DrawWrapped(rTemp, g_dglos.g_talkInfo.line[i], true, false, rgbColor, g_dglo.m_fontSize, true).y; //y_ho = DrawText(hdc,talk.line[i],lstrlen(talk.line[i]),&rcRect,DT_CALCRECT | DT_CENTER | DT_WORDBREAK); sy_ho += y_ho; //Msg("adding y_yo %d.. (on %d)", y_ho,i); if (sy_ho > x_depth) { /*if (fake_page == talk.page) { goto fin; } */ fake_page++; sy_ho = sy+ y_ho; //Msg("Does fake page (%d) match desired page (%d) %d", fake_page, talk.page, i); } if (fake_page == g_dglos.g_talkInfo.page) { g_dglos.g_talkInfo.cur_view = i; g_dglos.g_talkInfo.cur_view_end = g_dglos.g_talkInfo.cur; //Msg("Going to fin with end being %d, and.cur being %d. View is %d.", // talk.cur_view_end, talk.cur, talk.cur_view); goto fin; } // Msg("Second: Sy is over, sp cur_view is %d", talk.cur_view_end); } g_dglos.g_talkInfo.cur_view_end = i; } //Msg("talk last is %d. cur_view_end is %d, Cur is %d", talk.last, talk.cur_view_end, talk.cur); for ( i = g_dglos.g_talkInfo.cur_view; i <= g_dglos.g_talkInfo.cur_view_end; i++) { //lets figure out where to draw this line rcRect = rtRect32 (sx,sy,463,x_depth+100); rtRect rTemp=rtRect(rcRect); if (i == g_dglos.g_talkInfo.cur) { curyl = sy-4; curyr = sy-4; // SetTextColor(hdc,RGB(255,255,255)); rgbColor = MAKE_RGBA(255,255,255,255); } else rgbColor = MAKE_RGBA(255,255,2,255); y_last = (int)GetApp()->GetFont(FONT_SMALL)->DrawWrapped(rTemp, g_dglos.g_talkInfo.line[i], true, false, rgbColor, g_dglo.m_fontSize).y; sy += y_last; } fin: if (g_dglos.g_talkInfo.timer < g_dglos.g_dinkTick) { g_dglos.g_talkInfo.curf++; g_dglos.g_talkInfo.timer = g_dglos.g_dinkTick+100; } if (g_dglos.g_talkInfo.curf == 0) g_dglos.g_talkInfo.curf = 1; if (g_dglos.g_talkInfo.curf > 7) g_dglos.g_talkInfo.curf = 1; if (check_seq_status(456) && check_seq_status(457)) { ddrval = lpDDSBack->BltFast( curxl, curyl, g_pSpriteSurface[g_dglos.g_seq[456].frame[g_dglos.g_talkInfo.curf]], &g_dglos.g_picInfo[g_dglos.g_seq[456].frame[g_dglos.g_talkInfo.curf]].box , DDBLTFAST_SRCCOLORKEY ); ddrval = lpDDSBack->BltFast( curxr, curyr, g_pSpriteSurface[g_dglos.g_seq[457].frame[g_dglos.g_talkInfo.curf]], &g_dglos.g_picInfo[g_dglos.g_seq[456].frame[g_dglos.g_talkInfo.curf]].box , DDBLTFAST_SRCCOLORKEY ); } if (GetBaseApp()->GetGameTickPause()) return; if ( (sjoy.button[1]) || (sjoy.button[2])) { g_dglos.g_talkInfo.active = false; *presult = g_dglos.g_talkInfo.line_return[g_dglos.g_talkInfo.cur]; SoundPlayEffect(17, 22050,0,0,0); if (g_dglos.g_talkInfo.script != 0) { //we need to continue a script run_script(g_dglos.g_talkInfo.script); } } } CL_Vec2f NativeToDinkCoords(CL_Vec2f vPos) { return CL_Vec2f( g_dglo.m_orthoRenderRect.left+ vPos.x * g_dglo.m_orthoRenderRect.GetWidth()/GetScreenSizeXf(), vPos.y *g_dglo.m_orthoRenderRect.GetHeight()/GetScreenSizeYf()); } void DinkSetCursorPosition(CL_Vec2f vPos) { if (g_sprite[1].active) if (g_sprite[1].brain == 13) { g_sprite[1].x = vPos.x; g_sprite[1].y = vPos.y; } } void UpdateCursorPosition(int dx, int dy) { /* * Pick up any leftover fuzz from last time. This is important * when scaling down mouse motions. Otherwise, the user can * drag to the right extremely slow for the length of the table * and not get anywhere. */ if (g_sprite[1].active) if (g_sprite[1].brain == 13) { g_sprite[1].x += dx; g_sprite[1].y += dy; /* Clip the cursor to our client area */ if (g_sprite[1].x > C_DINK_SCREENSIZE_X) g_sprite[1].x = C_DINK_SCREENSIZE_X; if (g_sprite[1].y > C_DINK_SCREENSIZE_Y) g_sprite[1].y = C_DINK_SCREENSIZE_Y; if (g_sprite[1].x < 0) g_sprite[1].x = 0; if (g_sprite[1].y < 0) g_sprite[1].y = 0; } /* if (g_gameMode == 1) { g_dglos.g_playerInfo.mouse += dy; //Msg("play mousey is now %d", play.mouse); } */ } void Scrawl_OnMouseInput(void) { /* if (g_lastMouseClick) { mouse1 = true; g_lastMouseClick = false; } if (g_lastMouseX != 0 || g_lastMouseY != 0) { g_lastMouseX = 0; g_lastMouseY = 0; } */ UpdateCursorPosition(0, 0); } void button_brain(int h ) { rtRect32 box; if (g_sprite[h].move_active) { process_move(h); return; } if (g_sprite[h].script == 0) return; box = g_dglos.g_picInfo[getpic(h)].hardbox; OffsetRect(&box, g_sprite[h].x, g_sprite[h].y); if (g_sprite[h].brain_parm == 0) { if (inside_box(g_sprite[1].x, g_sprite[1].y, box)) { g_sprite[h].brain_parm = 1; if (locate(g_sprite[h].script, "BUTTONON")) { run_script(g_sprite[h].script); return; } } } else { if (!inside_box(g_sprite[1].x, g_sprite[1].y, box)) { g_sprite[h].brain_parm = 0; if (locate(g_sprite[h].script, "BUTTONOFF")) { run_script(g_sprite[h].script); return; } } } } CL_Rect GetItemRectFromIndex(int num, bool magic) { int mx = 20; int my = 0; int vert = 0; if (magic == false) { mx = 260; my = 83; vert = ((num-1) / 4); mx += (((num-1) - (vert * 4)) * (18 + 65)); my += (vert * (20 + 55)); } else { mx = 45; my = 83; vert = ((num-1) / 2); mx += (((num-1) - (vert * 2)) * (18 + 65)); my += (vert * (20 + 55)); } return CL_Rect(mx, my, mx+65, my+55); } const int C_DINK_MAX_ITEMS = 16; const int C_DINK_MAX_MAGICS = 8; void SetCurInventoryPositionIndex(int itemIndex, bool bIsMagic) { g_dglos.g_playerInfo.item_magic = bIsMagic; g_dglos.g_playerInfo.curitem = itemIndex; } bool DinkSetInventoryPosition(CL_Vec2f vPos) { if (g_itemScreenActive) { for (int i = 1; i < C_DINK_MAX_MAGICS+1; i++) { if (GetItemRectFromIndex(i, true).contains(vPos)) { SetCurInventoryPositionIndex(i, true); return true; } } for (int i = 1; i < C_DINK_MAX_ITEMS+1; i++) { if (GetItemRectFromIndex(i, false).contains(vPos)) { SetCurInventoryPositionIndex(i, false); return true; } } } return false; //invalid } void draw_item(int num, bool magic, int mseq, int mframe) { CL_Rectf r = GetItemRectFromIndex(num, magic); check_seq_status(mseq); if (g_pSpriteSurface[g_dglos.g_seq[mseq].frame[mframe]] == NULL) { if (!magic) { LogMsg("Whups, item %d seq %d frame %d not loaded, killed it", num, mseq, mframe); g_dglos.g_playerInfo.g_itemData[num].active = false; } else { LogMsg("Whups, magic %d seq %d frame %d not loaded, killed it", num, mseq, mframe); g_dglos.g_playerInfo.g_MagicData[num].active = false; } return; } int ddrval = lpDDSBack->BltFast( r.left, r.top, g_pSpriteSurface[g_dglos.g_seq[mseq].frame[mframe]], &g_dglos.g_picInfo[g_dglos.g_seq[mseq].frame[mframe]].box, DDBLTFAST_SRCCOLORKEY); } void process_item( void ) { rtRect32 rcRect; rcRect.left = 0; rcRect.top = 0; rcRect.right = C_DINK_SCREENSIZE_X; rcRect.bottom = C_DINK_SCREENSIZE_Y; int hor, virt; int ddrval; ddrval = lpDDSBack->BltFast( 0, 0, lpDDSBackGround, &rcRect, DDBLTFAST_NOCOLORKEY); if (!check_seq_status(423)) return; //lets blit the main screen over it ddrval = lpDDSBack->BltFast( 20, 0, g_pSpriteSurface[g_dglos.g_seq[423].frame[1]], &g_dglos.g_picInfo[g_dglos.g_seq[423].frame[1]].box, DDBLTFAST_SRCCOLORKEY); //draw all currently owned items; magic int i; for (i = 1; i < C_DINK_MAX_MAGICS+1; i++) { if (g_dglos.g_playerInfo.g_MagicData[i].active) draw_item(i, true, g_dglos.g_playerInfo.g_MagicData[i].seq,g_dglos.g_playerInfo.g_MagicData[i].frame); } //draw all currently owned items; normal for ( i = 1; i < C_DINK_MAX_ITEMS+1; i++) { if (g_dglos.g_playerInfo.g_itemData[i].active) draw_item(i, false, g_dglos.g_playerInfo.g_itemData[i].seq,g_dglos.g_playerInfo.g_itemData[i].frame); } //draw selection box around armed weapon if (*pcur_weapon != 0) if (g_dglos.g_playerInfo.g_itemData[*pcur_weapon].active) draw_item(*pcur_weapon, false, 423, 4); //draw selection box around armed magic if (*pcur_magic != 0) if (g_dglos.g_playerInfo.g_itemData[*pcur_magic].active) draw_item(*pcur_magic, true, 423, 5); //draw the selector around it, alternating from 2 to 3 if (g_dglos.g_playerInfo.curitem < 1) g_dglos.g_playerInfo.curitem = 1; if (g_dglos.g_dinkTick > g_dglos.item_timer) { if (g_dglos.item_pic == 2) g_dglos.item_pic = 3; else g_dglos.item_pic = 2; g_dglos.item_timer = g_dglos.g_dinkTick + 400; } draw_item(g_dglos.g_playerInfo.curitem, g_dglos.g_playerInfo.item_magic, 423, g_dglos.item_pic); if (!g_dglos.g_playerInfo.item_magic) { hor = (g_dglos.g_playerInfo.curitem - (((g_dglos.g_playerInfo.curitem-1) / 4) * 4)); virt = ((g_dglos.g_playerInfo.curitem-1) / 4); //choosing weapon/item if (sjoy.button[1]|| sjoy.button[4]) { if (g_dglos.g_playerInfo.g_itemData[g_dglos.g_playerInfo.curitem].active) { //arm weapon SoundPlayEffect(18, 42050,0,0,0); if (*pcur_weapon != 0) { //disarm old weapon if (locate(g_dglos.weapon_script, "DISARM")) run_script(g_dglos.weapon_script); } //load weapons script *pcur_weapon = g_dglos.g_playerInfo.curitem; g_dglos.weapon_script = load_script(g_dglos.g_playerInfo.g_itemData[*pcur_weapon].name, 1000, false); if (locate(g_dglos.weapon_script, "ARM")) run_script(g_dglos.weapon_script); if (locate(g_dglos.weapon_script, "ARMMOVIE")) run_script(g_dglos.weapon_script); draw_status_all(); } else { //can't arm nothing, play sound } } else if (sjoy.rightd) { if (hor < 4) g_dglos.g_playerInfo.curitem++; SoundPlayEffect(11, 22050,0,0,0); } else if (sjoy.leftd) { if (hor > 1) { g_dglos.g_playerInfo.curitem--; SoundPlayEffect(11, 22050,0,0,0); } else { SoundPlayEffect(11, 22050,0,0,0); g_dglos.g_playerInfo.item_magic = true; g_dglos.g_playerInfo.curitem = (virt * 2) + 2; //switch to magic mode } } else if (sjoy.downd) { if (virt < 3) { g_dglos.g_playerInfo.curitem += 4; SoundPlayEffect(11, 22050,0,0,0); } } else if (sjoy.upd) { if (virt > 0) { g_dglos.g_playerInfo.curitem -= 4; SoundPlayEffect(11, 22050,0,0,0); } } } else { hor = (g_dglos.g_playerInfo.curitem - (((g_dglos.g_playerInfo.curitem-1) / 2) * 2)); virt = ((g_dglos.g_playerInfo.curitem-1) / 2); if (sjoy.button[1]|| sjoy.button[4]) { if (g_dglos.g_playerInfo.g_MagicData[g_dglos.g_playerInfo.curitem].active) { //arm magic SoundPlayEffect(18, 42050,0,0,0); if (*pcur_magic != 0) { //disarm old weapon if (locate(g_dglos.magic_script, "DISARM")) run_script(g_dglos.magic_script); } //load magics script *pcur_magic = g_dglos.g_playerInfo.curitem; g_dglos.magic_script = load_script(g_dglos.g_playerInfo.g_MagicData[*pcur_magic].name, 1000, false); if (locate(g_dglos.magic_script, "ARM")) run_script(g_dglos.magic_script); if (locate(g_dglos.magic_script, "ARMMOVIE")) run_script(g_dglos.magic_script); draw_status_all(); } else { //can't arm nothing, play sound } } if (sjoy.rightd) { if (hor < 2) { g_dglos.g_playerInfo.curitem++; SoundPlayEffect(11, 22050,0,0,0); } else { g_dglos.g_playerInfo.item_magic = false; g_dglos.g_playerInfo.curitem = (virt * 4) +1; SoundPlayEffect(11, 22050,0,0,0); } } else if (sjoy.leftd) { if (hor > 1) { g_dglos.g_playerInfo.curitem--; SoundPlayEffect(11, 22050,0,0,0); } } else if (sjoy.downd) { if (virt < 3) { g_dglos.g_playerInfo.curitem += 2; SoundPlayEffect(11, 22050,0,0,0); } } else if (sjoy.upd) { if (virt > 0) { g_dglos.g_playerInfo.curitem -= 2; SoundPlayEffect(11, 22050,0,0,0); } } } if (g_dglos.g_talkInfo.active) { assert(!"People use this?") ; process_talk(); } //g_dglo.SetViewOverride(DinkGlobals::VIEW_ZOOMED); //a special process callbacks for just stuff that was created in this mode? // process_callbacks_special(); flip_it(); if (sjoy.button[1] || sjoy.button[4]) { SoundPlayEffect(17, 22050,0,0,0); g_itemScreenActive = false; g_dglo.SetViewOverride(DinkGlobals::VIEW_NONE); } } void process_animated_tiles( void ) { rtRect32 rcRect; int cool; int flip; int pa; //process water tiles if (water_timer < g_dglos.g_dinkTick) { water_timer = g_dglos.g_dinkTick + ((rand() % 2000)); flip = ((rand() % 2)+1); int tileScreenID; for (int x=0; x<96; x++) { //redink1 fix for first broken water tile if (g_dglos.g_smallMap.t[x].num >= 896) if (g_dglos.g_smallMap.t[x].num < (896+128)) { cool = g_dglos.g_smallMap.t[x].num / 128; pa = g_dglos.g_smallMap.t[x].num - (cool * 128); rcRect.left = (pa * 50- (pa / 12) * 600); rcRect.top = (pa / 12) * 50; rcRect.right = rcRect.left + 50; rcRect.bottom = rcRect.top + 50; tileScreenID = cool+flip; bool bRequireRebuild; LoadTileScreenIfNeeded(tileScreenID, bRequireRebuild); g_tileScreens[tileScreenID]->UpdateLastUsedTime(); lpDDSBackGround->BltFast( (x * 50 - ((x / 12) * 600))+g_gameAreaLeftOffset, (x / 12) * 50, g_tileScreens[tileScreenID], &rcRect, DDBLTFAST_NOCOLORKEY| DDBLTFAST_WAIT ); } } } //end of water processing if (fire_forward) fire_flip++; if (!fire_forward) fire_flip--; if (fire_flip < 1) { fire_flip = 5; fire_forward = false; } int tileScreenID; for (int x=0; x<96; x++) { //redink1 fix for first broken fire tile if (g_dglos.g_smallMap.t[x].num >= 2304) if (g_dglos.g_smallMap.t[x].num < (2304+128)) { cool = g_dglos.g_smallMap.t[x].num / 128; pa = g_dglos.g_smallMap.t[x].num - (cool * 128); rcRect.left = (pa * 50- (pa / 12) * 600); rcRect.top = (pa / 12) * 50; rcRect.right = rcRect.left + 50; rcRect.bottom = rcRect.top + 50; tileScreenID = cool+fire_flip; bool bRequireRebuild; LoadTileScreenIfNeeded(tileScreenID, bRequireRebuild); g_tileScreens[tileScreenID]->UpdateLastUsedTime(); lpDDSBackGround->BltFast( (x * 50 - ((x / 12) * 600))+g_gameAreaLeftOffset, (x / 12) * 50, g_tileScreens[tileScreenID], &rcRect, DDBLTFAST_NOCOLORKEY| DDBLTFAST_WAIT ); } } } void ThinkShowBmp() { if ( (sjoy.button[1]) || (sjoy.button[2]) || (sjoy.button[3]) || (sjoy.button[4]) || (sjoy.button[5]) || (sjoy.button[6]) ) { g_dglos.g_bShowingBitmap.active = false; if (g_dglos.g_bShowingBitmap.script != 0) run_script(g_dglos.g_bShowingBitmap.script); g_dglos.g_bShowingBitmap.stime = g_dglos.g_dinkTick+2000; g_dglos.but_timer = g_dglos.g_dinkTick + 200; int sprite = say_text_xy("", 1, 440, 0); g_sprite[sprite].noclip = 1; } } void process_show_bmp( void ) { rtRect32 rcRect(0,0,C_DINK_SCREENSIZE_X, C_DINK_SCREENSIZE_Y); lpDDSBack->BltFast( 0, 0, lpDDSBuffer, &rcRect, DDBLTFAST_NOCOLORKEY); if (g_dglos.g_bShowingBitmap.showdot) { //let's display a nice dot to mark where they are on the map int x = g_dglos.g_playerInfo.last_map - 1; int mseq = 165; if (check_seq_status(mseq)) { g_dglos.g_bShowingBitmap.picframe++; if (g_dglos.g_bShowingBitmap.picframe > g_dglos.g_seq[mseq].last) g_dglos.g_bShowingBitmap.picframe = 1; int mframe = g_dglos.g_bShowingBitmap.picframe; lpDDSBack->BltFast( (x % 32) * 20, (x / 32) * 20, g_pSpriteSurface[g_dglos.g_seq[mseq].frame[mframe]], &g_dglos.g_picInfo[g_dglos.g_seq[mseq].frame[mframe]].box, DDBLTFAST_SRCCOLORKEY| DDBLTFAST_WAIT ); } } } void drawscreenlock( void ) { DrawRect(g_dglo.m_gameArea, MAKE_RGBA( (255-80)+ 80*(SinToZeroToOneRange(SinGamePulseByMS(1000))),0,0,255)); //TODO draw screenlock if (check_seq_status(423, 9)) { lpDDSBack->BltFast(0, 0, g_pSpriteSurface[g_dglos.g_seq[423].frame[9]], &g_dglos.g_picInfo[g_dglos.g_seq[423].frame[9]].box , DDBLTFAST_NOCOLORKEY ); } if (check_seq_status(423, 10)) { //draw the screenlock icon lpDDSBack->BltFast(620, 0, g_pSpriteSurface[g_dglos.g_seq[423].frame[10]], &g_dglos.g_picInfo[g_dglos.g_seq[423].frame[10]].box , DDBLTFAST_NOCOLORKEY ); } } void ThinkSprite(int h, bool get_frame) { if (g_sprite[h].active) { int move_result = 0; if (GetBaseApp()->GetGameTickPause()) { goto past; } g_sprite[h].moveman = 0; //init thing that keeps track of moving path g_sprite[h].lpx[0] = g_sprite[h].x; g_sprite[h].lpy[0] = g_sprite[h].y; //last known legal cords g_sprite[h].skiptimer++; //inc delay, used by "skip" by all sprites // box_crap = g_dglos.g_picInfo[getpic(h)].box; if (g_sprite[h].kill > 0) { if (g_sprite[h].kill_timer == 0) g_sprite[h].kill_timer = g_dglos.g_dinkTick; if (g_sprite[h].kill_timer + g_sprite[h].kill < g_dglos.g_dinkTick) { g_sprite[h].active = false; // Msg("Killing sprite %d.", h); get_last_sprite(); if (g_sprite[h].callback > 0) { // Msg("Callback running script %d.", spr[h].script); run_script(g_sprite[h].callback); } } } if (g_sprite[h].timer > 0) { if (g_dglos.g_dinkTick > g_sprite[h].wait) { g_sprite[h].wait = g_dglos.g_dinkTick + g_sprite[h].timer; }else { goto animate; } } //brains - predefined bahavior patterns available to any sprite if (g_sprite[h].notouch) if (g_dglos.g_dinkTick > g_sprite[h].notouch_timer) g_sprite[h].notouch = false; if (get_frame == false) { if ( (g_sprite[h].brain == 1)/* || (spr[h].brain == 9) || (spr[h].brain == 3) */ ) { run_through_touch_damage_list(h); } if (g_sprite[h].brain == 1) { if (g_dglos.process_warp == 0) human_brain(h); } if (g_sprite[h].brain == 2) bounce_brain(h); if (g_sprite[h].brain == 0) no_brain(h); if (g_sprite[h].brain == 3) duck_brain(h); if (g_sprite[h].brain == 4) pig_brain(h); if (g_sprite[h].brain == 5) one_time_brain(h); if (g_sprite[h].brain == 6) repeat_brain(h); if (g_sprite[h].brain == 7) one_time_brain_for_real(h); if (g_sprite[h].brain == 8) text_brain(h); if (g_sprite[h].brain == 9) pill_brain(h); if (g_sprite[h].brain == 10) dragon_brain(h); if (g_sprite[h].brain == 11) missile_brain(h, true); if (g_sprite[h].brain == 12) scale_brain(h); if (g_sprite[h].brain == 13) mouse_brain(h); if (g_sprite[h].brain == 14) button_brain(h); if (g_sprite[h].brain == 15) shadow_brain(h); if (g_sprite[h].brain == 16) people_brain(h); if (g_sprite[h].brain == 17) missile_brain_expire(h); } else { goto past; } if (::g_b_kill_app) return; animate: if (g_sprite[h].brain != 13) { move_result = check_if_move_is_legal(h); } if (g_dglos.flub_mode != -500) { #ifdef _DEBUG LogMsg("move result is %d", g_dglos.flub_mode); #endif move_result = g_dglos.flub_mode; g_dglos.flub_mode = -500; } if (g_sprite[h].brain == 1) if (move_result > 100) { if (g_dglos.g_smallMap.sprite[move_result-100].prop == 1) special_block(move_result - 100, h); } if (g_sprite[h].reverse) { //reverse instructions if (g_sprite[h].seq > 0) { if (g_sprite[h].frame < 1) { // new anim g_sprite[h].pseq = g_sprite[h].seq; g_sprite[h].pframe = g_dglos.g_seq[g_sprite[h].seq].last; g_sprite[h].frame = g_dglos.g_seq[g_sprite[h].seq].last; if (g_sprite[h].frame_delay != 0) g_sprite[h].delay = (g_dglos.g_dinkTick+ g_sprite[h].frame_delay); else g_sprite[h].delay = (g_dglos.g_dinkTick + g_dglos.g_seq[g_sprite[h].seq].delay[g_dglos.g_seq[g_sprite[h].seq].last]); } else { // not new anim //is it time? if (g_dglos.g_dinkTick > g_sprite[h].delay) { g_sprite[h].frame--; if (g_sprite[h].frame_delay != 0) g_sprite[h].delay = (g_dglos.g_dinkTick + g_sprite[h].frame_delay); else g_sprite[h].delay = (g_dglos.g_dinkTick + g_dglos.g_seq[g_sprite[h].seq].delay[g_sprite[h].frame]); g_sprite[h].pseq = g_sprite[h].seq; g_sprite[h].pframe = g_sprite[h].frame; if (g_dglos.g_seq[g_sprite[h].seq].frame[g_sprite[h].frame] < 2) { g_sprite[h].pseq = g_sprite[h].seq; g_sprite[h].pframe = g_sprite[h].frame+1; g_sprite[h].frame = 0; g_sprite[h].seq_orig = g_sprite[h].seq; g_sprite[h].seq = 0; g_sprite[h].nocontrol = false; if (h == 1) if (in_this_base(g_sprite[h].seq_orig,g_dglos.mDinkBasePush)) { g_dglos.g_playerInfo.push_active = false; if (g_dglos.g_playerInfo.push_dir == 2) if (sjoy.down) g_dglos.g_playerInfo.push_active = true; if (g_dglos.g_playerInfo.push_dir == 4) if (sjoy.left) g_dglos.g_playerInfo.push_active = true; if (g_dglos.g_playerInfo.push_dir == 6) if (sjoy.right) g_dglos.g_playerInfo.push_active = true; if (g_dglos.g_playerInfo.push_dir == 8) if (sjoy.up) g_dglos.g_playerInfo.push_active = true; goto past; } } if (g_sprite[h].seq > 0) if (g_dglos.g_seq[g_sprite[h].seq].special[g_sprite[h].frame] == 1) { //this sprite can damage others right now! //lets run through the list and tag sprites who were hit with their damage run_through_tag_list(h, g_sprite[h].strength); } } } } } else { if (g_sprite[h].seq > 0) if (g_sprite[h].picfreeze == 0) { if (g_sprite[h].frame < 1) { // new anim g_sprite[h].pseq = g_sprite[h].seq; g_sprite[h].pframe = 1; g_sprite[h].frame = 1; if (g_sprite[h].frame_delay != 0) g_sprite[h].delay = g_dglos.g_dinkTick + g_sprite[h].frame_delay; else g_sprite[h].delay = (g_dglos.g_dinkTick + g_dglos.g_seq[g_sprite[h].seq].delay[1]); } else { // not new anim //is it time? if (g_dglos.g_dinkTick > g_sprite[h].delay) { g_sprite[h].frame++; if (g_sprite[h].frame_delay != 0) g_sprite[h].delay = g_dglos.g_dinkTick + g_sprite[h].frame_delay; else g_sprite[h].delay = (g_dglos.g_dinkTick + g_dglos.g_seq[g_sprite[h].seq].delay[g_sprite[h].frame]); g_sprite[h].pseq = g_sprite[h].seq; g_sprite[h].pframe = g_sprite[h].frame; if (g_dglos.g_seq[g_sprite[h].seq].frame[g_sprite[h].frame] == -1) { g_sprite[h].frame = 1; g_sprite[h].pseq = g_sprite[h].seq; g_sprite[h].pframe = g_sprite[h].frame; if (g_sprite[h].frame_delay != 0) g_sprite[h].delay = g_dglos.g_dinkTick + g_sprite[h].frame_delay; else g_sprite[h].delay = (g_dglos.g_dinkTick + g_dglos.g_seq[g_sprite[h].seq].delay[g_sprite[h].frame]); } //if (g_sprite[h].frame == g_dglos.g_seqData[g_sprite[h].seq].last+1) if (g_dglos.g_seq[g_sprite[h].seq].frame[g_sprite[h].frame] < 1) { g_sprite[h].pseq = g_sprite[h].seq; g_sprite[h].pframe = g_sprite[h].frame-1; g_sprite[h].frame = 0; g_sprite[h].seq_orig = g_sprite[h].seq; g_sprite[h].seq = 0; g_sprite[h].nocontrol = false; if (h == 1) if (in_this_base(g_sprite[h].seq_orig,g_dglos.mDinkBasePush)) { g_dglos.g_playerInfo.push_active = false; if (g_dglos.g_playerInfo.push_dir == 2) if (sjoy.down) g_dglos.g_playerInfo.push_active = true; if (g_dglos.g_playerInfo.push_dir == 4) if (sjoy.left) g_dglos.g_playerInfo.push_active = true; if (g_dglos.g_playerInfo.push_dir == 6) if (sjoy.right) g_dglos.g_playerInfo.push_active = true; if (g_dglos.g_playerInfo.push_dir == 8) if (sjoy.up) g_dglos.g_playerInfo.push_active = true; goto past; } } if (g_sprite[h].seq > 0) if (g_dglos.g_seq[g_sprite[h].seq].special[g_sprite[h].frame] == 1) { //this sprite can damage others right now! //lets run through the list and tag sprites who were hit with their damage run_through_tag_list(h, g_sprite[h].strength); } } } } } if (g_sprite[h].active && g_sprite[h].brain == 1) { did_player_cross_screen(true, h); } past: check_sprite_status(h); draw_sprite_game(lpDDSBack,h); } } void SetupFirstScript() { //memset(&g_sprite[1], 0, sizeof(g_sprite[1])); g_sprite[1].speed = 3; g_sprite[1].timer = 0; g_sprite[1].brain = 1; g_sprite[1].hard = 1; g_sprite[1].pseq = 2; g_sprite[1].pframe = 1; g_sprite[1].seq = 2; g_sprite[1].dir = 2; g_sprite[1].damage = 0; g_sprite[1].strength = 10; g_sprite[1].defense = 0; g_sprite[1].skip = 0; g_sprite[1].alt.Clear(); g_sprite[1].base_idle = 10; g_sprite[1].base_walk = -1; g_sprite[1].size = 100; g_sprite[1].base_hit = 100; g_sprite[1].active = true; if (!g_dglo.m_dmodGameDir.empty()) { int crap2 = add_sprite(0,450,8,0,0); g_sprite[crap2].hard = 1; g_sprite[crap2].noclip = 1; strcpy(g_sprite[crap2].text, g_dglos.dversion_string); g_sprite[crap2].damage = -1; g_sprite[crap2].owner = 1000; } int scr = load_script("START",1000, true); if (locate(scr, "MAIN") == false) { LogMsg("Error: Can't locate MAIN in script START!"); } run_script(scr); if (!g_dglo.m_dmodGameDir.empty()) { g_dglos.g_gameMode = 1; } } void DrawDinkText(int max_s, int32 *rank) { int h; for (int j = 1; j < max_s+1; j++) { if (g_dglos.plane_process) h = rank[j]; else h = j; if (h > 0) if (g_sprite[h].active) { if (g_sprite[h].brain == 8) { //LogMsg("Drawing text %d..", h); text_draw(h); } } } } void updateFrame() { if (!lpDDSBack || g_dglo.m_curLoadState != FINISHED_LOADING) return; bool bRenderDinkText = true; g_dinkFadeAlpha = 0; if (g_dglos.bFadedDown) g_dinkFadeAlpha = 1; #ifdef _DEBUG int cur = 0; for (int i=0; i < C_MAX_SPRITES_AT_ONCE; i++) { if (g_sprite[i].active) cur = i; } assert(cur <= g_dglos.last_sprite_created); //LogMsg("Script: %d, callbacks: %d", GetScriptsActive(), GetCallbacksActive()); //check_seq_status(18); //check_seq_status(102); //check_seq_status(104); //FreeSequence(); #endif bool bSpeedUp = false; if (IsDesktop()) { #ifdef WIN32 //skip the slow ass transition if TAB is held, useful for testing /* if (GetAsyncKeyState(9)) { bSpeedUp = true; } */ #endif /* if (GetAsyncKeyState(VK_F1)) { SaveStateWithExtra(); } if (GetAsyncKeyState(VK_F8)) { string fName = DinkGetSavePath()+"quicksave.dat"; if (FileExists(fName)) { LoadStateWithExtra(); } else { ShowQuickMessage("No state to load yet."); } } */ } #ifdef _DEBUG /* if (GetAsyncKeyState('C')) { LogMsg("Writing and loading state"); SaveState(GetSavePath()+"state.dat"); LoadState(GetSavePath()+"state.dat", false); //DinkUnloadGraphicsCache(); } */ #endif if (DinkGetSpeedUpMode()) { bSpeedUp = true; } if (bSpeedUp) { if (!GetApp()->GetGameTickPause()) { GetApp()->SetGameTick(GetApp()->GetGameTick()+GetApp()->GetDeltaTick()*5); } } byte state[256]; rtRect32 rcRect; bool bCaptureScreen = false; int h,j; bool bs[C_MAX_SPRITES_AT_ONCE]; int highest_sprite; g_abort_this_flip = false; ProcessGraphicGarbageCollection(); //620 SetOrthoRenderSize(g_dglo.m_orthoRenderRect.right, g_dglo.m_orthoRenderRect.GetHeight(), -g_dglo.m_orthoRenderRect.left, -g_dglo.m_orthoRenderRect.top); if (5 > 9) { trigger_start: g_bInitiateScreenMove = false; bCaptureScreen = true; } check_joystick(); #ifdef C_DINK_KEYBOARD_INPUT if (GetApp()->GetCheatsEnabled()) { if ( (GetKeyboard(68)) && (GetKeyboard(18)) ) { if (g_DebugKeyTimer < GetApp()->GetGameTick()) { g_DebugKeyTimer = GetApp()->GetGameTick()+500; if (debug_mode) { debug_mode = false; LogMsg("Debug mode off"); } else { debug_mode = true; LogMsg("Debug mode on"); } } } } #endif if (g_dglos.g_gameMode == 1) { Scrawl_OnMouseInput(); } else { if (g_dglos.keep_mouse) { if ((g_dglos.g_talkInfo.active) || (g_sprite[1].brain == 13)) Scrawl_OnMouseInput(); } } #ifdef _WIN32 static int LastWindowsTimer = 0; if (!bSpeedUp) { //Sleep(50); while (GetTickCount() <= LastWindowsTimer) { Sleep(0); } } LastWindowsTimer = GetTickCount(); #else /* static uint32 lastTick = 0; if (!GetBaseApp()->GetGameTickPause()) { while (GetSystemTimeTick()-lastTick < 33) { } } lastTick = GetSystemTimeTick(); */ #endif g_dglos.lastTickCount = g_dglos.g_dinkTick; g_dglos.g_dinkTick = GetBaseApp()->GetGameTick(); int fps_final = g_dglos.g_dinkTick - g_dglos.lastTickCount; //redink1 changed to 12-12 from 10-15... maybe work better on faster computers? if (fps_final < 12) fps_final = 12; if (fps_final > 68) fps_final = 68; g_dglos.base_timing = fps_final / 3; if (g_dglos.base_timing < 4) g_dglos.base_timing = 4; int junk3; //redink1 added these changes to set Dink's speed correctly, even on fast machines. if (g_dglos.dinkspeed <= 0) junk3 = 0; else if (g_dglos.dinkspeed == 1) junk3 = 12; else if (g_dglos.dinkspeed == 2) junk3 = 6; else if (g_dglos.dinkspeed == 3) junk3 = 3; else junk3 = 1; junk3 *= (g_dglos.base_timing / 4); g_sprite[1].speed = junk3; if (g_dglos.g_bShowingBitmap.active) { //grab main loop and divert it to show a bmp instead process_show_bmp(); ThinkShowBmp(); bRenderDinkText = false; goto flip; } g_dglos.mbase_count++; if (g_dglos.g_dinkTick > g_dglos.g_DinkUpdateTimerMS+100) { g_dglos.mbase_timing = (g_dglos.mbase_count / 100); g_dglos.g_DinkUpdateTimerMS = g_dglos.g_dinkTick; if (g_dglos.g_bowStatus.active) g_dglos.g_bowStatus.hitme = true; if (*pupdate_status == 1) update_status_all(); update_sound(); //TODO Animated tiles if (IsDesktop()) { //TODO: Maybe mobile can handle this now? process_animated_tiles(); } } state[1] = 0; //figure out frame rate if (g_itemScreenActive) { process_item(); bRenderDinkText = false; if (!g_dglo.m_curView == DinkGlobals::VIEW_ZOOMED) { BlitGUIOverlay(); } goto flip; } ProcessTransition(); if (g_dglos.process_upcycle) { up_cycle(); } if (g_dglos.process_warp > 0) process_warp_man(); if (g_dglos.process_downcycle) { down_cycle(); } int max_s; if (g_dglos.plane_process) { memset(&bs,0,sizeof(bs)); max_s = g_dglos.last_sprite_created; int height; for (int r1 = 1; r1 < max_s+1; r1++) { highest_sprite = 22024; //more than it could ever be g_spriteRank[r1] = 0; for (int h1 = 1; h1 < max_s+1; h1++) { if (g_sprite[h1].active) if (g_sprite[h1].disabled == false) { if (bs[h1] == false) { //Msg( "Ok, %d is %d", h1,(spr[h1].y + k[spr[h1].pic].yoffset) ); if (g_sprite[h1].que != 0) height = g_sprite[h1].que; else height = g_sprite[h1].y; if ( height < highest_sprite ) { highest_sprite = height; g_spriteRank[r1] = h1; } } } } if (g_spriteRank[r1] != 0) bs[g_spriteRank[r1]] = true; } } else { //not processing planes max_s = C_MAX_SPRITES_AT_ONCE; } rcRect.left = 0; rcRect.top = 0; rcRect.right = C_DINK_SCREENSIZE_X; rcRect.bottom = C_DINK_SCREENSIZE_Y; //Blit from Two, which holds the base scene. lpDDSBack->BltFast( 0, 0, lpDDSBackGround, &rcRect, DDBLTFAST_NOCOLORKEY); g_dglo.m_bgSpriteMan.Render(lpDDSBack); //blit sprites that have been shoved into the bg, too slow to actually add them, so we fake it until the screen is rebuilt if (!g_bTransitionActive) { BlitGUIOverlay(); } for ( j = 1; j < max_s+1; j++) { if (g_dglos.plane_process) h = g_spriteRank[j]; else h = j; //Msg( "Ok, rank %d is %d", j,h); if (h > 0) { ThinkSprite(h, g_bTransitionActive || g_dglos.g_stopEntireGame == 1); } } EndProcessTransition(); if (g_dglos.g_stopEntireGame == 1) { if (g_dglos.g_talkInfo.active) { process_talk(); } else { g_dglos.g_stopEntireGame = 0; //BuildScreenBackground(false); draw_status_all(); } bRenderDinkText = false; goto flip; } if (g_bTransitionActive) { //don't actually think or process game stuff bRenderDinkText = false; goto flip; } if ( (sjoy.joybit[7] == true) ) { //space is pressed, lets draw the hitmap, why not? if (!no_cheat) DrawCollision(); } if (g_dglos.g_gameMode == 2) { g_dglos.g_gameMode = 3; load_map(g_MapInfo.loc[*pmap]); BuildScreenBackground(); g_dglos.g_guiLife = *plife; if (g_dglos.keep_mouse == 0) { //kill the mouse here? g_dglo.UnSetViewOverride(); } } if (g_sprite[1].active) if (g_sprite[1].brain == 1) did_player_cross_screen(false, 1); if (g_bInitiateScreenMove) { goto trigger_start; } if (g_dglos.screenlock == 1) { #ifdef _DEBUG if (debug_mode) { g_dglos.screenlock = 0; } #endif drawscreenlock(); } if (!GetBaseApp()->GetGameTickPause()) { if (g_dglos.g_talkInfo.active) process_talk(); process_callbacks(); } flip: if (g_dinkFadeAlpha *255 > 1) { //g_dglo.m_gameArea.bottom++; //hack to fix a little glitchy line if (IsDrawingDinkStatusBar()) { DrawFilledRect(g_dglo.m_gameArea, MAKE_RGBA(0,0,0,g_dinkFadeAlpha* 255)); } else { DrawFilledRect(g_dglo.m_orthoRenderRect, MAKE_RGBA(0,0,0,g_dinkFadeAlpha* 255)); } //g_dglo.m_gameArea.bottom--; } if (::g_b_kill_app) return; if (!g_abort_this_flip) { flip_it(); } if (bRenderDinkText) DrawDinkText(max_s, g_spriteRank); RemoveOrthoRenderSize(); if (turn_on_plane) g_dglos.plane_process = true; BlitSecondTransitionScreen(); if (g_bTransitionActive) { SetOrthoRenderSize(C_DINK_SCREENSIZE_X, g_dglo.m_orthoRenderRect.GetHeight(), 0, -g_dglo.m_orthoRenderRect.top); BlitGUIOverlay(); RemoveOrthoRenderSize(); } if (bCaptureScreen) { //reset the timer because we probably just wasted a bunch loading crap g_dglo.m_transitionTimer = GetBaseApp()->GetGameTick(); } if (!GetBaseApp()->GetGameTickPause()) { UpdateControlsGUIIfNeeded(); } } void load_batch(int linesToProcess, float &percentOut) { static int iLineCount = 0; if (!g_dglo.m_iniScanner.IsLoaded()) { //first pass, open the file iLineCount = 0; if (!g_dglo.m_iniScanner.LoadFile(GetFileLocationString("dink.ini"), false)) { LogMsg("dink.ini not found."); assert(0); return; } g_sprite[1].x = 200; g_sprite[1].y = 300; } for (int i=0; i < linesToProcess; i++) { pre_figure_out(g_dglo.m_iniScanner.GetLine(iLineCount).c_str(), 0, true); iLineCount++; if (iLineCount == g_dglo.m_iniScanner.m_lines.size()) { for (int b=0; b < g_dglo.m_iniScanner.m_lines.size(); b++) { pre_figure_out(g_dglo.m_iniScanner.GetLine(b).c_str(), 0, false); } program_idata(); percentOut = 1; g_dglo.m_iniScanner.Kill(); return; } ProcessGraphicGarbageCollection(); } //we'll need to come back do the rest percentOut = float(iLineCount) / float(g_dglo.m_iniScanner.m_lines.size()); } void SetDinkGameState(eDinkGameState state) { g_dinkGameState = state; } eDinkGameState GetDinkGameState() { return g_dinkGameState; } void SetDefaultVars(bool bFullClear) { ResetDinkTimers(); g_dglo.m_lastActiveView = g_dglo.VIEW_NONE; g_dglo.UnSetViewOverride(); g_dglo.m_lastGameMode = DINK_GAME_MODE_NONE; g_dglo.m_lastSubGameMode = DINK_SUB_GAME_MODE_NONE; g_dglo.m_bFullKeyboardActive = false; g_dglo.m_bWaitingForSkippableConversation = false; g_dglos.g_DinkUpdateTimerMS =0; memset(g_dglo.m_dirInput, 0, sizeof(DINK_INPUT_COUNT*sizeof(bool))); memset(g_dglo.m_dirInputFinished, 0, sizeof(DINK_INPUT_COUNT*sizeof(bool))); clear_talk(); no_transition = false; g_abort_this_flip = false; g_dglos.screenlock = 0; sound_on = true; g_dglos.g_pushingEnabled = 1; turn_on_plane = false; g_dglos.item_pic = 2; fire_forward = 0; g_dglos.g_stopEntireGame = 0; g_bInitiateScreenMove = false; g_bTransitionActive = false; debug_mode = false; #ifdef _DEBUG //debug_mode = true; //script debugging mode #endif g_dglos.flub_mode = -500; g_dglos.last_sprite_created = 1; decipher_savegame = 0; g_dglos.bFadedDown = false; g_dglos.smooth_follow = false; g_dglos.mSwapped = false; g_dglos.mLoopMidi = false; g_dglos.mDinkBasePush = 310; g_dglos.walk_off_screen = 0; g_dglos.keep_mouse = 0; g_dglos.show_dot = false; g_dglos.plane_process = true; g_dglos.weapon_script = 0; g_dglos.magic_script = 0; g_dglos.last_sprite_created; g_dglos.no_running_main = false; g_dglos.process_warp = 0; g_dglos.process_upcycle = false; g_dglos.process_downcycle = false; g_dglos.cycle_clock = 0; g_dglos.cycle_script = 0; g_dglos.but_timer = 0; g_dglo.m_bgSpriteMan.Clear(); no_cheat = !GetApp()->GetCheatsEnabled(); g_itemScreenActive = false; g_dglos.midi_active = true; last_saved_game = 0; g_b_kill_app = false; //if true, will close app as soon as the message pump is g_dglos.dinkspeed = 3; memset(&g_dglos.g_bShowingBitmap, 0, sizeof(ShowingBitmapInfo)); memset(&g_dglos.g_bowStatus, 0, sizeof(attackinfo_struct)); g_dglos.g_returnint = 0; g_dglos.bKeepReturnInt = false; g_dglos.process_count = 0; if (bFullClear) { g_dglo.m_curLoadState = 0; g_dglo.m_bSpeedUpMode = false; g_dglos.m_bRenderBackgroundOnLoad = false; memset(g_dglos.m_bufferForExpansion, 0, sizeof(g_dglos.m_bufferForExpansion)); memset(g_dglos.g_picInfo, 0, sizeof(pic_info)*C_MAX_SPRITES); //memset(g_id, '\0', sizeof(idata) * max_idata); memset(g_dglos.g_seq, 0, sizeof(sequence) * C_MAX_SEQUENCES); kill_all_vars(); //it zero's out the player struct strcpy(g_dglos.current_map, "map.dat"); strcpy(g_dglos.current_dat,"dink.dat"); memset(&short_play, 0, sizeof(player_short_info)); //redink1 code for version change strcpy(g_dglos.dversion_string, "v1.10"); strcpy(g_dglos.save_game_info, "Level &level"); g_dglos.g_curPicIndex = 1; //GetBaseApp()->SetGameTick(0); //can cause problems .. don't do it here g_dglos.time_start = GetBaseApp()->GetGameTick(); g_dglos.g_playerInfo.minutes = 0; } } //in some cases, we include DMOD's with the app, but they are static and can't be changed string GetDMODStaticRootPath() { if (GetPlatformID() == PLATFORM_ID_IOS) { return GetBaseAppPath()+"dmods/"; } return ""; //unused } string GetDMODRootPath() { #if defined(WIN32) || defined(PLATFORM_HTML5) string dmodpath = "dmods/"; vector parms = GetBaseApp()->GetCommandLineParms(); for (int i=0; i < parms.size(); i++) { if (parms[i] == "-dmodpath") { if (parms.size() > i+1) { dmodpath = ""; for (int n=i+1; n < parms.size(); n++) { dmodpath +=parms[n]; if (n < parms.size()-1) { dmodpath += " "; } } StringReplace("\\", "/", dmodpath); if (dmodpath[dmodpath.size()-1] != '/') dmodpath += '/'; //need a trailing slash } else { LogMsg("-dmodpath used wrong"); } } } return dmodpath; #endif if (GetPlatformID() == PLATFORM_ID_WEBOS) { return "dmods/"; } return GetAppCachePath(); } void InitDinkPaths(string gamePath, string gameDir, string dmodGameDir) { string dmodPath; if (!dmodGameDir.empty()) { dmodPath = RemoveTrailingBackslash(GetPathFromString(dmodGameDir)); dmodPath += "/"; //fixing problem with multiple slashes showing up on some OS's and am too lazy to "realyl" fix it or even correct that typo I just made dmodGameDir = RemoveTrailingBackslash (GetFileNameFromString(dmodGameDir)); if (dmodPath == dmodGameDir) { //it's the old format that doesn't include the full path too, guess dmodPath = GetDMODRootPath(); dmodPath = RemoveTrailingBackslash(dmodPath); } } StringReplace("/", "", dmodGameDir); StringReplace("\\", "", dmodGameDir); g_dglo.m_gamePath = gamePath; g_dglo.m_gameDir = gameDir+"/"; g_dglo.m_gamePathWithDir = g_dglo.m_gamePath + g_dglo.m_gameDir; if (dmodGameDir.empty()) { g_dglo.m_savePath = GetSavePath()+g_dglo.m_gameDir; g_dglo.m_dmodGamePathWithDir.clear(); g_dglo.m_dmodGameDir.clear(); } else { g_dglo.m_dmodGameDir = dmodGameDir+"/"; g_dglo.m_savePath = GetDMODRootPath()+g_dglo.m_dmodGameDir; g_dglo.m_dmodGamePathWithDir = dmodPath+g_dglo.m_dmodGameDir; } } bool InitDinkEngine() { OneTimeDinkInit(); finiObjects(); SetDefaultVars(true); g_dglo.SetView(DinkGlobals::VIEW_FULL); g_b_kill_app = false; #ifdef C_DINK_KEYBOARD_INPUT while (keypressed()); //clear keyboard buffer #endif return true; } //call this repeately until progress == 1 bool LoadGameChunk(int gameIDToLoad, float &progressOut) { switch(g_dglo.m_curLoadState) { case 0: progressOut = 0.05f; if (!InitializeVideoSystem()) { return false; } //redink1 init for color depth information assert(!lpDDSBackGround); //init back buffer at 8 bit, if highcolor is needed later it will auto convert lpDDSBackGround = InitOffscreenSurface(C_DINK_SCREENSIZE_X, C_DINK_SCREENSIZE_Y, IDirectDrawSurface::MODE_SHADOW_GL, false); fill_screen(0); //fill background with blank to start things off lpDDSBuffer = InitOffscreenSurface(C_DINK_SCREENSIZE_X, C_DINK_SCREENSIZE_Y, IDirectDrawSurface::MODE_SHADOW_GL); if (!lpDDSBuffer ) return false; //blit_background(); sound_on = InitSound(); break; case 1: progressOut = 0.1f; LogMsg("loading tilescreens..."); /* for (int h=1; h < C_TILE_SCREEN_COUNT; h++) { if (!LoadTileScreenIfNeeded(h)) return false; } */ LogMsg("Done with tilescreens..."); break; case 2: { //this one is going to get called a lot... progressOut = 0.2f; //LogMsg("loading batch..."); float percent = 0; load_batch(20, percent); //get the progress meter to update within the range of this chunk type progressOut += .5 * percent; if (percent != 1) { //call this one again next time return true; } } break; case 3: progressOut = 0.7f; LogMsg("done loading batch"); if (!load_hard()) return false; break; //Activate dink, but don't really turn him on g_sprite[1].timer = 33; //copy from player info g_sprite[1].x = g_dglos.g_playerInfo.x; g_sprite[1].y = g_dglos.g_playerInfo.y; // ** SETUP ** g_dglos.last_sprite_created = 1; g_dglos.g_gameMode = 0; case 4: progressOut = 0.75; load_info(); break; case 5: progressOut = 0.8f; #ifdef C_DINK_KEYBOARD_INPUT //clear keyboard buffer for (int x=0; x<256; x++) { GetKeyboard(x); } #endif for (int u = 1; u <= 10; u++) g_dglos.g_playerInfo.button[u] = u; for (int x1=1; x1 <= 10; x1++) { sjoy.letgo[x1] = true; } init_font_colors(); //lets run our init script int script; break; case 6: StopMidi(); progressOut = 0.9f; script = load_script("main", 0, true); locate(script, "main"); run_script(script); attach(); break; case 7: progressOut = 0.97f; //first time init SetupFirstScript(); //to load a game.. // script = load_script("instant_load", 1000, true); if (gameIDToLoad == 0) { if (g_dglo.m_dmodGameDir.empty()) { //to start from scatch script = load_script("newgame", 1000, true); locate(script, "main"); run_script(script); } } else { if (!load_game(gameIDToLoad)) { LogError("Couldn't load save game"); } } break; case 8: progressOut = 1; g_dglo.m_curLoadState = FINISHED_LOADING-1; break; default: assert(!"oops"); } g_dglo.m_curLoadState++; return true; } void DinkGlobals::SetView( eView view ) { if (m_viewOverride != VIEW_NONE) { view = m_viewOverride; } else { m_curView = view; } switch (view) { case VIEW_ZOOMED: if (GetFakePrimaryScreenSizeX() != 0) { // g_dglo.m_nativeGameArea = rtRectf(0,0,GetPrimaryGLX(),GetPrimaryGLY()); g_dglo.m_nativeGameArea = rtRectf(0,0,GetScreenSizeX(),GetScreenSizeY()); } else { g_dglo.m_nativeGameArea = rtRectf(0,0,GetScreenSizeX(),GetScreenSizeY()); } g_dglo.m_gameArea = rtRect32 (20, 0, 620, 400); g_dglo.m_orthoRenderRect = rtRect32 (20, 0, 620, 400); break; case VIEW_FULL_WITHOUT_EDGES: g_dglo.m_nativeGameArea = rtRectf(0,0,480,267); g_dglo.m_gameArea = rtRect32 (20, 0, 620, 400); g_dglo.m_orthoRenderRect = rtRect32 (20, 0, 620, 480); break; case VIEW_FULL: { g_dglo.m_gameArea = rtRect32 (20, 0, 620, 400); float aspect = (float(C_DINK_SCREENSIZE_X)/GetScreenSizeXf()); float aspectY = (float(C_DINK_SCREENSIZE_Y)/GetScreenSizeYf()); g_dglo.m_nativeGameArea = rtRectf(float(g_dglo.m_gameArea.left)/ aspect,0,float(g_dglo.m_gameArea.right)/aspect,float(g_dglo.m_gameArea.bottom)/aspectY); g_dglo.m_orthoRenderRect = rtRect32 (0, 0, 640, 480); #ifdef _DEBUG LogMsg("Rect %s AspectX: %.4f, Aspect Y: %.4f", PrintRect(g_dglo.m_nativeGameArea).c_str(), aspect, aspectY); #endif } break; default: assert(!"Unhandled view"); } g_dglo.m_fontSize = 1.24; if (IsIPADSize || IsDesktop()) { //the screens are big enough here were we can keep the text smaller, comparable to the original Dink g_dglo.m_fontSize = 0.88f; } if (IsLargeScreen()) { g_dglo.m_fontSize = 0.88f; g_dglo.m_fontSize *= (C_DINK_SCREENSIZE_X/GetScreenSizeXf()); } } void DinkGlobals::SetViewOverride( eView view ) { m_viewOverride = view; SetView(m_curView); } void DinkGlobals::UnSetViewOverride() { m_viewOverride = VIEW_NONE; SetView(m_curView); } void DinkGlobals::ToggleView() { if (g_bTransitionActive) return; //now is a bad time.. if (m_curView == VIEW_FULL) { SetView(VIEW_ZOOMED); } else if (m_curView == VIEW_ZOOMED) { SetView(VIEW_FULL); } else { assert(!"huh?"); } } void DinkUnloadGraphicsCache() { GetAudioManager()->KillCachedSounds(false, true, 0, 1, false); DinkUnloadUnusedGraphicsByUsageTime(100); //unload anything not used in the last second #ifdef _WIN32 /* if (GetKeyboard(18)) { for (int i=1; i < C_MAX_SEQUENCES; i++) { FreeSequence(i); } } */ #endif } //to help with debugging something.. bool IsCorruptedSeq(int seq) { return false; if (g_dglos.g_seq[seq].frame[1] != 0) { if (g_pSpriteSurface[g_dglos.g_seq[seq].frame[1]]) { //the first deal has something in it. But do they all? for (int g=0; g < g_dglos.g_seq[seq].last; g++) { if (!g_pSpriteSurface[g_dglos.g_seq[seq].frame[1] + g]) { LogMsg("bad.."); } } } } //looks blank return false; } //send in 1000*60 and all images not used in the last one minute will be destroyed void DinkUnloadUnusedGraphicsByUsageTime(unsigned int timeMS) { const unsigned int tickMS = GetBaseApp()->GetGameTick(); unsigned int mostRecentUsageTick = 0; for (int i=1; i < C_MAX_SEQUENCES; i++) { for (int g=0; g < g_dglos.g_seq[i].last; g++) { //assert(g_dglos.g_picInfo[g_dglos.g_seq[i].frame[1]+g].pSurface); if (g_pSpriteSurface[g_dglos.g_seq[i].frame[1] + g]) { if (g_pSpriteSurface[g_dglos.g_seq[i].frame[1] + g]->m_gameTickOfLastUse+timeMS <= tickMS) { SAFE_DELETE(g_pSpriteSurface[g_dglos.g_seq[i].frame[1] + g]); } } } } for (int i=1; i < C_TILE_SCREEN_COUNT; i++) { if (g_tileScreens[i]) { if (g_tileScreens[i]->m_gameTickOfLastUse + timeMS <= tickMS) { SAFE_DELETE(g_tileScreens[i]); } } } } void ProcessGraphicGarbageCollection() { //unload images that haven't been used in a while. If we accidentally unload the wrong one, or all of them, no harm done, the engine //will reload them as needed. /* if (GetBaseApp()->GetTexMemUsed() < 1024*1024*13) return; static uint32 garbageTimer = 0; if (garbageTimer < GetBaseApp()->GetGameTick()) { garbageTimer = GetBaseApp()->GetGameTick()+5000; } else { return; } LogMsg("Garbage collection.."); DinkUnloadUnusedGraphicsByUsageTime(1000*120); */ if (GetBaseApp()->GetMemUsed() > C_DINK_MEM_MAX_ALLOWED || GetBaseApp()->GetTexMemUsed() > C_DINK_TEX_MEM_MAX_ALLOWED) { DinkUnloadUnusedGraphicsByUsageTime(1000*5); GetAudioManager()->KillCachedSounds(false, true, 5000, 1,false); if (GetBaseApp()->GetMemUsed() > C_DINK_MEM_CACHE_MAX_ALLOWED_AFTER_A_DUMP || GetBaseApp()->GetTexMemUsed() > C_DINK_TEX_MEM_MAX_ALLOWED_AFTER_A_DUMP) { //still having problems.. let's go deeper DinkUnloadUnusedGraphicsByUsageTime(1000*3); if (GetBaseApp()->GetMemUsed() > C_DINK_MEM_CACHE_MAX_ALLOWED_AFTER_A_DUMP || GetBaseApp()->GetTexMemUsed() > C_DINK_TEX_MEM_MAX_ALLOWED_AFTER_A_DUMP) { //still having problems.. let's go deeper DinkUnloadUnusedGraphicsByUsageTime(1000*1); if (GetBaseApp()->GetMemUsed() > C_DINK_MEM_CACHE_MAX_ALLOWED_AFTER_A_DUMP || GetBaseApp()->GetTexMemUsed() > C_DINK_TEX_MEM_MAX_ALLOWED_AFTER_A_DUMP) { //still having problems.. let's go deeper DinkUnloadUnusedGraphicsByUsageTime(0); //GetAudioManager()->KillCachedSounds(false, false, 5000, 1, true); } } } } } eDinkGameMode GetDinkGameMode() { if (g_itemScreenActive) return DINK_GAME_MODE_INVENTORY; if (g_dglos.g_gameMode == 1 || g_sprite[1].brain == 13) return DINK_GAME_MODE_MOUSE; if (g_dglos.g_gameMode == 2) return DINK_GAME_MODE_NORMAL; //loading a map I guess if (g_dglos.g_gameMode == 3) return DINK_GAME_MODE_NORMAL; if (g_dglos.g_gameMode == 0) return DINK_GAME_MODE_NORMAL; //uhh.. dink died? assert(!"Unknown mode"); return DINK_GAME_MODE_NORMAL; } bool IsDrawingDinkStatusBar() { return *pupdate_status != 0; } eDinkSubGameMode GetDinkSubGameMode() { if (g_dglos.g_bShowingBitmap.active) return DINK_SUB_GAME_MODE_SHOWING_BMP; if (g_dglos.g_talkInfo.active) return DINK_SUB_GAME_MODE_DIALOG; //default return DINK_SUB_GAME_MODE_NONE; } bool SaveHeader(FILE *fp) { SaveToFile(SAVE_FORMAT_VERSION, fp); SaveToFile(g_dglo.m_dmodGamePathWithDir, fp); SaveToFile(g_dglo.m_gameDir, fp); SaveToFile((uint32)GetApp()->GetGameTick(), fp); return true; } bool LoadHeader(FILE *fp) { float version; LoadFromFile(version, fp); if (version < SAVE_FORMAT_VERSION) { LogMsg("Save state from newer version?!"); return false; } LoadFromFile(g_dglo.m_dmodGameDir, fp); LoadFromFile(g_dglo.m_gameDir, fp); uint32 gameTime; LoadFromFile(gameTime, fp); GetApp()->SetGameTick(gameTime); //let's initialize our data based on this InitDinkPaths(GetBaseAppPath(), RemoveTrailingBackslash(g_dglo.m_gameDir), RemoveTrailingBackslash(g_dglo.m_dmodGameDir)); return true; } bool SaveSoundState(FILE *fp) { if (!GetAudioManager()->IsPlaying(GetAudioManager()->GetLastMusicID())) { g_dglo.m_lastMusicPath = ""; } SaveToFile(g_dglo.m_lastMusicPath, fp); if (g_dglo.m_lastMusicPath.empty()) { SaveToFile(uint32(0), fp); } else { SaveToFile(GetAudioManager()->GetPos(GetAudioManager()->GetLastMusicID()), fp); } fwrite(&soundinfo, 1, sizeof(soundstruct)*(num_soundbanks+1), fp); for (int i=0; i < max_sounds; i++) { SaveToFile(g_soundInfo[i].m_fileName, fp); } for (int i=1; i < num_soundbanks; i++) { if (soundbank[i].IsInUse()) { if (soundinfo[i].repeat) { SaveToFile(i, fp); SaveToFile(soundinfo[i].owner, fp); SaveToFile(soundinfo[i].survive, fp); SaveToFile(soundinfo[i].repeat, fp); SaveToFile(soundinfo[i].vol, fp); SaveToFile(soundinfo[i].freq, fp); SaveToFile(soundbank[i].m_soundIDThatPlayedUs, fp); } } } //signal that we're done SaveToFile((int32)0, fp); return true; } bool LoadSoundState(FILE *fp) { LoadFromFile(g_dglo.m_lastMusicPath, fp); uint32 pos; LoadFromFile(pos, fp); if (!g_dglo.m_lastMusicPath.empty()) { PlayMidi(g_dglo.m_lastMusicPath.c_str()); GetAudioManager()->SetPos(GetAudioManager()->GetLastMusicID(), pos); } fread(&soundinfo, 1, sizeof(soundstruct)*(num_soundbanks+1), fp); for (int i=0; i < max_sounds; i++) { LoadFromFile(g_soundInfo[i].m_fileName, fp); } int32 bankNum; while(1) { LoadFromFile(bankNum, fp); if (bankNum == 0) break; int32 owner; LoadFromFile(owner, fp); int32 survive; LoadFromFile(survive, fp); int32 repeat; LoadFromFile(repeat, fp); int32 vol; LoadFromFile(vol, fp); int32 freq; LoadFromFile(freq, fp); int32 soundID; LoadFromFile(soundID, fp); playbank(soundID, freq, 0, owner, repeat, bankNum); soundinfo[bankNum].survive = survive; } return true; } bool SaveScriptState(FILE *fp) { //first save the actual script data for (int32 i = 1; i < C_MAX_SCRIPTS; i++) { if (g_scriptInstance[i]) { SaveToFile(i, fp); fwrite(g_scriptInstance[i], 1, sizeof(refinfo), fp); //now write the actual script fwrite(g_scriptBuffer[i], 1, g_scriptInstance[i]->end, fp); } } SaveToFile((int32)0, fp); //signal end return true; } bool SaveSpriteState(FILE *fp) { for (int32 i=0; i < C_MAX_SPRITES_AT_ONCE; i++) { if (g_customSpriteMap[i] != 0) { g_sprite[i].m_containsSpriteMapData = 1; //signal we have additional sprite data } else { g_sprite[i].m_containsSpriteMapData = 0; } fwrite(&g_sprite[i], sizeof(SpriteStruct), 1, fp); if (g_customSpriteMap[i] != 0) { int32 count = g_customSpriteMap[i]->size(); SaveToFile(count, fp); //let them know how many are coming std::map::iterator itor = g_customSpriteMap[i]->begin(); while (itor != g_customSpriteMap[i]->end()) { SaveToFile((*itor).first, fp); SaveToFile((*itor).second, fp); itor++; } } } return true; //success } bool LoadSpriteState(FILE *fp) { for (int i=0; i < C_MAX_SPRITES_AT_ONCE; i++) { SAFE_DELETE(g_customSpriteMap[i]); fread(&g_sprite[i], sizeof(SpriteStruct), 1, fp); if (g_sprite[i].m_containsSpriteMapData != 0) { int sizeofBool = sizeof(bool); int32 count; LoadFromFile(count, fp); g_customSpriteMap[i] = new std::map; for (int propCount = 0; propCount < count; propCount++) { string st; int32 value; LoadFromFile(st, fp); LoadFromFile(value, fp); //insert it (*g_customSpriteMap[i])[st] = value; } } } return true; //success } bool LoadScriptState(FILE *fp) { while (1) { int32 scriptID; LoadFromFile(scriptID, fp); if (scriptID == 0) break; //all done //load this script data assert(!g_scriptInstance[scriptID]); g_scriptInstance[scriptID] = (refinfo*) malloc(sizeof(refinfo)); fread(g_scriptInstance[scriptID], 1, sizeof(refinfo), fp); assert(!g_scriptBuffer[scriptID]); g_scriptBuffer[scriptID] = new char[g_scriptInstance[scriptID]->end+1]; g_scriptBuffer[scriptID][g_scriptInstance[scriptID]->end] = 0; fread(g_scriptBuffer[scriptID], 1,g_scriptInstance[scriptID]->end, fp); } return true; } bool SaveState(string const &path) { LogMsg("Saving %s", path.c_str()); CreateDirectoryRecursively(g_dglo.m_savePath, g_dglo.m_gameDir); FILE *fp = fopen(path.c_str(), "wb"); //why unload crap when you're saving?! //DinkUnloadUnusedGraphicsByUsageTime(0); if (!fp) { LogMsg("Error saving state"); return false; } bool bOk = true; bOk = SaveHeader(fp); if (bOk) { int dinkGloSize = sizeof(DinkGlobalsStatic); fwrite(&dinkGloSize, 1, sizeof(int), fp); fwrite(&g_dglos, 1, dinkGloSize, fp); } if (bOk) { bOk = SaveScriptState(fp); } if (bOk) { bOk = SaveSpriteState(fp); bOk = SaveSoundState(fp); } fclose(fp); return bOk; //success } bool LoadState(string const &path, bool bLoadPathsOnly) { LogMsg("Loading %s", path.c_str()); FILE *fp = fopen(path.c_str(), "rb"); if (!fp) { LogMsg("Unable to load state, file not found"); return false; } if (bLoadPathsOnly) { float version; LoadFromFile(version, fp); if (version < SAVE_FORMAT_VERSION) { LogMsg("Save state from newer version?!"); fclose(fp); return false; } fclose(fp); return true; } StopMidi(); DinkUnloadUnusedGraphicsByUsageTime(0); KillScriptAccelerators(); kill_all_sounds(); kill_all_scripts_for_real(); ResetDinkTimers(); g_dglo.m_bgSpriteMan.Clear(); g_dglo.UnSetViewOverride(); bool bOk = LoadHeader(fp); if (bOk) { //keep loading int dinkGloStaticSize = 0; fread(&dinkGloStaticSize, 1, sizeof(int32), fp); memset(&g_dglos, 0, sizeof(DinkGlobalsStatic)); fread(&g_dglos, 1, dinkGloStaticSize, fp); //kill the bad pointers to the graphics for (int i=0; i < C_MAX_SPRITES; i++) { g_pSpriteSurface[i] = NULL; } load_hard(); load_info(); } if (bOk) { bOk = LoadScriptState(fp); } if (bOk) { bOk = LoadSpriteState(fp); bOk = LoadSoundState(fp); } fclose(fp); if (!attach()) { return false; } if ( g_dglos.g_gameMode > 2 || g_dglos.m_bRenderBackgroundOnLoad) { BuildScreenBackground(false); } if (g_dglos.g_bShowingBitmap.active) { CopyBitmapToBackBuffer(g_dglos.g_lastBitmapShown); } return bOk; //success } void DinkModStrength(int mod) { *pstrength += mod; GetAudioManager()->Play("dink/sound/secret.wav"); } void DinkModDefense(int mod) { *pdefense += mod; GetAudioManager()->Play("dink/sound/secret.wav"); } void DinkModMagic(int mod) { *pmagic+= mod; GetAudioManager()->Play("dink/sound/secret.wav"); } void DinkModLifeMax(int mod) { *plifemax += mod; *plife += mod; GetAudioManager()->Play("dink/sound/secret.wav"); } void DinkFillLife() { *plife = *plifemax; } void DinkModGold(int mod) { *pgold += mod; GetAudioManager()->Play("dink/sound/secret.wav"); } Surface* DinkGetMagicIconImage() { if (*pcur_magic == 0) return NULL; item_struct *pItem = &g_dglos.g_playerInfo.g_MagicData[*pcur_magic]; int picID = g_dglos.g_seq[pItem->seq].frame[pItem->frame]; if (picID == 0) return NULL; check_pic_status(picID); return g_pSpriteSurface[picID]->GetGLSuface(); } Surface* DinkGetWeaponIconImage() { if (*pcur_weapon == 0) return NULL; item_struct *pItem = &g_dglos.g_playerInfo.g_itemData[*pcur_weapon]; int picID = g_dglos.g_seq[pItem->seq].frame[pItem->frame]; if (picID == 0) return NULL; check_pic_status(picID); return g_pSpriteSurface[picID]->GetGLSuface(); } float DinkGetMagicChargePercent() { if (*pmagic_cost > 0 && *pmagic_level > 0) { return float(*pmagic_level) / float(*pmagic_cost); } return 0; } float DinkGetHealthPercent() { if (*plifemax > 0) { return float(*plife)/ float(*plifemax); } return 0; } bool DinkIsDoingScreenTransition() { return g_bTransitionActive; } string DinkGetSavePath() { return g_dglo.m_savePath; } void DinkAddBow() { add_item("item-b2", 438, 12, false); } bool DinkGetSpeedUpMode() { return g_dglo.m_bSpeedUpMode; } void DinkSetSpeedUpMode(bool bSpeedup) { g_dglo.m_bSpeedUpMode = bSpeedup; } void SaveStateWithExtra() { if (!lpDDSBack || g_dglo.m_curLoadState != FINISHED_LOADING) return; LogMsg("Saving state"); GetAudioManager()->Play("audio/quick_save.wav"); SaveState(DinkGetSavePath()+"quicksave.dat"); ShowQuickMessage("State saved."); }; void SaveAutoSave() { LogMsg("Saving autosave"); //GetAudioManager()->Play("audio/quick_save.wav"); SaveState(DinkGetSavePath()+"autosave.dat"); //add extra info because I don't want to change the save format uint32 minutes = ( GetBaseApp()->GetGameTick()-g_dglos.time_start) / (1000*60); VariantDB db; db.GetVar("minutes")->Set(minutes); db.GetVar("description")->Set("Level "+toString(*plevel)); #ifdef _DEBUG LogMsg("Saving autosave to %s", (DinkGetSavePath()+"autosavedb.dat").c_str()); #endif db.Save(DinkGetSavePath()+"autosavedb.dat", false); ShowQuickMessage("(Auto-saved)"); }; void LoadStateWithExtra() { if (!lpDDSBack || g_dglo.m_curLoadState != FINISHED_LOADING) return; //LogMsg("Loading state"); string fName = DinkGetSavePath()+"quicksave.dat"; GetAudioManager()->Play("audio/quick_load.wav"); LoadState(fName, false); ShowQuickMessage("State loaded."); }; //note, you must glPopMatrix(); yourself if you use this... void ApplyAspectRatioGLMatrix() { glMatrixMode(GL_MODELVIEW); glPushMatrix(); if (g_dglo.m_aspectRatioModX == 1.0f && g_dglo.m_aspectRatioModY == 1.0f) { //not actually using this g_dglo.m_centeringOffset = CL_Vec3f(0,0,0); return; } //float offsetX = ((float)GetPrimaryGLX() - (float)C_DINK_SCREENSIZE_X) / 2; glScalef(g_dglo.m_aspectRatioModX, g_dglo.m_aspectRatioModY, 1); CL_Mat4f mat; glGetFloatv(GL_MODELVIEW_MATRIX, &mat[0]); //OPTIMIZE - All this can be cached... maybe done in RecomputeAspectRatio() mat.inverse(); CL_Vec3f vTotal = mat.get_transformed_point(CL_Vec3f(C_DINK_SCREENSIZE_X, C_DINK_SCREENSIZE_Y, 0)); CL_Vec3f vDinkSize = mat.get_transformed_point(CL_Vec3f(C_DINK_SCREENSIZE_X*g_dglo.m_aspectRatioModX, C_DINK_SCREENSIZE_Y *g_dglo.m_aspectRatioModY, 0)); //CL_Vec3f vScreenToWorldPixelMod; //vScreenToWorldPixelModvTotal.x / vDinkSize g_dglo.m_centeringOffset = (vTotal - vDinkSize)/2.0f; glTranslatef(g_dglo.m_centeringOffset.x, g_dglo.m_centeringOffset.y, 0); //glGetFloatv(GL_PROJECTION_MATRIX, &Matrix); } void RecomputeAspectRatio() { bool bStretchToFit = GetApp()->GetVar("check_stretch")->GetUINT32() != 0; if (bStretchToFit || g_dglo.GetActiveView() == DinkGlobals::VIEW_ZOOMED) { g_dglo.m_aspectRatioModX = 1.0f; g_dglo.m_aspectRatioModY = 1.0f; } else { float aspect_r = (float)GetPrimaryGLX() / (float)GetPrimaryGLY(); // aspect ratio const float correctAspectRatio = (float)C_DINK_SCREENSIZE_X / (float)C_DINK_SCREENSIZE_Y; /* if (GetFakePrimaryScreenSizeX() != 0) { //more reliable way to get the aspect ratio aspect_r=(float)GetFakePrimaryScreenSizeX()/(float)GetFakePrimaryScreenSizeY(); // aspect ratio } */ float aspectChange = correctAspectRatio / aspect_r; if (aspectChange < 1.0f) { //width too big, but leave Y where it is g_dglo.m_aspectRatioModX = aspectChange; g_dglo.m_aspectRatioModY = 1.0f; } else { //opposite problem, leave width where it is, but scale Y g_dglo.m_aspectRatioModX = 1.0f; g_dglo.m_aspectRatioModY = aspect_r / correctAspectRatio; } } } void DinkReInitSurfacesAfterVideoChange() { if (GetDinkGameState() == DINK_GAME_STATE_PLAYING) { g_transitionSurf.HardKill(); //CheckTransitionSurface(); SAFE_DELETE(lpDDSBackGround); lpDDSBackGround = InitOffscreenSurface(C_DINK_SCREENSIZE_X, C_DINK_SCREENSIZE_Y, IDirectDrawSurface::MODE_SHADOW_GL, false); g_onePixelSurf.HardKill(); } RecomputeAspectRatio(); } void DinkOnForeground() { if (GetDinkGameState() == DINK_GAME_STATE_PLAYING) { bool bForceReinit = false; #ifdef WINAPI //force reinit on windows even if using iphone or android mode bForceReinit = true; #endif if (IsDesktop() || GetEmulatedPlatformID() == PLATFORM_ID_ANDROID || bForceReinit) //xoom needs this too after a suspend/resume from hitting the power button { LogMsg("Forcing surface unloads via DinkOnForeground"); DinkReInitSurfacesAfterVideoChange(); } //reinit any lost surfaces that we need to if ( g_dglos.g_gameMode > 2 || g_dglos.m_bRenderBackgroundOnLoad) { BuildScreenBackground(false); } if (g_dglos.g_bShowingBitmap.active) { CopyBitmapToBackBuffer(g_dglos.g_lastBitmapShown); } } } void WriteLastPathSaved(string dmodDir) { GetApp()->GetShared()->GetVar("last_saved_path")->Set(dmodDir); } string ReadLastPathSaved() { return GetApp()->GetShared()->GetVar("last_saved_path")->GetString(); }