From 28f4368651e2f88e53b551b4d210543aa84d0041 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Sat, 9 May 2009 14:11:39 +0000 Subject: [PATCH] Numerous changes to terrain and trim. The changes to the scneario editor work as expected. - New way of drawing walkway (doesn't work yet) - New way of drawing roads (doesn't yet work correctly) - New way of drawing trim (not tested yet) - New way of handling marked specials (works in editor but not in game) - New way of handling two-space rubble in the editor (works as expected) - Merged several terrain special properties - Deprecated several terrain graphics - Completed (probably) the import & convert code for old-format terrain - Probably other things that I have forgotten that have something to do with terrain - A few other little things, bugfixes, etc git-svn-id: http://openexile.googlecode.com/svn/trunk@56 4ebdad44-0ea0-11de-aab3-ff745001d230 --- .../bladespced.rsrc | Bin 122148 -> 104330 bytes osx/Scenario Editor/BOEScen.rsrc | Bin 305906 -> 303966 bytes osx/Scenario Editor/Blades of Exile Graphics | Bin 4353951 -> 5214769 bytes osx/Scenario Editor/scen.actions.cpp | 219 +++++++---- osx/Scenario Editor/scen.actions.h | 4 +- osx/Scenario Editor/scen.core.cpp | 12 +- osx/Scenario Editor/scen.graphics.cpp | 210 ++++++++-- osx/Scenario Editor/scen.keydlgs.cpp | 2 +- osx/Scenario Editor/scen.main.cpp | 2 +- osx/bladesofexile.rsrc | Bin 239402 -> 238084 bytes osx/boe.actions.cpp | 90 ++--- osx/boe.combat.cpp | 2 +- osx/boe.consts.h | 10 + osx/boe.fileio.cpp | 17 +- osx/boe.graphics.cpp | 359 +++++++++++------- osx/boe.graphics.h | 4 +- osx/boe.graphutil.cpp | 37 +- osx/boe.infodlg.cpp | 2 +- osx/boe.items.cpp | 24 +- osx/boe.locutils.cpp | 29 +- osx/boe.main.cpp | 2 +- osx/boe.monster.cpp | 17 +- osx/boe.newgraph.cpp | 8 +- osx/boe.party.cpp | 63 +-- osx/boe.specials.cpp | 335 +++++++++------- osx/boe.text.cpp | 6 +- osx/boe.town.cpp | 142 +++---- osx/classes.h | 1 + osx/classes/outdoors.cpp | 8 +- osx/classes/outdoors.h | 1 + osx/classes/regtown.cpp | 29 +- osx/classes/scenario.cpp | 5 +- osx/classes/terrain.cpp | 312 ++++++++++++++- osx/classes/terrain.h | 95 ++++- osx/classes/town.cpp | 10 +- osx/classes/town.h | 2 +- osx/tools/dlgutil.cpp | 6 +- osx/tools/fileio.cpp | 6 +- 38 files changed, 1435 insertions(+), 636 deletions(-) diff --git a/osx/Blades of Exile Char Editor/bladespced.rsrc b/osx/Blades of Exile Char Editor/bladespced.rsrc index b00aa23c6563d89203ffe9f44ff2bb769568e30b..d491d1af2a5521a04ec1b69548bc8730f6a01b10 100644 GIT binary patch delta 4660 zcmYk=3vd?I6~OUxzuiEowF(#z5V!~dLW~MANI(pMJcvM)*A%o2g8`ikpo55t3d=(V zVnm=3sjsP8spC{eC}MyRLY#>dBDK~hAR;O%ASNM+h(ObG{@WR4nAzVs_v~)I{qCL| zcx7kX$KPmkxro!hOE-vHvOy%dsl2gG)7HS9PA>njXXmZi-SUrCG!AvQl|{dl$fGYV zk^LfaRmTV9%5ix`lclZfpIdzYof5hMIb$bGk~Z$H{0Vva;@r-{QANG=_@9#EIYab# zQja%?OC(B)=W9OERgV@A(xa{?Zn`2AX4-Y^FiIXPumZT07a>o`-(c`lvc0$nM%W)%fCWv(Gkgb38*kfc- zu3oU?fIk!#7SE|D+3Oy1QP``s)l2ee{hShB zZSJJEQ}@P`aVK1A4*rX)a4T-4rmwkk3Lb{1;&i+k--v7Q5FE7-WLa=!Djtfb;X!yE z&cLB0hn0W7?R)9?{I*xa){9**`eF4uYdBoTg}uxpyyIh$mBX4wsr`39cf)A2;GUbDtFaE}n`H;MMp%t}%zvD1sJ( zOmj*q?vJP8et4ZZXvVd84?c%$%ze}G+js`9#_RE0cpt977j6GZu-$@w1MzM=3-7?s z;GOsYt~B>|co)vZ+ge*i`j_A;`~rRxzmK<(4scu>9G}nAk(*1utW( z$q$p4z1+GS-z2Yk8J~=Ame;*ZiZTdplr0)m;34vsmnj8!gj9ODqY~%H9xpTEr!`V) zz1-EA{3zM)Wp)Q?gST~9Cnn2RsCK3*!~53t9jdfDDl^V`X zA*Jpm^$|-4mB~Ew#-lMi4OI?MRf2QGOZkPJJIauv#yzI-w zE8IKkI=sf!dD%Z5Kk5Fh-iDuWA9<R^fw3Vtin5~tnw_i4j=QuQgUzvD$t zw8h#<)xEKHQgt@&j_<%a9cf-ScqH=Ebp++M@RLp^y6`$hIyR|mv5rk@Uae5aCiO+~ zIyH%$?1IxUUsI?vqvpqx*9ln7TM%-ulcnUZ)qEr;Hxh8;lQmeUUOj=0W4l^?j{H#b zsbrjml`;nq0Vt4-^Ujnjt5edjmKdfv9*Rx6zYhr zUPE3-Y;^_JK}LNT=i;+iXG4+G-La0|>MUGol*1e zV{Oms)A+dghjv&eW_1eI;ZvQ1b=Ff)!#aqn7vg5^{~D~fAfD-d*unxm{D%W(>)Tp$ zf;@e@J_&zeuTy<5{5c+uY1{QvF#~P=0!-VkUxyD-zsdHW1P2NDZsO^-p6@20^)@(8 zV1R7kF$N5l4Lru6&dzP%DFzIp4fCi!PkyyI%*3x@=E{az+>id>aLj_>0!0@w!(?L@ z%#hibi5V;#$Kz_NZ=8!6CL2pJLuTVfv$b%M#v1b5sXvN$rkq$G|Mvl33(kvHQ$73x6PMf9X`D@r{R^jz${TIK`{&Kal`^Y zMDugxwGE3jSKzgY-|B@vFx%j&`FbpgP9iOr;J%h`>1Xb#udcRUo~ZuYsfXrASzg*E z(!I2diEs9sM3#4*^#3FDPrF2ccNug*X_F}OE<1h_Nr^vtH$9u0EA$3#HuZu1aPGlZ zEFY{jFYJpy#c?OKAJjce-ll4CkMyycuy1Q*!8e@1g&uvL1x{EL{=Z0T7LCB1ylAG` zURTXOf#dwkzskS*EARcqi+P(8_JrKxI+2R9LvCK;_m@tbHD^}w{XVy3#+-Za{vScz B_iX?G delta 22540 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 UUU$QFYi}v6y8hZ5Zu*n|1;~4?O8@`> diff --git a/osx/Scenario Editor/BOEScen.rsrc b/osx/Scenario Editor/BOEScen.rsrc index 0850a69afc64aac9527743453df63b77f6809c2b..02101f66d2c7fabd319d9fbb60719c75fdd034ac 100644 GIT binary patch delta 9463 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 LHXeA=UzGH}RI7Sq diff --git a/osx/Scenario Editor/Blades of Exile Graphics b/osx/Scenario Editor/Blades of Exile Graphics index 7bc9000565f09c4950f1dfa80c1c051050df0144..1dc7f2d8f9dc52b63747f397f4e6fd780a1eae21 100644 GIT binary patch delta 197112 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 LuWz}23lIJe4K|az delta 5210 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 diff --git a/osx/Scenario Editor/scen.actions.cpp b/osx/Scenario Editor/scen.actions.cpp index 3243a109..f97f62e5 100644 --- a/osx/Scenario Editor/scen.actions.cpp +++ b/osx/Scenario Editor/scen.actions.cpp @@ -18,7 +18,7 @@ #include "scen.btnmg.h" - +extern Str255 current_string; Rect world_screen; // border rects order: top, left, bottom, right // Rect border_rect[4]; @@ -35,17 +35,17 @@ bool good_palette_buttons[2][6][10] = { { {1,1,1,1,1,1,1,1,0,0}, {1,1,1,1,1,1,0,1,0,0}, - {0,0,0,1,1,1,1,1,0,0}, + {0,0,1,1,1,1,1,1,0,0}, {0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0} }, { + {1,1,1,1,1,1,1,1,0,1}, + {1,1,1,1,1,1,0,0,0,1}, + {1,1,1,1,1,1,1,1,0,1}, + {1,1,1,0,1,1,1,1,0,1}, {1,1,1,1,1,1,1,1,0,0}, - {1,1,1,1,1,1,0,0,0,0}, - {1,1,1,1,1,1,1,1,0,0}, - {1,1,1,0,1,1,1,1,0,0}, - {1,1,1,1,1,1,0,1,0,0}, - {1,1,1,1,1,1,1,1,0,0} + {1,1,1,1,1,1,1,1,0,1} } }; cTown::cItem store_place_item = {loc(),-1,0,0,0,0,0}; @@ -85,18 +85,18 @@ short current_rs_top = 0; short out_buttons[6][10] = { {0, 1, 2, 3, 4, 5, 6, 7, -1,-1}, {10,11,12,13,14,15,-1,17,-1,-1}, - {-1,-1,-1,23,24,25,26,27,-1,-1}, + {-1,-1,46,23,24,25,26,27,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, }; short town_buttons[6][10] = { - {0, 1, 2, 3, 4, 5, 6, 7, -1,-1}, - {10,11,12,13,14,15,-1,-1,-1,-1}, - {20,21,22,23,24,25,26,27,-1,-1}, - {30,31,32,-1,34,35,36,37,-1,-1}, - {40,41,42,43,44,45,-1,47,-1,-1}, - {50,51,52,53,54,55,56,57,-1,-1}, + {0, 1, 2, 3, 4, 5, 6, 7, -1,9 }, + {10,11,12,13,14,15,-1,-1,-1,29}, + {20,21,22,23,24,25,26,27,-1,39}, + {30,31,32,-1,34,35,36,37,-1,49}, + {40,41,42,43,44,45,46,47,-1,-1}, + {50,51,52,53,54,55,56,57,-1,69}, }; cCreature last_placed_monst; @@ -429,17 +429,8 @@ bool handle_action(Point the_point,EventRecord event) { (spot_hit.y < 0) || (spot_hit.y > ((editing_town == true) ? town->max_dim() - 1 : 47))) ; else switch (overall_mode) { case MODE_DRAWING: - if (((mouse_button_held == false) && - (((editing_town == true) && (town->terrain(spot_hit.x,spot_hit.y) == current_terrain_type)) || - ((editing_town == false) && (current_terrain.terrain[spot_hit.x][spot_hit.y] == current_terrain_type)) || - ((is_mountain(spot_hit.x,spot_hit.y)) && (current_terrain_type >= 22) - && (current_terrain_type <= 35) && (current_terrain_type != 23)) || - ((is_erasable_water(spot_hit.x,spot_hit.y)) && (current_terrain_type >= 50)&& (current_terrain_type <= 62)) || - ((is_correctable_wall((short) spot_hit.x,(short) spot_hit.y)) - && (current_terrain_type >= 5) && (current_terrain_type <= 21) && (scenario.ter_types[current_terrain_type].blockage == 5)) || - ((is_hill(spot_hit.x,spot_hit.y)) && (current_terrain_type >= 36) && (current_terrain_type <= 49) - && (current_terrain_type != 37)))) || - ((mouse_button_held == true) && (erasing_mode == true))) { + if ((!mouse_button_held && terrain_matches(spot_hit.x,spot_hit.y,current_terrain_type)) || + (mouse_button_held && erasing_mode)) { set_terrain(spot_hit,current_ground); set_cursor(0); erasing_mode = true; @@ -529,11 +520,11 @@ bool handle_action(Point the_point,EventRecord event) { case 0: overall_mode = MODE_DRAWING; set_cursor(0); - set_string("Drawing mode",""); + set_string("Drawing mode",(char*)scenario.ter_types[current_terrain_type].name.c_str()); break; } break; - case MODE_TOGGLE_SPECIAL_DOT: + //case MODE_TOGGLE_SPECIAL_DOT: // town.special[spot_hit.x][spot_hit.y] = !town.special[spot_hit.x][spot_hit.y]; /*if (mouse_button_held == true) break; @@ -541,7 +532,7 @@ bool handle_action(Point the_point,EventRecord event) { take_special(spot_hit.x,spot_hit.y); else make_special(spot_hit.x,spot_hit.y); overall_mode = 0; */ - break; + //break; case MODE_LARGE_PAINTBRUSH: mouse_button_held = true; @@ -585,7 +576,7 @@ bool handle_action(Point the_point,EventRecord event) { overall_mode = MODE_DRAWING; set_cursor(0); - set_string("Drawing mode",""); + set_string("Drawing mode",(char*)scenario.ter_types[current_terrain_type].name.c_str()); break; case MODE_EDIT_ITEM: for (x = 0; x < 64; x++) @@ -693,6 +684,15 @@ bool handle_action(Point the_point,EventRecord event) { make_quickfire(spot_hit.x,spot_hit.y); overall_mode = MODE_DRAWING; break; + case MODE_TOGGLE_SPECIAL_DOT: + if(!editing_town){ + current_terrain.special_spot[spot_hit.x][spot_hit.y] = !current_terrain.special_spot[spot_hit.x][spot_hit.y]; + overall_mode = MODE_DRAWING; + break; + } + make_field_type(spot_hit.x, spot_hit.y, 1); + overall_mode = MODE_DRAWING; + break; case MODE_CLEAR_FIELDS: take_quickfire(spot_hit.x,spot_hit.y); take_force_barrier(spot_hit.x,spot_hit.y); @@ -700,6 +700,7 @@ bool handle_action(Point the_point,EventRecord event) { take_barrel(spot_hit.x,spot_hit.y); take_crate(spot_hit.x,spot_hit.y); take_web(spot_hit.x,spot_hit.y); + take_field_type(spot_hit.x, spot_hit.y, 1); for (i = 0; i < 8; i++) take_sfx(spot_hit.x,spot_hit.y,i); set_cursor(0); @@ -886,7 +887,7 @@ bool handle_action(Point the_point,EventRecord event) { break; } if ((overall_mode == MODE_DRAWING) && (old_mode != MODE_DRAWING)) - set_string("Drawing mode",""); + set_string("Drawing mode",(char*)scenario.ter_types[current_terrain_type].name.c_str()); draw_terrain(); } @@ -957,27 +958,27 @@ bool handle_action(Point the_point,EventRecord event) { flash_rect(temp_rect); switch (i + 100 * j) { case 0: - set_string("Drawing mode"," "); + set_string("Drawing mode",(char*)scenario.ter_types[current_terrain_type].name.c_str()); overall_mode = MODE_DRAWING; set_cursor(0); break; case 1: - set_string("Paintbrush (large)",""); + set_string("Paintbrush (large)",(char*)scenario.ter_types[current_terrain_type].name.c_str()); overall_mode = MODE_LARGE_PAINTBRUSH; set_cursor(2); break; case 2: - set_string("Paintbrush (small)",""); + set_string("Paintbrush (small)",(char*)scenario.ter_types[current_terrain_type].name.c_str()); set_cursor(2); overall_mode = MODE_SMALL_PAINTBRUSH; break; case 3: - set_string("Spraycan (large)",""); + set_string("Spraycan (large)",(char*)scenario.ter_types[current_terrain_type].name.c_str()); set_cursor(3); overall_mode = MODE_LARGE_SPRAYCAN; break; case 4: - set_string("Spraycan (small)",""); + set_string("Spraycan (small)",(char*)scenario.ter_types[current_terrain_type].name.c_str()); set_cursor(3); overall_mode = MODE_SMALL_SPRAYCAN; break; @@ -1054,7 +1055,10 @@ bool handle_action(Point the_point,EventRecord event) { break; case 202: if (editing_town == false) { - set_string("Edit placed item","Not while outdoors."); + //set_string("Edit placed item","Not while outdoors."); + set_string("Toggle special spot","Select location"); + overall_mode = MODE_TOGGLE_SPECIAL_DOT; + set_cursor(0); break; } set_string("Delete an item","Select item"); @@ -1154,6 +1158,11 @@ bool handle_action(Point the_point,EventRecord event) { overall_mode = MODE_PLACE_QUICKFIRE; set_cursor(0); break; + case 406: + set_string("Place special spot","Select location"); + overall_mode = MODE_TOGGLE_SPECIAL_DOT; + set_cursor(0); + break; case 407: set_string("Clear space","Select space to clear"); overall_mode = MODE_CLEAR_FIELDS; @@ -1267,10 +1276,13 @@ void swap_terrain() { void set_new_terrain(unsigned char selected_terrain) { current_terrain_type = selected_terrain; redraw_selected_ter(); - if (selected_terrain < 2) - current_ground = 0; - else if (selected_terrain < 5) - current_ground = 2; +// if (selected_terrain < 2) +// current_ground = 0; +// else if (selected_terrain < 5) +// current_ground = 2; + current_ground = get_ground_from_ter(selected_terrain); + p2cstr(current_string); + set_string((char*)current_string,(char*)scenario.ter_types[current_terrain_type].name.c_str()); } void handle_keystroke(char chr,char chr2,EventRecord event) { @@ -1803,9 +1815,50 @@ void unfrill_terrain() { draw_terrain(); } -void set_terrain(location l,unsigned char terrain_type) { +unsigned short find_object_part(unsigned char num, unsigned char x, unsigned char y, unsigned short fallback){ + for(int i = 0; i < 256; i++){ + if(scenario.ter_types[i].obj_num == num && + scenario.ter_types[i].obj_pos.x == x && + scenario.ter_types[i].obj_pos.y == y) + return i; + } + return fallback; +} + +unsigned short get_ground_from_ter(unsigned short ter){ + unsigned char ground = scenario.ter_types[ter].ground_type; + for(int i = 0; i < 256; i++) + if(scenario.ter_types[i].ground_type == ground) + return i; + return 0; +} + +bool terrain_matches(unsigned char x, unsigned char y, unsigned short ter){ + unsigned short ter2; + if(editing_town) ter2 = town->terrain(x,y); else ter2 = current_terrain.terrain[x][y]; + if(ter2 == ter) return true; + if(scenario.ter_types[ter2].ground_type != scenario.ter_types[ter].ground_type) + return false; + if(scenario.ter_types[ter].trim_type == TRIM_NONE && + scenario.ter_types[ter2].trim_type >= TRIM_S && + scenario.ter_types[ter2].trim_type <= TRIM_NW_INNER) + return ter == get_ground_from_ter(ter); + if(scenario.ter_types[ter2].trim_type == TRIM_NONE && + scenario.ter_types[ter].trim_type >= TRIM_S && + scenario.ter_types[ter].trim_type <= TRIM_NW_INNER) + return ter2 == get_ground_from_ter(ter2); + if(scenario.ter_types[ter2].trim_type >= TRIM_S && + scenario.ter_types[ter2].trim_type <= TRIM_NW_INNER && + scenario.ter_types[ter].trim_type >= TRIM_S && + scenario.ter_types[ter].trim_type <= TRIM_NW_INNER) + return true; + return false; +} + + +void set_terrain(location l,unsigned short terrain_type) { short i,j,which_sign = -1; - unsigned char ter; + unsigned short ter; location l2; i = l.x; @@ -1822,31 +1875,47 @@ void set_terrain(location l,unsigned char terrain_type) { else current_terrain.terrain[i][j] = terrain_type; l2 = l; - if (terrain_type == 85) { - l2.x++; - if (editing_town == true) - town->terrain(l2.x,l2.y) = 86; - else current_terrain.terrain[l2.x][l2.y] = 86; - } - if (terrain_type == 86) { - l2.x--; - if (editing_town == true) - town->terrain(l2.x,l2.y) = 85; - else current_terrain.terrain[l2.x][l2.y] = 85; - } - if (terrain_type == 88) { - l2.x++; - if (editing_town == true) - town->terrain(l2.x,l2.y) = 89; - else current_terrain.terrain[l2.x][l2.y] = 89; - } - if (terrain_type == 89) { - l2.x--; - if (editing_town == true) - town->terrain(l2.x,l2.y) = 88; - else current_terrain.terrain[l2.x][l2.y] = 88; + // Large objects (eg rubble) + if(scenario.ter_types[terrain_type].obj_num > 0){ + int q = scenario.ter_types[terrain_type].obj_num; + location obj_loc = scenario.ter_types[terrain_type].obj_pos; + location obj_dim = scenario.ter_types[terrain_type].obj_size; + while(obj_loc.x > 0) l2.x-- , obj_loc.x--; + while(obj_loc.y > 0) l2.y-- , obj_loc.y--; + for(i = 0; i < obj_dim.x; i++) + for(j = 0; j < obj_dim.y; j++){ + if (editing_town == true) + town->terrain(l2.x + i,l2.y + j) = find_object_part(q,i,j,terrain_type); + else current_terrain.terrain[l2.x + i][l2.y + j] = find_object_part(q,i,j,terrain_type); + } } + +// if (terrain_type == 85) { +// l2.x++; +// if (editing_town == true) +// town->terrain(l2.x,l2.y) = 86; +// else current_terrain.terrain[l2.x][l2.y] = 86; +// } +// if (terrain_type == 86) { +// l2.x--; +// if (editing_town == true) +// town->terrain(l2.x,l2.y) = 85; +// else current_terrain.terrain[l2.x][l2.y] = 85; +// } +// if (terrain_type == 88) { +// l2.x++; +// if (editing_town == true) +// town->terrain(l2.x,l2.y) = 89; +// else current_terrain.terrain[l2.x][l2.y] = 89; +// } +// if (terrain_type == 89) { +// l2.x--; +// if (editing_town == true) +// town->terrain(l2.x,l2.y) = 88; +// else current_terrain.terrain[l2.x][l2.y] = 88; +// } + // Correcting mountains? if (is_mountain(l.x,l.y)) for (i = l.x - 1; i < l.x + 2; i++) for (j = l.y - 1; j < l.y + 2; j++) { @@ -1880,7 +1949,7 @@ void set_terrain(location l,unsigned char terrain_type) { adjust_space(l); l.y--; - if ((scenario.ter_types[terrain_type].special == 11) && (editing_town == true)) { /// it's a sign + if ((scenario.ter_types[terrain_type].special == TER_SPEC_IS_A_SIGN) && (editing_town == true)) { /// it's a sign for (i = 0; i < 15; i++) if (which_sign < 0) { if ((town->sign_locs[i].x == l.x) && (town->sign_locs[i].y == l.y)) @@ -1892,7 +1961,7 @@ void set_terrain(location l,unsigned char terrain_type) { which_sign = i; else { ter = town->terrain(town->sign_locs[i].x,town->sign_locs[i].y); - if (scenario.ter_types[ter].special != 11) + if (scenario.ter_types[ter].special != TER_SPEC_IS_A_SIGN) which_sign = i; } } @@ -1910,7 +1979,7 @@ void set_terrain(location l,unsigned char terrain_type) { } mouse_button_held = false; } - if ((scenario.ter_types[terrain_type].special == 11) && (editing_town == false)) { /// it's a sign + if ((scenario.ter_types[terrain_type].special == TER_SPEC_IS_A_SIGN) && (editing_town == false)) { /// it's a sign if ((l.x == 0) || (l.x == 47) || (l.y == 0) || (l.y == 47)) { fancy_choice_dialog(870,0); mouse_button_held = false; @@ -1927,7 +1996,7 @@ void set_terrain(location l,unsigned char terrain_type) { which_sign = i; else { ter = current_terrain.terrain[current_terrain.sign_locs[i].x][current_terrain.sign_locs[i].y]; - if (scenario.ter_types[ter].special != 11) + if (scenario.ter_types[ter].special != TER_SPEC_IS_A_SIGN) which_sign = i; } } @@ -3003,7 +3072,7 @@ void town_entry(location spot_hit) { unsigned char ter; ter = current_terrain.terrain[spot_hit.x][spot_hit.y]; - if (scenario.ter_types[ter].special != 21) { + if (scenario.ter_types[ter].special != TER_SPEC_TOWN_ENTRANCE) { give_error("This space isn't a town entrance. Town entrances are marked by a small brown castle icon.","",0); return; } @@ -3011,7 +3080,7 @@ void town_entry(location spot_hit) { for (x = 0; x < 8; x++) if (current_terrain.exit_locs[x].x < 100) { ter = current_terrain.terrain[current_terrain.exit_locs[x].x][current_terrain.exit_locs[x].y]; - if (scenario.ter_types[ter].special != 21) + if (scenario.ter_types[ter].special != TER_SPEC_TOWN_ENTRANCE) current_terrain.exit_locs[x].x = 100; } y = -2; @@ -3112,7 +3181,7 @@ void start_town_edit() { DrawMenuBar(); HideControl(right_sbar); redraw_screen(); - set_string("Drawing mode",""); + set_string("Drawing mode",(char*)scenario.ter_types[current_terrain_type].name.c_str()); place_location(); copied_spec = -1; for (i = 0; i < town->max_dim(); i++) @@ -3143,7 +3212,7 @@ void start_out_edit() { shut_down_menus(1); DrawMenuBar(); redraw_screen(); - set_string("Drawing mode",""); + set_string("Drawing mode",(char*)scenario.ter_types[current_terrain_type].name.c_str()); place_location(); copied_spec = -1; for (i = 0; i < 48; i++) @@ -3479,7 +3548,7 @@ void update_item_menu() { DeleteMenuItem(item_menu[j],1); } for (i = 0; i < 80; i++) { - sprintf((char *) item_name, "%s",scenario.scen_items[i + j * 80].full_name); + sprintf((char *) item_name, "%s",scenario.scen_items[i + j * 80].full_name.c_str()); c2pstr((char*) item_name); AppendMenu(item_menu[j],item_name); } @@ -3491,7 +3560,7 @@ void update_item_menu() { DeleteMenuItem(mon_menu[j],1); } for (i = 0; i < 64; i++) { - sprintf((char *) item_name, "%s",scenario.scen_monsters[i + j * 64].m_name); + sprintf((char *) item_name, "%s",scenario.scen_monsters[i + j * 64].m_name.c_str()); c2pstr((char*) item_name); AppendMenu(mon_menu[j],item_name); } diff --git a/osx/Scenario Editor/scen.actions.h b/osx/Scenario Editor/scen.actions.h index 2fd44373..7bfbb755 100644 --- a/osx/Scenario Editor/scen.actions.h +++ b/osx/Scenario Editor/scen.actions.h @@ -28,7 +28,7 @@ void change_val_4 (unsigned char *val,short a,short b,short c,short d); void change_val (unsigned char *val,short a,short b); void frill_up_terrain(); void unfrill_terrain(); -void set_terrain(location l,unsigned char terrain_type); +void set_terrain(location l,unsigned short terrain_type); bool fix_rubble(location l); bool fix_cave(location l); bool fix_mountain(location l); @@ -67,3 +67,5 @@ void set_special(location spot_hit); bool save_check(short which_dlog); void update_item_menu(); +unsigned short get_ground_from_ter(unsigned short ter); +bool terrain_matches(unsigned char x, unsigned char y, unsigned short ter); diff --git a/osx/Scenario Editor/scen.core.cpp b/osx/Scenario Editor/scen.core.cpp index 292a7eb0..287c6905 100644 --- a/osx/Scenario Editor/scen.core.cpp +++ b/osx/Scenario Editor/scen.core.cpp @@ -863,7 +863,7 @@ void init_scenario() { for (i = 0; i < 256; i++) { scenario.ter_types[i].picture = ter_pics[i]; scenario.ter_types[i].blockage = ter_block[i]; - scenario.ter_types[i].special = (eTerSpec) ter_traits[i]; + scenario.ter_types[i].special = (eTerSpec) ter_traits[i]; // ???: What on earth is all this for? get_str(temp_str,1,i + 1); sprintf((char *)scenario.ter_types[i].name.c_str(), "%s", temp_str); @@ -940,22 +940,22 @@ bool save_ter_info() { store_ter.blockage = cd_get_led_range(813,19,24); store_ter.special = (eTerSpec) cd_get_led_range(813,32,55); i = CDGN(813,6); - if ((store_ter.special < 2) || (store_ter.special > 6)) { + /*if ((store_ter.special < 2) || (store_ter.special > 6)) { if (cre(i,0,256,"First special flag must be from 0 to 255.","",813) == true) return false; } - else if ((store_ter.special > 1) && (store_ter.special <= 4)) { + else*/ if (store_ter.special == TER_SPEC_DAMAGING) { if (cre(i,0,256,"First special flag must be from 0 to 100.","",813) == true) return false; } - else if ((store_ter.special > 4) && (store_ter.special <= 7)) { + else if (store_ter.special == TER_SPEC_DANGEROUS) { if (cre(i,0,256,"First special flag must be from 0 to 8.","",813) == true) return false; } store_ter.flag1 = CDGN(813,6); i = CDGN(813,7); - if ((store_ter.special == 21) || (store_ter.special == 1)) { + if (store_ter.special == TER_SPEC_TOWN_ENTRANCE) { if (cre(i,0,256,"Second special flag must be from 0 to 200.","",813) == true) return false; } - else if ((store_ter.special > 1) && (store_ter.special <= 7)) { + else if ((store_ter.special == TER_SPEC_DAMAGING) || (store_ter.special == TER_SPEC_DANGEROUS)) { if (cre(i,0,256,"Second special flag must be from 0 to 100.","",813) == true) return false; } store_ter.flag2 = CDGN(813,7); diff --git a/osx/Scenario Editor/scen.graphics.cpp b/osx/Scenario Editor/scen.graphics.cpp index d23a5ba9..dc823a5a 100644 --- a/osx/Scenario Editor/scen.graphics.cpp +++ b/osx/Scenario Editor/scen.graphics.cpp @@ -10,6 +10,7 @@ #include "scen.keydlgs.h" #include "soundtool.h" #include "mathutil.h" +#include "boe.consts.h" // TODO: Put these constants in a global file #include "scen.core.h" #include "scen.townout.h" @@ -78,12 +79,9 @@ GWorldPtr spec_scen_g = NULL; GWorldPtr ter_draw_gworld; GWorldPtr dlogpics_gworld; GWorldPtr talkfaces_gworld; +GWorldPtr roads_gworld; GWorldPtr mixed_gworld; PixPatHandle map_pat[25]; -short small_icons[24] = {0,23,37,38,39,35,33,34,30,0, - 30,26,0,0,36,0,27,28,29,20, -21,22,0,0}; - // begin new stuff Rect blue_button_from = {120,91,134,107}; @@ -218,6 +216,145 @@ void init_dialogs(){ //return tmp; } +short get_small_icon(unsigned short ter){ + short icon; + switch(scenario.ter_types[ter].special){ + case TER_SPEC_NONE: + icon = scenario.ter_types[ter].flag1; + break; + case TER_SPEC_CHANGE_WHEN_STEP_ON: + icon = 23; + break; + case TER_SPEC_DAMAGING: + switch(scenario.ter_types[ter].flag3){ + case DAMAGE_WEAPON: + icon = 40; + break; + case DAMAGE_FIRE: + icon = 37; + break; + case DAMAGE_POISON: + icon = 43; + break; + case DAMAGE_MAGIC: + icon = 39; + break; + case DAMAGE_UNBLOCKABLE: + icon = 39; + break; + case DAMAGE_COLD: + icon = 38; + break; + case DAMAGE_UNDEAD: + icon = 18; + break; + case DAMAGE_DEMON: + icon = 19; + break; + } + break; + case TER_SPEC_BRIDGE: + icon = 42; + break; + case TER_SPEC_BED: + icon = -1; + break; + case TER_SPEC_DANGEROUS: + switch(scenario.ter_types[ter].flag3){ + case STATUS_POISONED_WEAPON: // TODO: Do something here + break; + case STATUS_BLESS: // TODO: Do something here + break; + case STATUS_POISON: + icon = 35; + break; + case STATUS_HASTE: // TODO: Do something here + break; + case STATUS_INVULNERABLE: // TODO: Do something here + break; + case STATUS_MAGIC_RESISTANCE: // TODO: Do something here + break; + case STATUS_WEBS: // TODO: Do something here + break; + case STATUS_DISEASE: + icon = 33; + break; + case STATUS_INVISIBLE: // TODO: Do something here + break; + case STATUS_DUMB: // TODO: Do something here + break; + case STATUS_MARTYRS_SHIELD: // TODO: Do something here + break; + case STATUS_ASLEEP: + icon = 44; + break; + case STATUS_PARALYZED: // TODO: Do something here + break; + case STATUS_ACID: + icon = 41; + break; + case 14: // bless TODO: Do something here + break; + case 15: // haste TODO: Do something here + break; + } + break; + case TER_SPEC_CRUMBLING: + icon = 34; + break; + case TER_SPEC_LOCKABLE: + icon = 30; + break; + case TER_SPEC_UNLOCKABLE: + if (scenario.ter_types[ter].flag2 >= 5) + icon = (scenario.ter_types[ter].flag2 == 10) ? 32 : 31; + else icon = 30; + break; + case TER_SPEC_IS_A_SIGN: + icon = 26; + break; + case TER_SPEC_CALL_SPECIAL: + icon = scenario.ter_types[ter].flag3; + break; + case TER_SPEC_IS_A_CONTAINER: + icon = 36; + break; + case TER_SPEC_WATERFALL: + icon = -1; + break; + case TER_SPEC_CONVEYOR: + switch(scenario.ter_types[ter].flag1){ // TODO: Consider the other four possible directions + case DIR_N: + icon = 27; + break; + case DIR_E: + icon = 28; + break; + case DIR_S: + icon = 29; + break; + case DIR_W: + icon = 20; + break; + } + break; + case TER_SPEC_BLOCKED_TO_MONSTERS: + icon = 21; + break; + case TER_SPEC_TOWN_ENTRANCE: + icon = 22; + break; + case TER_SPEC_CHANGE_WHEN_USED: + icon = -1; + break; + case TER_SPEC_CALL_SPECIAL_WHEN_USED: + icon = scenario.ter_types[ter].flag3; + break; + } + if(icon == 255) icon = -1; + return icon; +} + void Set_up_win () { short i,j; for (i = 0; i < 70; i++){ @@ -294,6 +431,7 @@ void load_graphics(){ editor_mixed = load_pict(906); anim_gworld = load_pict(820); field_gworld = load_pict(821); + roads_gworld = load_pict(822); talkfaces_gworld = load_pict(860); items_gworld = load_pict(901); tiny_obj_gworld = load_pict(900); @@ -491,25 +629,20 @@ void set_up_terrain_buttons() { ter_from,terrain_buttons_gworld,terrain_rects[i],0,0); } - small_i = small_icons[scenario.ter_types[i].special]; - if ((small_i == 30) && (scenario.ter_types[i].flag2 >= 5)) - small_i = 31; - if ((small_i == 31) && (scenario.ter_types[i].flag2 == 10)) - small_i = 32; - if (i == 82) - small_i = 3; - if (i == 83) - small_i = 2; - if ((i == 7) || (i == 10) || (i == 13) || (i == 16)) - small_i = 23; + small_i = get_small_icon(i); +// if (i == 82) +// small_i = 3; +// if (i == 83) +// small_i = 2; +// if ((i == 7) || (i == 10) || (i == 13) || (i == 16)) +// small_i = 23; tiny_from = base_small_button_from; OffsetRect(&tiny_from,7 * (small_i % 10),7 * (small_i / 10)); tiny_to = terrain_rects[i]; tiny_to.top = tiny_to.bottom - 7; tiny_to.left = tiny_to.right - 7; - if (small_i > 0) - rect_draw_some_item(editor_mixed, - tiny_from,terrain_buttons_gworld,tiny_to,0,0); + if (small_i > 0 && small_i < 255) + rect_draw_some_item(editor_mixed,tiny_from,terrain_buttons_gworld,tiny_to,0,0); } break; case DRAW_MONST: @@ -598,6 +731,11 @@ void draw_terrain(){ else t_to_draw = current_terrain.terrain[cen_x + q - 4][cen_y + r - 4]; } draw_one_terrain_spot(q,r,t_to_draw); + + if((editing_town && is_field_type(cen_x + q - 4,cen_y + r - 4, 1)) || + (!editing_town && current_terrain.special_spot[cen_x + q - 4][cen_y + r - 4])) + Draw_Some_Item(roads_gworld, calc_rect(6, 0), ter_draw_gworld, where_draw, 1, 0); + which_pt.x = cen_x + q - 4; which_pt.y =cen_y + r - 4; @@ -625,11 +763,7 @@ void draw_terrain(){ rect_draw_some_item(editor_mixed,from_rect,ter_draw_gworld,to_rect,0,0); OffsetRect(&tiny_to,0,-7); } - small_i = small_icons[scenario.ter_types[t_to_draw].special]; - if ((small_i == 30) && (scenario.ter_types[t_to_draw].flag2 >= 5)) - small_i = 31; - if ((small_i == 31) && (scenario.ter_types[t_to_draw].flag2 == 10)) - small_i = 32; + small_i = get_small_icon(t_to_draw); tiny_from = base_small_button_from; OffsetRect(&tiny_from,7 * (small_i % 10),7 * (small_i / 10)); if (small_i > 0) { @@ -1133,6 +1267,11 @@ void place_location() { DrawString(draw_str); //draw_cur_string(); + MoveTo(260 ,terrain_rects[255].top + 26); + sprintf((char*)draw_str,"%i",current_terrain_type); + c2pstr((char*) draw_str); + DrawString(draw_str); + erase_rect.left = 2; erase_rect.right = RIGHT_AREA_WIDTH - 1; erase_rect.top = terrain_rects[255].bottom + 117; @@ -1172,7 +1311,15 @@ void place_location() { source_rect = get_template_rect(current_terrain_type); rect_draw_some_item(terrain_gworld[picture_wanted / 50],source_rect, terrain_buttons_gworld,draw_rect,0,0); - } + } + short small_i = get_small_icon(current_terrain_type); + Rect tiny_to = draw_rect; + tiny_to.top = tiny_to.bottom - 7; + tiny_to.left = tiny_to.right - 7; + Rect tiny_from = base_small_button_from; + OffsetRect(&tiny_from,7 * (small_i % 10),7 * (small_i / 10)); + if (small_i > 0 && small_i < 255) + rect_draw_some_item(editor_mixed,tiny_from,terrain_buttons_gworld,tiny_to,0,0); } draw_rect = terrain_buttons_rect; @@ -1283,7 +1430,7 @@ void sort_specials() { bool is_field_type(short i,short j,short field_type) { short k; - for (k = 0; k < 50; k++) + for (k = 0; k < town->preset_fields.size(); k++) if ((town->preset_fields[k].type == field_type) && (town->preset_fields[k].loc.x == i) && (town->preset_fields[k].loc.y == j)) @@ -1296,21 +1443,26 @@ void make_field_type(short i,short j,short field_type) { if (is_field_type(i,j,field_type) == true) return; - for (k = 0; k < 50; k++) + for (k = 0; k < town->preset_fields.size(); k++) if (town->preset_fields[k].type == 0) { town->preset_fields[k].loc.x = i; town->preset_fields[k].loc.y = j; town->preset_fields[k].type = field_type; return; } - give_error("Each town can have at most 50 fields and special effects (webs, barrels, blood stains, etc.). To place more, use the eraser first.","",0); + //give_error("Each town can have at most 50 fields and special effects (webs, barrels, blood stains, etc.). To place more, use the eraser first.","",0); + cTown::cField the_field; + the_field.loc.x = i; + the_field.loc.y = j; + the_field.type = field_type; + town->preset_fields.push_back(the_field); } void take_field_type(short i,short j,short field_type) { short k; - for (k = 0; k < 50; k++) + for (k = 0; k < town->preset_fields.size(); k++) if ((town->preset_fields[k].type == field_type) && (town->preset_fields[k].loc.x == i) && (town->preset_fields[k].loc.y == j)) { @@ -1399,7 +1551,7 @@ bool container_there(location l) { if (editing_town == false) return false; - if (scenario.ter_types[town->terrain(l.x,l.y)].special == 14) + if (scenario.ter_types[town->terrain(l.x,l.y)].special == TER_SPEC_IS_A_CONTAINER) return true; if (is_barrel(l.x,l.y) == true) return true; diff --git a/osx/Scenario Editor/scen.keydlgs.cpp b/osx/Scenario Editor/scen.keydlgs.cpp index c588838b..9d9ae4a8 100644 --- a/osx/Scenario Editor/scen.keydlgs.cpp +++ b/osx/Scenario Editor/scen.keydlgs.cpp @@ -1240,7 +1240,7 @@ void edit_scen_intro_event_filter (short item_hit) { switch (item_hit) { case 9: scenario.intro_pic = CDGN(804,8); - if ((scenario.intro_pic < 0) || (scenario.intro_pic > 29)) { + if (scenario.intro_pic > 29) { give_error("Intro picture number is out of range.","",804); break; } diff --git a/osx/Scenario Editor/scen.main.cpp b/osx/Scenario Editor/scen.main.cpp index c4fb710e..8e50060f 100644 --- a/osx/Scenario Editor/scen.main.cpp +++ b/osx/Scenario Editor/scen.main.cpp @@ -224,7 +224,7 @@ void check_for_intel(){ OSErr err; err = Gestalt(gestaltSysArchitecture,&response); if(err != noErr){ - printf("Gestalt error %i\n"); + printf("Gestalt error %i\n",err); exit(1); } if(response == gestaltIntel) mac_is_intel = true; diff --git a/osx/bladesofexile.rsrc b/osx/bladesofexile.rsrc index 72e4ef40ae248fbc50267b67786d068209de6290..f8fdb279d962d0f4d80477e648191d79cab0b309 100644 GIT binary patch delta 4987 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 2) && (scenario.ter_types[ter].special <= 6)) + else if ((scenario.ter_types[ter].special == TER_SPEC_DAMAGING) || (scenario.ter_types[ter].special == TER_SPEC_DANGEROUS)) add_string_to_buf("Rest: It's dangerous here.");//// else if (flying() == true) add_string_to_buf("Rest: Not while flying. "); @@ -626,7 +626,7 @@ bool handle_action(EventRecord event) } } else if (overall_mode == MODE_COMBAT) { - if (which_combat_type == MODE_OUTDOORS) { + if (which_combat_type == 0) { if (hit_end_c_button() == true) { end_town_mode(0,univ.town.p_loc); play_sound(93); @@ -701,7 +701,7 @@ bool handle_action(EventRecord event) add_string_to_buf("Pause."); for (k = 0; k < 6; k++) if ((ADVEN[k].main_status == 1) && (ADVEN[k].status[6] > 0)) { - sprintf((char *) str,"%s cleans webs.",ADVEN[k].name); + sprintf((char *) str,"%s cleans webs.",ADVEN[k].name.c_str()); add_string_to_buf((char *) str); ADVEN[k].status[6] = move_to_zero(ADVEN[k].status[6]); ADVEN[k].status[6] = move_to_zero(ADVEN[k].status[6]); @@ -787,7 +787,7 @@ bool handle_action(EventRecord event) else need_redraw = true; storage = univ.out[univ.party.p_loc.x][univ.party.p_loc.y]; - if (scenario.ter_types[storage].special == 21) {//// town entry + if (scenario.ter_types[storage].special == TER_SPEC_TOWN_ENTRANCE) {//// town entry if (univ.party.direction == 0) find_direction_from = 2; else if (univ.party.direction == 4) find_direction_from = 0; @@ -1053,19 +1053,19 @@ bool handle_action(EventRecord event) current_pc = i; set_stat_window (i); if (overall_mode == MODE_SHOPPING) - sprintf((char *) str,"Now shopping: %s",ADVEN[i].name); - else sprintf((char *) str,"Now active: %s",ADVEN[i].name); + sprintf((char *) str,"Now shopping: %s",ADVEN[i].name.c_str()); + else sprintf((char *) str,"Now active: %s",ADVEN[i].name.c_str()); add_string_to_buf((char *)str); adjust_spell_menus(); } break; case 1: - sprintf((char *) str,"%s has %d health out of %d.",ADVEN[i].name, + sprintf((char *) str,"%s has %d health out of %d.",ADVEN[i].name.c_str(), ADVEN[i].cur_health,ADVEN[i].max_health); add_string_to_buf((char *)str); break; case 2: - sprintf((char *) str,"%s has %d spell pts. out of %d.",ADVEN[i].name, + sprintf((char *) str,"%s has %d spell pts. out of %d.",ADVEN[i].name.c_str(), ADVEN[i].cur_sp,ADVEN[i].max_sp); add_string_to_buf((char *)str); break; @@ -1115,7 +1115,7 @@ bool handle_action(EventRecord event) add_string_to_buf("Set active: PC must be here & active."); else { current_pc = i; - sprintf((char *) str,"Now active: %s",ADVEN[i].name); + sprintf((char *) str,"Now active: %s",ADVEN[i].name.c_str()); add_string_to_buf((char *)str); adjust_spell_menus(); } @@ -2314,7 +2314,7 @@ void handle_cave_lore()//// for (i = 0; i < 6; i++) if ((ADVEN[i].main_status == 1) && (ADVEN[i].traits[4] > 0) && (get_ran(1,0,12) == 5) && (((pic >= 0) && (pic <= 1)) || ((pic >= 70) && (pic <= 76))) ) { - sprintf((char *)str,"%s hunts.",ADVEN[i].name); + sprintf((char *)str,"%s hunts.",ADVEN[i].name.c_str()); univ.party.food += get_ran(2,1,6); add_string_to_buf((char *)str); put_pc_screen(); @@ -2323,7 +2323,7 @@ void handle_cave_lore()//// if ( (ADVEN[i].main_status == 1) && (ADVEN[i].traits[5] > 0) && (get_ran(1,0,12) == 5) && (((pic >= 2) && (pic <= 4)) || ((pic >= 79) && (pic <= 84)))) { - sprintf((char *)str,"%s hunts.",ADVEN[i].name); + sprintf((char *)str,"%s hunts.",ADVEN[i].name.c_str()); univ.party.food += get_ran(2,1,6); add_string_to_buf((char *)str); put_pc_screen(); @@ -2577,7 +2577,7 @@ bool outd_move_party(location destination,bool forced) // not in towns && ((scenario.ter_types[ter].boat_over == false) || ((real_dest.x != univ.party.p_loc.x) && (real_dest.y != univ.party.p_loc.y))) - && (scenario.ter_types[ter].special != 21)) { + && (scenario.ter_types[ter].special != TER_SPEC_TOWN_ENTRANCE)) { add_string_to_buf("You leave the boat."); univ.party.in_boat = -1; } @@ -2586,7 +2586,7 @@ bool outd_move_party(location destination,bool forced) return false; else if ((outd_is_blocked(real_dest) == false) && (scenario.ter_types[ter].boat_over == true) - && (scenario.ter_types[ter].special != 21)) { + && (scenario.ter_types[ter].special != TER_SPEC_TOWN_ENTRANCE)) { if ((fancy_choice_dialog(1086,0)) == 1) forced = true; else { @@ -2624,7 +2624,7 @@ bool outd_move_party(location destination,bool forced) add_string_to_buf("Land before mounting horses."); return false; } - if ((scenario.ter_types[ter].special >= 2) && (scenario.ter_types[ter].special <= 4)) { + if (scenario.ter_types[ter].special == TER_SPEC_DAMAGING) { ASB("Your horses quite sensibly refuse."); return false; } @@ -2652,7 +2652,7 @@ bool outd_move_party(location destination,bool forced) (scenario.ter_types[ter].fly_over == true)) ) { univ.party.direction = set_direction(univ.party.p_loc, destination); - if ((flying() == true) && (scenario.ter_types[ter].special == 21)) { + if ((flying() == true) && (scenario.ter_types[ter].special == TER_SPEC_TOWN_ENTRANCE)) { add_string_to_buf("Moved: You have to land first. "); return false; } @@ -2668,7 +2668,7 @@ bool outd_move_party(location destination,bool forced) num_out_moves++; if (univ.party.in_boat >= 0) { // Waterfall!!! - while (scenario.ter_types[univ.out[univ.party.p_loc.x][univ.party.p_loc.y + 1]].special == 15) { + while (scenario.ter_types[univ.out[univ.party.p_loc.x][univ.party.p_loc.y + 1]].special == TER_SPEC_WATERFALL) { // TODO: Implement the 7 other possible directions add_string_to_buf(" Waterfall! "); univ.party.p_loc.y += 2; univ.party.loc_in_sec.y += 2; @@ -2755,33 +2755,33 @@ bool town_move_party(location destination,short forced)//// if (keep_going == true) { if (univ.party.in_boat >= 0) { - if ((is_blocked(destination) == false) && (is_special(destination) == false) - // If to bridge, exit if heading diagonal, keep going is head horiz or vert - && ( (scenario.ter_types[ter].boat_over == false) - || ((destination.x != univ.town.p_loc.x) && (destination.y != univ.town.p_loc.y)))) { - add_string_to_buf("You leave the boat. "); - univ.party.in_boat = -1; - } - else if ((destination.x != univ.town.p_loc.x) && (destination.y != univ.town.p_loc.y)) - return false; - // Crossing bridge: land or go through - else if ((is_blocked(destination) == false) && (scenario.ter_types[ter].boat_over == true)) { - if ((fancy_choice_dialog(1086,0)) == 1) - forced = true; - else if (is_blocked(destination) == false) { - add_string_to_buf("You leave the boat. "); - univ.party.in_boat = -1; - } - } - // boat in destination - else if (town_boat_there(destination) < 30) { - add_string_to_buf(" Boat there already. "); - return false; - } - // water or lava - else if (scenario.ter_types[ter].boat_over == true) - forced = true; + if ((!is_blocked(destination)) && (!is_special(destination)) + // If to bridge, exit if heading diagonal, keep going if heading horiz or vert + && ( (!scenario.ter_types[ter].boat_over) + || ((destination.x != univ.town.p_loc.x) && (destination.y != univ.town.p_loc.y)))) { + add_string_to_buf("You leave the boat. "); + univ.party.in_boat = -1; } + else if ((destination.x != univ.town.p_loc.x) && (destination.y != univ.town.p_loc.y)) + return false; + // Crossing bridge: land or go through + else if ((!is_blocked(destination)) && (scenario.ter_types[ter].boat_over) && (scenario.ter_types[ter].special == TER_SPEC_BRIDGE)) { + if ((fancy_choice_dialog(1086,0)) == 1) + forced = true; + else if (is_blocked(destination) == false) { + add_string_to_buf("You leave the boat. "); + univ.party.in_boat = -1; + } + } + // boat in destination + else if (town_boat_there(destination) < 30) { + add_string_to_buf(" Boat there already. "); + return false; + } + // water or lava + else if (scenario.ter_types[ter].boat_over == true) + forced = true; + } if (((boat_there = town_boat_there(destination)) < 30) && (univ.party.in_boat < 0)) { if (univ.party.boats[boat_there].property == true) { @@ -2816,7 +2816,7 @@ bool town_move_party(location destination,short forced)//// } else if ((is_blocked(destination) == false) || (forced == 1)) { if (univ.party.in_horse >= 0) { - if ((scenario.ter_types[ter].special >= 2) && (scenario.ter_types[ter].special <= 4)) { + if (scenario.ter_types[ter].special == TER_SPEC_DAMAGING) { ASB("Your horses quite sensibly refuse."); return false; } @@ -2840,7 +2840,7 @@ bool town_move_party(location destination,short forced)//// if (univ.party.in_boat >= 0) { // Waterfall!!! - while (scenario.ter_types[univ.town->terrain(destination.x,destination.y + 1)].special == 15) { + while (scenario.ter_types[univ.town->terrain(destination.x,destination.y + 1)].special == TER_SPEC_WATERFALL) { // TODO: Implement the other 7 possible directions add_string_to_buf(" Waterfall! "); destination.y += 2; univ.town.p_loc.y += 2; @@ -2942,7 +2942,7 @@ short count_walls(location loc) bool is_sign(unsigned char ter) { - if (scenario.ter_types[ter].special == 11) + if (scenario.ter_types[ter].special == TER_SPEC_IS_A_SIGN) return true; return false; } diff --git a/osx/boe.combat.cpp b/osx/boe.combat.cpp index 0ed3ea8d..d6a86a88 100644 --- a/osx/boe.combat.cpp +++ b/osx/boe.combat.cpp @@ -1607,7 +1607,7 @@ bool combat_next_step() if ((combat_active_pc == 6) && (current_pc != store_pc)) { sprintf((char *)create_line, "Active: %s (#%d, %d ap.) ", - ADVEN[current_pc].name,current_pc + 1,ADVEN[current_pc].ap); + ADVEN[current_pc].name.c_str(),current_pc + 1,ADVEN[current_pc].ap); add_string_to_buf((char *)create_line); print_buf(); } diff --git a/osx/boe.consts.h b/osx/boe.consts.h index 8f066156..143ccb70 100644 --- a/osx/boe.consts.h +++ b/osx/boe.consts.h @@ -159,6 +159,16 @@ enum eGameMode { #define STATUS_PARALYZED 12 #define STATUS_ACID 13 +// Directions! +#define DIR_N 0 +#define DIR_NE 1 +#define DIR_E 2 +#define DIR_SE 3 +#define DIR_S 4 +#define DIR_SW 5 +#define DIR_W 6 +#define DIR_NW 7 + /* damage type*/ /* used as parameter to some functions */ enum eDamageType { diff --git a/osx/boe.fileio.cpp b/osx/boe.fileio.cpp index 811599ac..d45c069e 100644 --- a/osx/boe.fileio.cpp +++ b/osx/boe.fileio.cpp @@ -244,8 +244,7 @@ void finish_load_party(){ force_barrier = true; if (univ.town.is_quickfire(j,k) == true) quickfire = true; - if ((scenario.ter_types[univ.town->terrain(j,k)].special >= 16) && - (scenario.ter_types[univ.town->terrain(j,k)].special <= 19)) + if ((scenario.ter_types[univ.town->terrain(j,k)].special == TER_SPEC_CONVEYOR)) belt_present = true; } force_wall = true; @@ -543,7 +542,7 @@ void init_town(){ // formerly part of load_town if (univ.town->special_locs[i].x < 100){ univ.town.set_special(univ.town->special_locs[i].x,univ.town->special_locs[i].y,true); } - for (i = 0; i < 50; i++) { + for (i = 0; i < univ.town->preset_fields.size(); i++) { switch(univ.town->preset_fields[i].type){ case 1: // currently unused univ.town.set_spot(univ.town->preset_fields[i].loc.x,univ.town->preset_fields[i].loc.y,true); @@ -1226,11 +1225,13 @@ void build_scen_headers() // data_store->scen_names[cur_entry][i - last_colon - 1] = scen_name[i]; // data_store->scen_names[cur_entry][strlen((char *) scen_name) - last_colon - 1] = 0; // cur_entry++; - std::string curScenarioName((char*) files[cur_entry].name); - for(unsigned i = 0; i < curScenarioName.length(); i++) - if(curScenarioName[i] == ':') - last_colon = i; - curScenarioName.erase(0,last_colon + 1); + p2cstr(files[cur_entry].name); + std::string curScenarioName((char*)files[cur_entry].name); + c2pstr((char*)files[cur_entry].name); +// for(unsigned i = 0; i < curScenarioName.length(); i++) +// if(curScenarioName[i] == ':') +// last_colon = i; +// curScenarioName.erase(0,last_colon + 1); scen_names.push_back(curScenarioName); } cur_entry++; diff --git a/osx/boe.graphics.cpp b/osx/boe.graphics.cpp index ac1ba046..5da9ee33 100644 --- a/osx/boe.graphics.cpp +++ b/osx/boe.graphics.cpp @@ -141,6 +141,7 @@ GWorldPtr party_template_gworld; GWorldPtr items_gworld; GWorldPtr tiny_obj_gworld; GWorldPtr fields_gworld; +GWorldPtr roads_gworld; GWorldPtr map_gworld; GWorldPtr tiny_map_graphics; GWorldPtr missiles_gworld; @@ -810,6 +811,7 @@ void Set_up_win () items_gworld = load_pict(901); tiny_obj_gworld = load_pict(900); fields_gworld = load_pict(821); + roads_gworld = load_pict(822); missiles_gworld = load_pict(880); dlogpics_gworld = load_pict(850); @@ -1748,31 +1750,39 @@ GWorldPtr load_pict(short picture_to_get) // this is used for determinign whether to round off walkway corners // right now, trying a restrictive rule (just cave floor and grass, mainly) -bool is_nature(char x, char y) +bool is_nature(char x, char y, unsigned char ground_t) { short pic; unsigned char ter_type; ter_type = coord_to_ter((short) x,(short) y); - pic = scenario.ter_types[ter_type].picture; - if ((pic >= 0) && (pic <= 45)) - return true; - if ((pic >= 67) && (pic <= 73)) - return true; - if ((pic >= 75) && (pic <= 87)) - return true; - if ((pic >= 121) && (pic <= 122)) - return true; - if ((pic >= 179) && (pic <= 208)) - return true; - if ((pic >= 211) && (pic <= 212)) - return true; - if ((pic >= 217) && (pic <= 246)) - return true; - - return false; + return ground_t == scenario.ter_types[ter_type].ground_type; +// pic = scenario.ter_types[ter_type].picture; +// if ((pic >= 0) && (pic <= 45)) +// return true; +// if ((pic >= 67) && (pic <= 73)) +// return true; +// if ((pic >= 75) && (pic <= 87)) +// return true; +// if ((pic >= 121) && (pic <= 122)) +// return true; +// if ((pic >= 179) && (pic <= 208)) +// return true; +// if ((pic >= 211) && (pic <= 212)) +// return true; +// if ((pic >= 217) && (pic <= 246)) +// return true; +// +// return false; } +unsigned short get_ground_from_ter(unsigned short ter){ + unsigned char ground = scenario.ter_types[ter].ground_type; + for(int i = 0; i < 256; i++) + if(scenario.ter_types[i].ground_type == ground) + return i; + return 0; +} void draw_terrain(short mode) //mode ... if 1, don't place on screen after redoing @@ -1782,9 +1792,9 @@ void draw_terrain(short mode) location where_draw; location sector_p_in,view_loc; char can_draw; - unsigned char spec_terrain; + unsigned short spec_terrain; bool off_terrain = false,draw_trim = true; - short i,j,short_spec_terrain; + short i,j; GrafPtr old_port; if(overall_mode == MODE_TALKING || overall_mode == MODE_SHOPPING || overall_mode == MODE_STARTUP) @@ -1816,7 +1826,8 @@ void draw_terrain(short mode) for (i = 0; i < 13; i++) for (j = 0; j < 13; j++) { - light_area[i][j] = 0;unexplored_area[i][j] = 0; + light_area[i][j] = 0; + unexplored_area[i][j] = 0; } @@ -1906,101 +1917,119 @@ void draw_terrain(short mode) anim_ticks = 0; } - short_spec_terrain = spec_terrain; + eTrimType trim = scenario.ter_types[spec_terrain].trim_type; - // Finally, draw this terrain spot - switch (short_spec_terrain) { //// all draw_one_terrain_spot - case 82: // cave wway - if (loc_off_act_area(where_draw) == false) { - if ((is_nature(where_draw.x - 1,where_draw.y)) && - (is_nature(where_draw.x,where_draw.y - 1) )) - short_spec_terrain = 10219; - if ((is_nature(where_draw.x + 1,where_draw.y) ) && - (is_nature(where_draw.x,where_draw.y - 1) )) - short_spec_terrain = 10220; - if ((is_nature(where_draw.x + 1,where_draw.y) ) && - (is_nature(where_draw.x,where_draw.y + 1) )) - short_spec_terrain = 10221; - if ((is_nature(where_draw.x - 1,where_draw.y) ) && - (is_nature(where_draw.x,where_draw.y + 1) )) - short_spec_terrain = 10218; - } - draw_one_terrain_spot(q,r,short_spec_terrain,0); - break; - case 83: // ground wway - if (loc_off_act_area(where_draw) == false) { - if ((is_nature(where_draw.x - 1,where_draw.y)) && - (is_nature(where_draw.x,where_draw.y - 1)) ) - short_spec_terrain = 10223; - if ((is_nature(where_draw.x + 1,where_draw.y) ) && - (is_nature(where_draw.x,where_draw.y - 1) )) - short_spec_terrain = 10224; - if ((is_nature(where_draw.x + 1,where_draw.y) ) && - (is_nature(where_draw.x,where_draw.y + 1) )) - short_spec_terrain = 10225; - if ((is_nature(where_draw.x - 1,where_draw.y) ) && - (is_nature(where_draw.x,where_draw.y + 1) )) - short_spec_terrain = 10222; - } - draw_one_terrain_spot(q,r,short_spec_terrain,0); - break; - - case 79: case 80: case 81: - if ((short_spec_terrain == 81) - && ((univ.out[where_draw.x][where_draw.y - 1] == 80) || (univ.out[where_draw.x][where_draw.y - 1] == 79))) - short_spec_terrain = 42; - if ((short_spec_terrain == 81) - && ((univ.out[where_draw.x][where_draw.y + 1] == 80) || (univ.out[where_draw.x][where_draw.y + 1] == 79))) - short_spec_terrain = 38; - if ((short_spec_terrain == 81) - && ((univ.out[where_draw.x - 1][where_draw.y] == 80) || (univ.out[where_draw.x - 1][where_draw.y] == 79))) - short_spec_terrain = 44; - if ((short_spec_terrain == 81) - && ((univ.out[where_draw.x + 1][where_draw.y ] == 80) || (univ.out[where_draw.x + 1][where_draw.y] == 79))) - short_spec_terrain = 40; - /*if ((short_spec_terrain == 81) - && ((univ.out[where_draw.x][where_draw.y - 1] != 234) && (univ.out[where_draw.x][where_draw.y - 1] != 81) && - ((univ.out[where_draw.x][where_draw.y - 1] < 36) || (univ.out[where_draw.x][where_draw.y - 1] > 49)))) - short_spec_terrain = 42; - if ((short_spec_terrain == 81) - && ((univ.out[where_draw.x][where_draw.y + 1] != 234) && (univ.out[where_draw.x][where_draw.y + 1] != 81) && - ((univ.out[where_draw.x][where_draw.y + 1] < 36) || (univ.out[where_draw.x][where_draw.y + 1] > 49)))) - short_spec_terrain = 38; - if ((short_spec_terrain == 81) - && ((univ.out[where_draw.x - 1][where_draw.y] != 234) &&(univ.out[where_draw.x - 1][where_draw.y] != 81) && - ((univ.out[where_draw.x - 1][where_draw.y] < 36) || (univ.out[where_draw.x - 1][where_draw.y] > 49)))) - short_spec_terrain = 44; - if ((short_spec_terrain == 81) - && ((univ.out[where_draw.x + 1][where_draw.y] != 234) && (univ.out[where_draw.x + 1][where_draw.y] != 81) && - ((univ.out[where_draw.x + 1][where_draw.y] < 36) || (univ.out[where_draw.x + 1][where_draw.y] > 49)))) - short_spec_terrain = 40;*/ - draw_one_terrain_spot(q,r,short_spec_terrain,0); - place_road(q,r,where_draw); - break; - case 90: - draw_one_terrain_spot(q,r,-1,0); - break; - default: - if (short_spec_terrain < 2) - current_ground = 0; - if ((short_spec_terrain == 2) || ( - (short_spec_terrain >= 22) && (short_spec_terrain <= 49))) - current_ground = 2; - draw_one_terrain_spot(q,r,short_spec_terrain,0); - break; - } - } - else { // Can't see. Place darkness. + // Finally, draw this terrain spot TODO: Alter walkway drawing +// if(short_spec_terrain == 82) { // cave wway +// if (loc_off_act_area(where_draw) == false) { +// if ((is_nature(where_draw.x - 1,where_draw.y)) && +// (is_nature(where_draw.x,where_draw.y - 1) )) +// short_spec_terrain = 10219; +// if ((is_nature(where_draw.x + 1,where_draw.y) ) && +// (is_nature(where_draw.x,where_draw.y - 1) )) +// short_spec_terrain = 10220; +// if ((is_nature(where_draw.x + 1,where_draw.y) ) && +// (is_nature(where_draw.x,where_draw.y + 1) )) +// short_spec_terrain = 10221; +// if ((is_nature(where_draw.x - 1,where_draw.y) ) && +// (is_nature(where_draw.x,where_draw.y + 1) )) +// short_spec_terrain = 10218; +// } +// draw_one_terrain_spot(q,r,short_spec_terrain,0); +// }else if(short_spec_terrain == 83) { // ground wway +// if (loc_off_act_area(where_draw) == false) { +// if ((is_nature(where_draw.x - 1,where_draw.y)) && +// (is_nature(where_draw.x,where_draw.y - 1)) ) +// short_spec_terrain = 10223; +// if ((is_nature(where_draw.x + 1,where_draw.y) ) && +// (is_nature(where_draw.x,where_draw.y - 1) )) +// short_spec_terrain = 10224; +// if ((is_nature(where_draw.x + 1,where_draw.y) ) && +// (is_nature(where_draw.x,where_draw.y + 1) )) +// short_spec_terrain = 10225; +// if ((is_nature(where_draw.x - 1,where_draw.y) ) && +// (is_nature(where_draw.x,where_draw.y + 1) )) +// short_spec_terrain = 10222; +// } +// draw_one_terrain_spot(q,r,short_spec_terrain,0); + if(trim == TRIM_WALKWAY){ + int corner = -1; + unsigned short ground_ter = get_ground_from_ter(spec_terrain); + unsigned char ground_t = scenario.ter_types[spec_terrain].trim_ter; + if (!loc_off_act_area(where_draw)) { + if ((is_nature(where_draw.x - 1,where_draw.y,ground_t)) && + (is_nature(where_draw.x,where_draw.y - 1,ground_t))) + corner = 1; + if ((is_nature(where_draw.x + 1,where_draw.y,ground_t)) && + (is_nature(where_draw.x,where_draw.y - 1,ground_t))) + corner = 2; + if ((is_nature(where_draw.x + 1,where_draw.y,ground_t)) && + (is_nature(where_draw.x,where_draw.y + 1,ground_t))) + corner = 3; + if ((is_nature(where_draw.x - 1,where_draw.y,ground_t)) && + (is_nature(where_draw.x,where_draw.y + 1,ground_t))) + corner = 0; + } + draw_one_terrain_spot(q,r,corner < 0 ? spec_terrain : ground_ter,0); + if(corner >= 0) + Draw_Some_Item(roads_gworld, calc_rect(corner,0), terrain_screen_gworld, loc(q,r), 1, 0); + }else if(trim == TRIM_ROAD) { // TODO: Alter road handling +// if ((short_spec_terrain == 81) +// && ((univ.out[where_draw.x][where_draw.y - 1] == 80) || (univ.out[where_draw.x][where_draw.y - 1] == 79))) +// short_spec_terrain = 42; +// if ((short_spec_terrain == 81) +// && ((univ.out[where_draw.x][where_draw.y + 1] == 80) || (univ.out[where_draw.x][where_draw.y + 1] == 79))) +// short_spec_terrain = 38; +// if ((short_spec_terrain == 81) +// && ((univ.out[where_draw.x - 1][where_draw.y] == 80) || (univ.out[where_draw.x - 1][where_draw.y] == 79))) +// short_spec_terrain = 44; +// if ((short_spec_terrain == 81) +// && ((univ.out[where_draw.x + 1][where_draw.y ] == 80) || (univ.out[where_draw.x + 1][where_draw.y] == 79))) +// short_spec_terrain = 40; + /*if ((short_spec_terrain == 81) + && ((univ.out[where_draw.x][where_draw.y - 1] != 234) && (univ.out[where_draw.x][where_draw.y - 1] != 81) && + ((univ.out[where_draw.x][where_draw.y - 1] < 36) || (univ.out[where_draw.x][where_draw.y - 1] > 49)))) + short_spec_terrain = 42; + if ((short_spec_terrain == 81) + && ((univ.out[where_draw.x][where_draw.y + 1] != 234) && (univ.out[where_draw.x][where_draw.y + 1] != 81) && + ((univ.out[where_draw.x][where_draw.y + 1] < 36) || (univ.out[where_draw.x][where_draw.y + 1] > 49)))) + short_spec_terrain = 38; + if ((short_spec_terrain == 81) + && ((univ.out[where_draw.x - 1][where_draw.y] != 234) &&(univ.out[where_draw.x - 1][where_draw.y] != 81) && + ((univ.out[where_draw.x - 1][where_draw.y] < 36) || (univ.out[where_draw.x - 1][where_draw.y] > 49)))) + short_spec_terrain = 44; + if ((short_spec_terrain == 81) + && ((univ.out[where_draw.x + 1][where_draw.y] != 234) && (univ.out[where_draw.x + 1][where_draw.y] != 81) && + ((univ.out[where_draw.x + 1][where_draw.y] < 36) || (univ.out[where_draw.x + 1][where_draw.y] > 49)))) + short_spec_terrain = 40;*/ + draw_one_terrain_spot(q,r,spec_terrain,0); + place_road(q,r,where_draw); + }else if(spec_terrain == 65535) { draw_one_terrain_spot(q,r,-1,0); - } + }else{ +// if (spec_terrain < 2) +// current_ground = 0; +// if ((spec_terrain == 2) || ( +// (spec_terrain >= 22) && (spec_terrain <= 49))) +// current_ground = 2; + current_ground = get_ground_from_ter(spec_terrain); + draw_one_terrain_spot(q,r,spec_terrain,0); + } + } + else { // Can't see. Place darkness. + draw_one_terrain_spot(q,r,-1,0); + } if ((can_draw != 0) && (overall_mode != MODE_RESTING) && (frills_on == true) - && (draw_trim == true) && (cartoon_happening == false)) { // Place the trim + && (draw_trim == true) && (cartoon_happening == false)) { // Place the trim TODO: Alter trim place_trim((short) q,(short) r,where_draw,spec_terrain); - } + } + if((is_town() && univ.town.is_spot(where_draw.x,where_draw.y)) || + (is_out() && univ.out.outdoors[univ.party.i_w_c.x][univ.party.i_w_c.y].special_spot[where_draw.x][where_draw.y])) + Draw_Some_Item(roads_gworld, calc_rect(6, 0), terrain_screen_gworld, where_draw, 1, 0); } - } - + } + if ((overall_mode != MODE_RESTING) && (!is_out())) draw_sfx(); @@ -2240,18 +2269,23 @@ void draw_trim(short q,short r,short which_trim,short which_mode) } -bool extend_road_terrain(unsigned char ter) +bool extend_road_terrain(unsigned short ter) { - short i; - short extend_pics[39] = {61,62,63,64,65, 66,401,402,406,202, - 203,204,215,216,90, 91,92,93,102,103, - 104,105,112,113,114, 115,187,188,189,190, - 192,193,194,195,196, 197,191,200,201}; - - for (i = 0; i < 39; i++) - if (scenario.ter_types[ter].picture == extend_pics[i]) - return true; - return false; + unsigned short trim = scenario.ter_types[ter].trim_type; + unsigned short spec = scenario.ter_types[ter].special; + unsigned short flag = scenario.ter_types[ter].flag1; + if(trim == TRIM_ROAD || trim == TRIM_CITY || trim == TRIM_WALKWAY) + return true; + if(spec == TER_SPEC_BRIDGE) + return true; + if(spec == TER_SPEC_TOWN_ENTRANCE && trim != TRIM_NONE) + return true; // cave entrance, most likely + if(spec == TER_SPEC_UNLOCKABLE || spec == TER_SPEC_CHANGE_WHEN_STEP_ON) + return true; // closed door, possibly locked; or closed portcullis + if(spec == TER_SPEC_CHANGE_WHEN_USED && scenario.ter_types[flag].special == TER_SPEC_CHANGE_WHEN_STEP_ON && scenario.ter_types[flag].flag1 == ter) + return true; // open door (I think) TODO: Verify this works + if(spec == TER_SPEC_LOCKABLE) + return true; // open portcullis (most likely) } void place_road(short q,short r,location where) @@ -2259,46 +2293,99 @@ void place_road(short q,short r,location where) location draw_loc; unsigned char ter; Rect to_rect; - Rect road_rects[2] = {{76,112,80,125},{72,144,90,148}}; // 0 - rl partial 1 - ud partial - Rect road_dest_rects[4] = {{0,12,18,16},{16,15,20,28},{18,12,36,16},{16,0,20,13}}; // top right bottom left + //Rect road_rects[2] = {{76,112,80,125},{72,144,90,148}}; // 0 - rl partial 1 - ud partial + Rect road_rects[4] = { + {4,112,8,125}, // horizontal partial + {0,144,18,148}, // vertical partial + {0,112,4,140}, // horizontal full + {0,140,36,144}, // vertical full + }; + //Rect road_dest_rects[4] = {{0,12,18,16},{16,15,20,28},{18,12,36,16},{16,0,20,13}}; // top right bottom left + Rect road_dest_rects[6] = { + {0,12,18,16}, // top + {16,15,20,28}, // right + {18,12,36,16}, // bottom + {16,0,20,13}, // left + {0,12,36,16}, // top + bottom + {16,0,20,28}, // right + left + }; draw_loc.x = q; draw_loc.y = r; - terrain_there[q][r] = -1; - + terrain_there[q][r] = -1; // TODO: Test the new road-handling code on a hills boundary. + if (where.y > 0) ter = coord_to_ter(where.x,where.y - 1); - if ((where.y == 0) || (extend_road_terrain(ter) == true)) { + if ((where.y == 0) || (extend_road_terrain(ter))) { to_rect = road_dest_rects[0]; OffsetRect(&to_rect,13 + q * 28,13 + r * 36); - rect_draw_some_item (fields_gworld, road_rects[1], terrain_screen_gworld, to_rect, 0, 0); + rect_draw_some_item (roads_gworld, road_rects[1], terrain_screen_gworld, to_rect, 0, 0); + }else{ + ter = coord_to_ter(where.x,where.y - 2); + if(extend_road_terrain(ter)){ + to_rect = road_dest_rects[0]; + OffsetRect(&to_rect,13 + q * 28,13 + r * 36); + rect_draw_some_item (roads_gworld, road_rects[1], terrain_screen_gworld, to_rect, 0, 0); + to_rect = road_dest_rects[4]; + OffsetRect(&to_rect,13 + q * 28,13 + (r - 1) * 36); + rect_draw_some_item (roads_gworld, road_rects[3], terrain_screen_gworld, to_rect, 0, 0); } - + } + if (((is_out()) && (where.x < 96)) || (!(is_out()) && (where.x < univ.town->max_dim() - 1))) ter = coord_to_ter(where.x + 1,where.y); if (((is_out()) && (where.x == 96)) || (!(is_out()) && (where.x == univ.town->max_dim() - 1)) - || (extend_road_terrain(ter) == true)) { + || (extend_road_terrain(ter) == true)) { to_rect = road_dest_rects[1]; OffsetRect(&to_rect,13 + q * 28,13 + r * 36); - rect_draw_some_item (fields_gworld, road_rects[0], terrain_screen_gworld, to_rect, 0, 0); + rect_draw_some_item (roads_gworld, road_rects[0], terrain_screen_gworld, to_rect, 0, 0); + }else{ + ter = coord_to_ter(where.x + 1,where.y); + if(extend_road_terrain(ter)){ + to_rect = road_dest_rects[1]; + OffsetRect(&to_rect,13 + q * 28,13 + r * 36); + rect_draw_some_item (roads_gworld, road_rects[1], terrain_screen_gworld, to_rect, 0, 0); + to_rect = road_dest_rects[5]; + OffsetRect(&to_rect,13 + (q + 1) * 28,13 + r * 36); + rect_draw_some_item (roads_gworld, road_rects[3], terrain_screen_gworld, to_rect, 0, 0); } - + } + if (((is_out()) && (where.y < 96)) || (!(is_out()) && (where.y < univ.town->max_dim() - 1))) ter = coord_to_ter(where.x,where.y + 1); if (((is_out()) && (where.y == 96)) || (!(is_out()) && (where.y == univ.town->max_dim() - 1)) - || (extend_road_terrain(ter) == true)) { + || (extend_road_terrain(ter) == true)) { to_rect = road_dest_rects[2]; OffsetRect(&to_rect,13 + q * 28,13 + r * 36); - rect_draw_some_item (fields_gworld, road_rects[1], terrain_screen_gworld, to_rect, 0, 0); + rect_draw_some_item (roads_gworld, road_rects[1], terrain_screen_gworld, to_rect, 0, 0); + }else{ + ter = coord_to_ter(where.x,where.y + 2); + if(extend_road_terrain(ter)){ + to_rect = road_dest_rects[2]; + OffsetRect(&to_rect,13 + q * 28,13 + r * 36); + rect_draw_some_item (roads_gworld, road_rects[1], terrain_screen_gworld, to_rect, 0, 0); + to_rect = road_dest_rects[4]; + OffsetRect(&to_rect,13 + q * 28,13 + (r + 1) * 36); + rect_draw_some_item (roads_gworld, road_rects[3], terrain_screen_gworld, to_rect, 0, 0); } - + } + if (where.x > 0) ter = coord_to_ter(where.x - 1,where.y); if ((where.x == 0) || (extend_road_terrain(ter) == true)) { to_rect = road_dest_rects[3]; OffsetRect(&to_rect,13 + q * 28,13 + r * 36); - rect_draw_some_item (fields_gworld, road_rects[0], terrain_screen_gworld, to_rect, 0, 0); + rect_draw_some_item (roads_gworld, road_rects[0], terrain_screen_gworld, to_rect, 0, 0); + }else{ + ter = coord_to_ter(where.x - 1,where.y); + if(extend_road_terrain(ter)){ + to_rect = road_dest_rects[3]; + OffsetRect(&to_rect,13 + q * 28,13 + r * 36); + rect_draw_some_item (roads_gworld, road_rects[1], terrain_screen_gworld, to_rect, 0, 0); + to_rect = road_dest_rects[5]; + OffsetRect(&to_rect,13 + (q - 1) * 28,13 + r * 36); + rect_draw_some_item (roads_gworld, road_rects[3], terrain_screen_gworld, to_rect, 0, 0); } - + } } void draw_rest_screen() diff --git a/osx/boe.graphics.h b/osx/boe.graphics.h index e8edffcd..964a13d0 100644 --- a/osx/boe.graphics.h +++ b/osx/boe.graphics.h @@ -42,7 +42,7 @@ void put_graphics_in_template(); void draw_terrain(short mode = 0); void place_trim(short q,short r,location where,unsigned char ter_type); void draw_trim(short q,short r,short which_trim,short which_mode); -bool extend_road_terrain(unsigned char ter); +bool extend_road_terrain(unsigned short ter); void place_road(short q,short r,location where); void draw_rest_screen(); void boom_space(location where,short mode,short type,short damage,short sound); @@ -57,7 +57,7 @@ bool party_toast(); void redraw_partial_terrain(Rect redraw_rect); void dump_gworld(); //void final_process_dialog(short which_dlog); -bool is_nature(char i, char j); +bool is_nature(char i, char j, unsigned char ground_t); void put_dialog_graphic(short graphic_num,short spec_g,Rect draw_rect); void draw_startup_stats(); void HideMenuBar( void ); diff --git a/osx/boe.graphutil.cpp b/osx/boe.graphutil.cpp index b7720fca..5bde393e 100644 --- a/osx/boe.graphutil.cpp +++ b/osx/boe.graphutil.cpp @@ -229,9 +229,7 @@ void draw_one_terrain_spot (short i,short j,short terrain_to_draw,short dest) // anim_onscreen = true; } - if (dest == 0) - rect_draw_some_item(source_gworld, source_rect, terrain_screen_gworld, where_draw, (unsigned char) 0, 0); - else rect_draw_some_item(source_gworld, source_rect, terrain_screen_gworld, where_draw, (unsigned char) 0, 1); + rect_draw_some_item(source_gworld, source_rect, terrain_screen_gworld, where_draw, (unsigned char) 0, dest); } void draw_monsters() //// @@ -317,12 +315,12 @@ void draw_monsters() //// ter = univ.town->terrain(univ.town.monst.dudes[i].cur_loc.x,univ.town.monst.dudes[i].cur_loc.y); // in bed? if ((store_loc.x >= 0) && (store_loc.x < 9) && (store_loc.y >= 0) && (store_loc.y < 9) && - (scenario.ter_types[ter].picture == 143) && + (scenario.ter_types[ter].special == TER_SPEC_BED) && ((univ.town.monst.dudes[i].m_d.m_type < 7) && (univ.town.monst.dudes[i].m_d.m_type != 1) && (univ.town.monst.dudes[i].m_d.m_type != 2)) && ((univ.town.monst.dudes[i].active == 1) || (univ.town.monst.dudes[i].target == 6)) && (width == 1) && (height == 1)) //// - draw_one_terrain_spot((short) where_draw.x,(short) where_draw.y,10230,0); + draw_one_terrain_spot((short) where_draw.x,(short) where_draw.y,10000 + scenario.ter_types[ter].flag1,0); else Draw_Some_Item(storage_gworld, source_rect, terrain_screen_gworld, store_loc, 1, 0); } } @@ -354,12 +352,12 @@ void draw_monsters() //// ,k); ter = univ.town->terrain(univ.town.monst.dudes[i].cur_loc.x,univ.town.monst.dudes[i].cur_loc.y); if ((store_loc.x >= 0) && (store_loc.x < 9) && (store_loc.y >= 0) && (store_loc.y < 9) && - (scenario.ter_types[ter].picture == 143) && + (scenario.ter_types[ter].special == TER_SPEC_BED) && ((univ.town.monst.dudes[i].m_d.m_type < 7) && (univ.town.monst.dudes[i].m_d.m_type != 1) && (univ.town.monst.dudes[i].m_d.m_type != 2)) && ((univ.town.monst.dudes[i].active == 1) || (univ.town.monst.dudes[i].target == 6)) && (width == 1) && (height == 1)) - draw_one_terrain_spot((short) where_draw.x,(short) where_draw.y,10230,0); //// + draw_one_terrain_spot((short) where_draw.x,(short) where_draw.y,10000 + scenario.ter_types[ter].flag1,0); //// else Draw_Some_Item(storage_gworld, source_rect, terrain_screen_gworld, store_loc, 1, 0); } } @@ -691,10 +689,10 @@ void draw_party_symbol(short mode,location center) if ((univ.party.in_boat < 0) && (univ.party.in_horse < 0)) {//// i = first_active_pc(); source_rect = get_party_template_rect(i,(univ.party.direction < 4) ? 0 : 1); - + unsigned short ter = univ.town->terrain(univ.town.p_loc.x,univ.town.p_loc.y); // now wedge in bed graphic - if ((is_town()) && (scenario.ter_types[univ.town->terrain(univ.town.p_loc.x,univ.town.p_loc.y)].picture == 143)) - draw_one_terrain_spot((short) target.x,(short) target.y,10230,0); //// + if ((is_town()) && (scenario.ter_types[ter].special == TER_SPEC_BED)) + draw_one_terrain_spot((short) target.x,(short) target.y,10000 + scenario.ter_types[ter].flag1,0); //// else Draw_Some_Item(party_template_gworld, source_rect, terrain_screen_gworld, target, 1, 0); } else if (univ.party.in_boat >= 0) { @@ -825,11 +823,10 @@ unsigned char get_t_t(char x,char y) // returns terrain type at where // Is this is subterranean fluid that gets shore plopped down on it? bool is_fluid(unsigned char ter_type)//// { - - if (((ter_type >= 71) && (ter_type <= 76)) || (ter_type == 90)) - return true; - - return false; +// if (((ter_type >= 71) && (ter_type <= 76)) || (ter_type == 90)) +// return true; +// return false; + return scenario.ter_types[ter_type].trim_type == TRIM_FRILLS; } // Is this is subterranean beach that gets shore plopped down next to it? @@ -837,10 +834,12 @@ bool is_shore(unsigned char ter_type)//// { if (is_fluid(ter_type) == true) return false; - if (ter_type == 77) - return false; - if (ter_type == 90) + if(scenario.ter_types[ter_type].trim_type = TRIM_WATERFALL) return false; +// if (ter_type == 77) +// return false; +// if (ter_type == 90) +// return false; /* if (ter_type == 240) return false; if ((ter_type >= 117) && (ter_type <= 131)) @@ -1042,7 +1041,7 @@ void adjust_monst_menu() for (i = 0; i < 256; i++) if (on_monst_menu[i] >= 0) { //GetIndString(monst_name, 2,on_monst_menu[i]); - sprintf((char *) monst_name,"%s",scenario.scen_monsters[on_monst_menu[i]].m_name); + sprintf((char *) monst_name,"%s",scenario.scen_monsters[on_monst_menu[i]].m_name.c_str()); c2pstr((char*)monst_name); AppendMenu(monst_menu,monst_name); } diff --git a/osx/boe.infodlg.cpp b/osx/boe.infodlg.cpp index 310ac436..236c9ab3 100644 --- a/osx/boe.infodlg.cpp +++ b/osx/boe.infodlg.cpp @@ -810,7 +810,7 @@ void display_pc_info() store = pc_carry_weight(pc); i = amount_pc_can_carry(pc); - sprintf ((char *) to_draw, "%s is carrying %d stones out of %d.",ADVEN[pc].name,store,i); + sprintf ((char *) to_draw, "%s is carrying %d stones out of %d.",ADVEN[pc].name.c_str(),store,i); csit(1019,69,(char *) to_draw); sprintf((char *) str,"%d out of %d.", diff --git a/osx/boe.items.cpp b/osx/boe.items.cpp index b3ad5f94..04f3fa35 100644 --- a/osx/boe.items.cpp +++ b/osx/boe.items.cpp @@ -149,8 +149,8 @@ bool give_to_pc(short pc_num,cItemRec item,short print_result) } if (in_startup_mode == false) { if (item.is_ident() == 0) - sprintf((char *) announce_string," %s gets %s.",ADVEN[pc_num].name,item.name); - else sprintf((char *) announce_string," %s gets %s.",ADVEN[pc_num].name,item.full_name); + sprintf((char *) announce_string," %s gets %s.",ADVEN[pc_num].name.c_str(),item.name.c_str()); + else sprintf((char *) announce_string," %s gets %s.",ADVEN[pc_num].name.c_str(),item.full_name.c_str()); if (print_result == true) add_string_to_buf((char *)announce_string); } @@ -180,8 +180,8 @@ bool forced_give(short item_num,eItemAbil abil) //// ADVEN[i].items[j] = item; if (item.is_ident() == 0) - sprintf((char *) announce_string," %s gets %s.",ADVEN[i].name,item.name); - else sprintf((char *) announce_string," %s gets %s.",ADVEN[i].name,item.full_name); + sprintf((char *) announce_string," %s gets %s.",ADVEN[i].name.c_str(),item.name.c_str()); + else sprintf((char *) announce_string," %s gets %s.",ADVEN[i].name.c_str(),item.full_name.c_str()); add_string_to_buf((char *)announce_string); combine_things(i); sort_pc_items(i); @@ -449,39 +449,39 @@ void enchant_weapon(short pc_num,short item_hit,short enchant_type,short new_val ADVEN[pc_num].items[item_hit].set_enchanted(true); switch (enchant_type) { case 0: - sprintf((char *)store_name,"%s (+1)",ADVEN[pc_num].items[item_hit].full_name); + sprintf((char *)store_name,"%s (+1)",ADVEN[pc_num].items[item_hit].full_name.c_str()); ADVEN[pc_num].items[item_hit].bonus++; ADVEN[pc_num].items[item_hit].value = new_val; break; case 1: - sprintf((char *)store_name,"%s (+2)",ADVEN[pc_num].items[item_hit].full_name); + sprintf((char *)store_name,"%s (+2)",ADVEN[pc_num].items[item_hit].full_name.c_str()); ADVEN[pc_num].items[item_hit].bonus += 2; ADVEN[pc_num].items[item_hit].value = new_val; break; case 2: - sprintf((char *)store_name,"%s (+3)",ADVEN[pc_num].items[item_hit].full_name); + sprintf((char *)store_name,"%s (+3)",ADVEN[pc_num].items[item_hit].full_name.c_str()); ADVEN[pc_num].items[item_hit].bonus += 3; ADVEN[pc_num].items[item_hit].value = new_val; break; case 3: - sprintf((char *)store_name,"%s (F)",ADVEN[pc_num].items[item_hit].full_name); + sprintf((char *)store_name,"%s (F)",ADVEN[pc_num].items[item_hit].full_name.c_str()); ADVEN[pc_num].items[item_hit].ability = ITEM_SPELL_FLAME; ADVEN[pc_num].items[item_hit].ability_strength = 5; ADVEN[pc_num].items[item_hit].charges = 8; break; case 4: - sprintf((char *)store_name,"%s (F!)",ADVEN[pc_num].items[item_hit].full_name); + sprintf((char *)store_name,"%s (F!)",ADVEN[pc_num].items[item_hit].full_name.c_str()); ADVEN[pc_num].items[item_hit].value = new_val; ADVEN[pc_num].items[item_hit].ability = ITEM_FLAMING_WEAPON; ADVEN[pc_num].items[item_hit].ability_strength = 5; break; case 5: - sprintf((char *)store_name,"%s (+5)",ADVEN[pc_num].items[item_hit].full_name); + sprintf((char *)store_name,"%s (+5)",ADVEN[pc_num].items[item_hit].full_name.c_str()); ADVEN[pc_num].items[item_hit].value = new_val; ADVEN[pc_num].items[item_hit].bonus += 5; break; case 6: - sprintf((char *)store_name,"%s (B)",ADVEN[pc_num].items[item_hit].full_name); + sprintf((char *)store_name,"%s (B)",ADVEN[pc_num].items[item_hit].full_name.c_str()); ADVEN[pc_num].items[item_hit].bonus++; ADVEN[pc_num].items[item_hit].ability = ITEM_BLESS_CURSE; ADVEN[pc_num].items[item_hit].ability_strength = 5; @@ -925,7 +925,7 @@ void put_item_graphics() if (current_getting_pc < 6) { i = amount_pc_can_carry(current_getting_pc); storage = pc_carry_weight(current_getting_pc); - sprintf ((char *) message, "%s is carrying %d out of %d.",ADVEN[current_getting_pc].name,storage,i); + sprintf ((char *) message, "%s is carrying %d out of %d.",ADVEN[current_getting_pc].name.c_str(),storage,i); csit(987,52,(char *) message); } diff --git a/osx/boe.locutils.cpp b/osx/boe.locutils.cpp index 106afb45..6b24682b 100644 --- a/osx/boe.locutils.cpp +++ b/osx/boe.locutils.cpp @@ -77,20 +77,20 @@ short set_direction (location old_pt, location new_pt) { if (old_pt.x == new_pt.x) if (old_pt.y > new_pt.y) - return 0; - else return 4; + return DIR_N; + else return DIR_S; if (old_pt.x > new_pt.x) { if (old_pt.y > new_pt.y) - return 7; + return DIR_NW; if (old_pt.y < new_pt.y) - return 5; - return 6; - } + return DIR_SW; + return DIR_W; + } if (old_pt.y > new_pt.y) - return 1; + return DIR_NE; if (old_pt.y < new_pt.y) - return 3; - return 2; + return DIR_SE; + return DIR_E; } location global_to_local(location global) @@ -322,7 +322,7 @@ bool is_container(location loc) if ((univ.town.is_barrel(loc.x,loc.y)) || (univ.town.is_crate(loc.x,loc.y))) return true; ter = coord_to_ter(loc.x,loc.y); - if (scenario.ter_types[ter].special == 14) + if (scenario.ter_types[ter].special == TER_SPEC_IS_A_CONTAINER) return true; return false; } @@ -393,10 +393,10 @@ bool is_blocked(location to_check) } // Keep away from marked specials during combat - if ((is_combat()) && (gr <= 212) && (gr >= 207)) + if ((is_combat()) && univ.town.is_spot(to_check.x, to_check.y)) return true; if ((is_combat()) && (gr == 406)) - return true; + return true; // TODO: Replace gr == 406 with a blockage == clear/special && is_special() check // Party there? if (is_town()) @@ -755,8 +755,7 @@ void alter_space(short i,short j,unsigned char ter) else { univ.town->terrain(i,j) = ter; combat_terrain[i][j] = ter; - if ((scenario.ter_types[univ.town->terrain(i,j)].special >= 16) && - (scenario.ter_types[univ.town->terrain(i,j)].special <= 19)) - belt_present = true; + if (scenario.ter_types[univ.town->terrain(i,j)].special == TER_SPEC_CONVEYOR) + belt_present = true; } } diff --git a/osx/boe.main.cpp b/osx/boe.main.cpp index 723ae802..ea2d0cc4 100644 --- a/osx/boe.main.cpp +++ b/osx/boe.main.cpp @@ -1330,7 +1330,7 @@ void move_sound(unsigned char ter,short step){ }else on_swamp = false; if ((monsters_going == false) && (overall_mode < MODE_COMBAT) && (univ.party.in_boat >= 0)) {// is on boat ? - if (spec == 21) //town entrance ? + if (spec == TER_SPEC_TOWN_ENTRANCE) //town entrance ? return; play_sound(48); //play boat sound } diff --git a/osx/boe.monster.cpp b/osx/boe.monster.cpp index c31b0609..883efa9f 100644 --- a/osx/boe.monster.cpp +++ b/osx/boe.monster.cpp @@ -1018,13 +1018,12 @@ bool monst_check_special_terrain(location where_check,short mode,short which_mon which_m = &univ.town.monst.dudes[which_monst]; ter_abil = scenario.ter_types[ter].special; - if ((mode > 0) && (ter_abil >= 16) && - (ter_abil <= 19)) { + if ((mode > 0) && (ter_abil == TER_SPEC_CONVEYOR)) { if ( - ((ter_abil == 16) && (where_check.y > from_loc.y)) || - ((ter_abil == 17) && (where_check.x < from_loc.x)) || - ((ter_abil == 18) && (where_check.y < from_loc.y)) || - ((ter_abil == 19) && (where_check.x > from_loc.x)) ) { + ((ter_abil == DIR_N) && (where_check.y > from_loc.y)) || + ((ter_abil == DIR_E) && (where_check.x < from_loc.x)) || + ((ter_abil == DIR_S) && (where_check.y < from_loc.y)) || + ((ter_abil == DIR_W) && (where_check.x > from_loc.x)) ) { return false; } } @@ -1119,10 +1118,10 @@ bool monst_check_special_terrain(location where_check,short mode,short which_mon } } - if (monster_placid(which_monst) && // monstyers don't hop into bed when things are calm - (scenario.ter_types[ter].picture == 143)) + if (monster_placid(which_monst) && // monsters don't hop into bed when things are calm + (scenario.ter_types[ter].special == TER_SPEC_BED)) can_enter = false; - if ((scenario.ter_types[ter].picture <= 212) && (scenario.ter_types[ter].picture >= 207)) + if (mode == 1 && univ.town.is_spot(where_check.x, where_check.y)) can_enter = false; if (ter == 90) { if ((is_combat()) && (which_combat_type == 0)) { diff --git a/osx/boe.newgraph.cpp b/osx/boe.newgraph.cpp index 5a5b51fe..7e5ac1a7 100644 --- a/osx/boe.newgraph.cpp +++ b/osx/boe.newgraph.cpp @@ -839,12 +839,12 @@ char *cost_strs[] = {"Extremely Cheap","Very Reasonable","Pretty Average","Somew RGBForeColor(&c[3]); switch (store_shop_type) { - case 3: sprintf(cur_name,"Healing for %s.",ADVEN[current_pc].name); break; - case 10: sprintf(cur_name,"Mage Spells for %s.",ADVEN[current_pc].name);break; - case 11: sprintf(cur_name,"Priest Spells for %s.",ADVEN[current_pc].name); break; + case 3: sprintf(cur_name,"Healing for %s.",ADVEN[current_pc].name.c_str()); break; + case 10: sprintf(cur_name,"Mage Spells for %s.",ADVEN[current_pc].name.c_str());break; + case 11: sprintf(cur_name,"Priest Spells for %s.",ADVEN[current_pc].name.c_str()); break; case 12: sprintf(cur_name,"Buying Alchemy.");break; case 4: sprintf(cur_name,"Buying Food.");break; - default:sprintf(cur_name,"Shopping for %s.",ADVEN[current_pc].name); break; + default:sprintf(cur_name,"Shopping for %s.",ADVEN[current_pc].name.c_str()); break; } char_port_draw_string( talk_gworld,shopper_name,cur_name,2,18,false); diff --git a/osx/boe.party.cpp b/osx/boe.party.cpp index f5ba2ebb..1fa68094 100644 --- a/osx/boe.party.cpp +++ b/osx/boe.party.cpp @@ -663,16 +663,20 @@ void cure_party(short amt) } +// if how_much < 0, bless void curse_pc(short which_pc,short how_much) { if (ADVEN[which_pc].main_status != 1) return; if (ADVEN[which_pc].main_status == 1) { - ADVEN[which_pc].status[1] = max(ADVEN[which_pc].status[1] - how_much,-8); - sprintf ((char *) c_line, " %s cursed.",(char *) ADVEN[which_pc].name.c_str()); + ADVEN[which_pc].status[1] = minmax(-8,8,ADVEN[which_pc].status[1] - how_much); + if(how_much < 0) + sprintf ((char *) c_line, " %s blessed.",(char *) ADVEN[which_pc].name.c_str()); + else sprintf ((char *) c_line, " %s cursed.",(char *) ADVEN[which_pc].name.c_str()); add_string_to_buf((char *) c_line); } put_pc_screen(); + if (how_much < 0) give_help(59,0,0); } @@ -1403,7 +1407,7 @@ void give_party_spell(short which) //// if (ADVEN[i].mage_spells[which] == false) { ADVEN[i].mage_spells[which] = true; if (ADVEN[i].main_status == 1) - sprintf((char *) str,"%s learns spell.",ADVEN[i].name); + sprintf((char *) str,"%s learns spell.",ADVEN[i].name.c_str()); give_help(41,0,0); if (sound_done == false) {sound_done = true; play_sound(62);}; } @@ -1412,7 +1416,7 @@ void give_party_spell(short which) //// if (ADVEN[i].priest_spells[which - 100] == false) { ADVEN[i].priest_spells[which - 100] = true; if (ADVEN[i].main_status == 1) - sprintf((char *) str,"%s learns spell.",ADVEN[i].name); + sprintf((char *) str,"%s learns spell.",ADVEN[i].name.c_str()); give_help(41,0,0); if (sound_done == false) {sound_done = true; play_sound(62);}; } @@ -1588,7 +1592,7 @@ void do_mage_spell(short pc_num,short spell_num) } if ((spell_num == 29) && (target < 6)) { ADVEN[target].status[5] += 2 + stat_adj(pc_num,2) + get_ran(2,1,2); - sprintf ((char *) c_line, " %s protected.",ADVEN[target].name); + sprintf ((char *) c_line, " %s protected.",ADVEN[target].name.c_str()); } add_string_to_buf((char *) c_line); break; @@ -2072,27 +2076,24 @@ void cast_town_spell(location where) //// break; case 20: - switch (scenario.ter_types[ter].special) { //// - case 9: case 10: + if (scenario.ter_types[ter].special == TER_SPEC_UNLOCKABLE){ + if (scenario.ter_types[ter].flag2 == 10) + r1 = 10000; + else{ r1 = get_ran(1,1,100) - 5 * stat_adj(who_cast,2) + 5 * univ.town.difficulty; r1 += scenario.ter_types[ter].flag2 * 7; - if (scenario.ter_types[ter].flag2 == 10) - r1 = 10000; - if (r1 < (135 - combat_percent[min(19,ADVEN[who_cast].level)])) { - add_string_to_buf(" Door unlocked. "); - play_sound(9); - univ.town->terrain(where.x,where.y) = scenario.ter_types[ter].flag1; - } - else { - play_sound(41); - add_string_to_buf(" Didn't work. "); - } - break; - - default: - add_string_to_buf(" Wrong terrain type. "); - break; } + if (r1 < (135 - combat_percent[min(19,ADVEN[who_cast].level)])) { + add_string_to_buf(" Door unlocked. "); + play_sound(9); + univ.town->terrain(where.x,where.y) = scenario.ter_types[ter].flag1; + } + else { + play_sound(41); + add_string_to_buf(" Didn't work. "); + } + }else + add_string_to_buf(" Wrong terrain type. "); break; case 41: @@ -2135,14 +2136,14 @@ void sanctify_space(location where) add_string_to_buf(" Nothing happens."); } -void crumble_wall(location where) +void crumble_wall(location where) // TODO: Add something like this to the spreading quickfire function { unsigned char ter; if (loc_off_act_area(where) == true) return; ter = univ.town->terrain(where.x,where.y); - if (scenario.ter_types[ter].special == 7) { + if (scenario.ter_types[ter].special == TER_SPEC_CRUMBLING && scenario.ter_types[ter].flag3 < 2) { play_sound(60); univ.town->terrain(where.x,where.y) = scenario.ter_types[ter].flag1; add_string_to_buf(" Barrier crumbles."); @@ -2169,16 +2170,16 @@ void do_mindduel(short pc_num,cCreature *monst) r1 += 5 * balance; r2 = get_ran(1,1,6); if (r1 < 30) { - sprintf((char *)c_line, " %s is drained %d.",ADVEN[pc_num].name,r2); + sprintf((char *)c_line, " %s is drained %d.",ADVEN[pc_num].name.c_str(),r2); add_string_to_buf((char *) c_line); monst->m_d.mp += r2; balance++; if (ADVEN[pc_num].cur_sp == 0) { ADVEN[pc_num].status[9] += 2; - sprintf((char *) c_line," %s is dumbfounded.",ADVEN[pc_num].name); + sprintf((char *) c_line," %s is dumbfounded.",ADVEN[pc_num].name.c_str()); add_string_to_buf((char *) c_line); if (ADVEN[pc_num].status[9] > 7) { - sprintf((char *) c_line," %s is killed!",ADVEN[pc_num].name); + sprintf((char *) c_line," %s is killed!",ADVEN[pc_num].name.c_str()); add_string_to_buf((char *) c_line); kill_pc(pc_num,MAIN_STATUS_DEAD); } @@ -2189,7 +2190,7 @@ void do_mindduel(short pc_num,cCreature *monst) } } if (r1 > 70) { - sprintf((char *)c_line, " %s drains %d.",ADVEN[pc_num].name,r2); + sprintf((char *)c_line, " %s drains %d.",ADVEN[pc_num].name.c_str(),r2); add_string_to_buf((char *) c_line); ADVEN[pc_num].cur_sp += r2; balance--; @@ -2960,7 +2961,7 @@ short alch_choice(short pc_num) cd_activate_item(1047,9 + i * 2,0); } sprintf((char *) get_text, "%s (skill %d)", - ADVEN[pc_num].name,ADVEN[pc_num].skills[12]); + ADVEN[pc_num].name.c_str(),ADVEN[pc_num].skills[12]); cd_set_item_text(1047,4,get_text); if (univ.party.help_received[20] == 0) { cd_initial_draw(1047); @@ -3479,7 +3480,7 @@ void set_pc_moves() else { // do webs ADVEN[i].ap = max(0,ADVEN[i].ap - ADVEN[i].status[6] / 2); if (ADVEN[i].ap == 0) { - sprintf((char *) c_line,"%s must clean webs.",ADVEN[i].name); + sprintf((char *) c_line,"%s must clean webs.",ADVEN[i].name.c_str()); add_string_to_buf((char *) c_line); ADVEN[i].status[6] = max(0,ADVEN[i].status[6] - 3); } diff --git a/osx/boe.specials.cpp b/osx/boe.specials.cpp index 5b52fc3c..60f3d128 100644 --- a/osx/boe.specials.cpp +++ b/osx/boe.specials.cpp @@ -145,7 +145,7 @@ bool check_special_terrain(location where_check,short mode,short which_pc,short // sets forced to true if definitely can enter { unsigned short ter; - short r1,i,choice,door_pc,ter_special,ter_flag1,ter_flag2,pic_type = 0,ter_pic = 0; + short r1,i,choice,door_pc,ter_special,ter_flag1,ter_flag2,ter_flag3,pic_type = 0,ter_pic = 0; eDamageType dam_type = DAMAGE_WEAPON; bool can_enter = true; location out_where,from_loc,to_loc; @@ -171,15 +171,15 @@ bool check_special_terrain(location where_check,short mode,short which_pc,short ter_special = scenario.ter_types[ter].special; ter_flag1 = scenario.ter_types[ter].flag1; ter_flag2 = scenario.ter_types[ter].flag2; + ter_flag3 = scenario.ter_types[ter].flag3; ter_pic = scenario.ter_types[ter].picture; - if ((mode > 0) && (ter_special >= 16) && - (ter_special <= 19)) { + if ((mode > 0) && (ter_special == TER_SPEC_CONVEYOR)) { if ( - ((ter_special == 16) && (where_check.y > from_loc.y)) || - ((ter_special == 17) && (where_check.x < from_loc.x)) || - ((ter_special == 18) && (where_check.y < from_loc.y)) || - ((ter_special == 19) && (where_check.x > from_loc.x)) ) { + ((ter_flag3 == DIR_N) && (where_check.y > from_loc.y)) || + ((ter_flag3 == DIR_E) && (where_check.x < from_loc.x)) || + ((ter_flag3 == DIR_S) && (where_check.y < from_loc.y)) || + ((ter_flag3 == DIR_W) && (where_check.x > from_loc.x)) ) { ASB("The moving floor prevents you."); return false; } @@ -202,11 +202,11 @@ bool check_special_terrain(location where_check,short mode,short which_pc,short put_pc_screen(); put_item_screen(stat_window,0); } - } + } - if ((is_combat()) && (((ter_pic <= 207) && (ter_pic >= 212)) || (ter_pic == 406))) { + if ((is_combat()) && (univ.town.is_spot(where_check.x, where_check.y) || (ter_pic == 406))) { ASB("Move: Can't trigger this special in combat."); - return false; + return false; // TODO: Replace ter_pic == 406 with a blockage == clear/special && is_special() check } if (((mode == 1) || ((mode == 2) && (which_combat_type == 1))) @@ -221,8 +221,8 @@ bool check_special_terrain(location where_check,short mode,short which_pc,short *forced = true; } *spec_num = univ.town->spec_id[i]; - if ((is_blocked(where_check) == false) || (ter_special == 1) - || (ter_special == 12) || (ter_special == 13)) { + if ((is_blocked(where_check) == false) || (ter_special == TER_SPEC_CHANGE_WHEN_STEP_ON) + || (ter_special == TER_SPEC_CALL_SPECIAL)) { give_help(54,0,0); run_special(mode,2,univ.town->spec_id[i],where_check,&s1,&s2,&s3); if (s1 > 0) @@ -231,59 +231,58 @@ bool check_special_terrain(location where_check,short mode,short which_pc,short } put_pc_screen(); put_item_screen(stat_window,0); - } + } if (can_enter == false) return false; if ((!is_out()) && (overall_mode < MODE_TALKING)) { - check_fields(where_check,mode,which_pc); - - if (univ.town.is_web(where_check.x,where_check.y)) { - add_string_to_buf(" Webs! "); - if (mode < 2) { - suppress_stat_screen = true; - for (i = 0; i < 6; i++) { - r1 = get_ran(1,2,3); - web_pc(i,r1); + check_fields(where_check,mode,which_pc); + + if (univ.town.is_web(where_check.x,where_check.y)) { + add_string_to_buf(" Webs! "); + if (mode < 2) { + suppress_stat_screen = true; + for (i = 0; i < 6; i++) { + r1 = get_ran(1,2,3); + web_pc(i,r1); } - suppress_stat_screen = true; - put_pc_screen(); + suppress_stat_screen = true; + put_pc_screen(); } else web_pc(current_pc,get_ran(1,2,3)); - univ.town.set_web(where_check.x,where_check.y,false); + univ.town.set_web(where_check.x,where_check.y,false); } - if (univ.town.is_force_barr(where_check.x,where_check.y)) { - add_string_to_buf(" Magic barrier! "); - can_enter = false; + if (univ.town.is_force_barr(where_check.x,where_check.y)) { + add_string_to_buf(" Magic barrier! "); + can_enter = false; } - if (univ.town.is_crate(where_check.x,where_check.y)) { - add_string_to_buf(" You push the crate."); - to_loc = push_loc(from_loc,where_check); - univ.town.set_crate((short) where_check.x,(short) where_check.y,false); - if (to_loc.x > 0) - univ.town.set_crate((short) to_loc.x,(short) to_loc.y,true); - for (i = 0; i < NUM_TOWN_ITEMS; i++) - if ((univ.town.items[i].variety > 0) && (univ.town.items[i].item_loc == where_check) - && (univ.town.items[i].is_contained() == true)) - univ.town.items[i].item_loc = to_loc; + if (univ.town.is_crate(where_check.x,where_check.y)) { + add_string_to_buf(" You push the crate."); + to_loc = push_loc(from_loc,where_check); + univ.town.set_crate((short) where_check.x,(short) where_check.y,false); + if (to_loc.x > 0) + univ.town.set_crate((short) to_loc.x,(short) to_loc.y,true); + for (i = 0; i < NUM_TOWN_ITEMS; i++) + if ((univ.town.items[i].variety > 0) && (univ.town.items[i].item_loc == where_check) + && (univ.town.items[i].is_contained() == true)) + univ.town.items[i].item_loc = to_loc; } - if (univ.town.is_barrel(where_check.x,where_check.y)) { - add_string_to_buf(" You push the barrel."); - to_loc = push_loc(from_loc,where_check); - univ.town.set_barrel((short) where_check.x,(short) where_check.y,false); - if (to_loc.x > 0) - univ.town.set_barrel((short) to_loc.x,(short) to_loc.y,false); - for (i = 0; i < NUM_TOWN_ITEMS; i++) - if ((univ.town.items[i].variety > 0) && (univ.town.items[i].item_loc == where_check) - && (univ.town.items[i].is_contained())) - univ.town.items[i].item_loc = to_loc; + if (univ.town.is_barrel(where_check.x,where_check.y)) { + add_string_to_buf(" You push the barrel."); + to_loc = push_loc(from_loc,where_check); + univ.town.set_barrel((short) where_check.x,(short) where_check.y,false); + if (to_loc.x > 0) + univ.town.set_barrel((short) to_loc.x,(short) to_loc.y,false); + for (i = 0; i < NUM_TOWN_ITEMS; i++) + if ((univ.town.items[i].variety > 0) && (univ.town.items[i].item_loc == where_check) + && (univ.town.items[i].is_contained())) + univ.town.items[i].item_loc = to_loc; } - } - + } switch (ter_special) { - case 1: + case TER_SPEC_CHANGE_WHEN_STEP_ON: alter_space(where_check.x,where_check.y,ter_flag1); if (ter_flag2 < 200) { play_sound(-1 * ter_flag2); @@ -292,25 +291,38 @@ bool check_special_terrain(location where_check,short mode,short which_pc,short if (scenario.ter_types[ter].blockage > 2) can_enter = false; break; - case 2: case 3:case 4: + case TER_SPEC_DAMAGING: if (flying()) break; - if (ter_special == 2) { - add_string_to_buf(" It's hot!"); - dam_type = DAMAGE_FIRE; pic_type = 0; - if (PSD[SDF_PARTY_FIREWALK] > 0) { - add_string_to_buf(" It doesn't affect you."); - break; + if(ter_flag3 > 0 && ter_flag3 < 8) + dam_type = (eDamageType) ter_flag3; + else dam_type = DAMAGE_WEAPON; + switch(dam_type){ + case DAMAGE_FIRE: + add_string_to_buf(" It's hot!"); + pic_type = 0; + if (PSD[SDF_PARTY_FIREWALK] > 0) { + add_string_to_buf(" It doesn't affect you."); + goto LBL_NO_DAMAGE; } - } - if (ter_special == 3) { - add_string_to_buf(" You feel cold!"); - dam_type = DAMAGE_COLD; pic_type = 4; - } - if (ter_special == 4) { - add_string_to_buf(" Something shocks you!"); - dam_type = DAMAGE_MAGIC; pic_type = 1; - } + case DAMAGE_COLD: + add_string_to_buf(" You feel cold!"); + pic_type = 4; + case DAMAGE_MAGIC: + case DAMAGE_UNBLOCKABLE: + add_string_to_buf(" Something shocks you!"); + pic_type = 1; + case DAMAGE_WEAPON: + add_string_to_buf(" You feel pain!"); + pic_type = 3; + case DAMAGE_POISON: + add_string_to_buf(" You suddenly feel very ill for a moment..."); + pic_type = 2; + case DAMAGE_UNDEAD: + case DAMAGE_DEMON: + add_string_to_buf(" A dark wind blows through you!"); + pic_type = 1; // TODO: Verify that this is correct + } r1 = get_ran(ter_flag2,dam_type,ter_flag1); if (mode < 2) hit_party(r1,dam_type); @@ -320,47 +332,96 @@ bool check_special_terrain(location where_check,short mode,short which_pc,short if (overall_mode < MODE_COMBAT) boom_space(univ.party.p_loc,overall_mode,pic_type,r1,12); fast_bang = 0; - break; - case 5: case 6: + LBL_NO_DAMAGE: break; + case TER_SPEC_DANGEROUS: if (flying()) break; if (univ.party.in_boat >= 0) return true; //one_sound(17); - if (mode < 2) { - for (i = 0; i < 6; i++) - if (ADVEN[i].main_status == 1) - { - if (get_ran(1,1,100) <= ter_flag2) { - if (ter_special == 5) + if (mode == 2) i = which_pc; else i = 0; + for ( ; i < 6; i++) + if (ADVEN[i].main_status == 1) { + if (get_ran(1,1,100) <= ter_flag2) { + switch(ter_flag3){ + case STATUS_POISONED_WEAPON: // TODO: Do something here + break; + case STATUS_BLESS: + curse_pc(i,ter_flag1); + break; + case STATUS_POISON: poison_pc(i,ter_flag1); - else disease_pc(i,ter_flag1); - } + break; + case STATUS_HASTE: + slow_pc(i,ter_flag1); + break; + case STATUS_INVULNERABLE: // TODO: Do something here + break; + case STATUS_MAGIC_RESISTANCE: // TODO: Do something here + break; + case STATUS_WEBS: + web_pc(i,ter_flag1); + break; + case STATUS_DISEASE: + disease_pc(i,ter_flag1); + break; + case STATUS_INVISIBLE: + void_sanctuary(i); + break; + case STATUS_DUMB: + dumbfound_pc(i,ter_flag1); + break; + case STATUS_MARTYRS_SHIELD: // TODO: Do something here + break; + case STATUS_ASLEEP: + sleep_pc(i,ter_flag1,STATUS_ASLEEP,ter_flag1); + break; + case STATUS_PARALYZED: // TODO: Do something here + break; + case STATUS_ACID: + acid_pc(i,ter_flag1); + break; + case 14: // bless + curse_pc(i,-ter_flag1); + break; + case 15: // haste + slow_pc(i,-ter_flag1); + break; } + if(mode == 2) break; // only damage once in combat! + } } //print_nums(1,which_pc,current_pc); - if (mode == 2) { - if (get_ran(1,1,100) <= ter_flag2){ - if (ter_special == 5) - poison_pc(which_pc,ter_flag1); - else disease_pc(which_pc,ter_flag1); - } - } +// if (mode == 2) { +// if (get_ran(1,1,100) <= ter_flag2){ +// if (ter_special == 5) +// poison_pc(which_pc,ter_flag1); +// else disease_pc(which_pc,ter_flag1); +// } +// } break; - case 12: // local special - run_special(mode,2,ter_flag1,where_check,&s1,&s2,&s3); - if (s1 > 0) - can_enter = false; - break; - case 13: // global special - run_special(mode,0,ter_flag1,where_check,&s1,&s2,&s3); + case TER_SPEC_CALL_SPECIAL:{ + short spec_type = 0; + if(ter_flag2 == 3){ + if(mode == 1 || (mode == 2 && which_combat_type == 1)) spec_type = 2; else spec_type = 1; + }else if(ter_flag2 == 2 && (mode == 0 || (mode == 2 && which_combat_type == 0))) + spec_type = 1; + else if(ter_flag2 == 1 && (mode == 1 || (mode == 2 && which_combat_type == 1))) + spec_type = 2; + run_special(mode,spec_type,ter_flag1,where_check,&s1,&s2,&s3); if (s1 > 0) can_enter = false; break; + } +// case 13: // global special +// run_special(mode,0,ter_flag1,where_check,&s1,&s2,&s3); +// if (s1 > 0) +// can_enter = false; +// break; // Locked doors - case 9: case 10: + case TER_SPEC_UNLOCKABLE: if (is_combat()) { // No lockpicking in combat add_string_to_buf(" Can't enter: It's locked."); break; @@ -561,8 +622,8 @@ effect_pat_type s = {{{0,0,0,0,0,0,0,0,0}, } if (take_charge == true) { if (!ADVEN[pc].items[item].is_ident()) - sprintf((char *) to_draw, "Use: %s",ADVEN[pc].items[item].name); - else sprintf((char *) to_draw, "Use: %s",ADVEN[pc].items[item].full_name); + sprintf((char *) to_draw, "Use: %s",ADVEN[pc].items[item].name.c_str()); + else sprintf((char *) to_draw, "Use: %s",ADVEN[pc].items[item].full_name.c_str()); add_string_to_buf((char *) to_draw); if ((ADVEN[pc].items[item].variety == 7) && @@ -956,7 +1017,7 @@ bool use_space(location where) univ.town.items[i].item_loc = to_loc; } - if (scenario.ter_types[ter].special == 22) { + if (scenario.ter_types[ter].special == TER_SPEC_CHANGE_WHEN_USED) { if (where == from_loc) { add_string_to_buf(" Not while on space."); return false; @@ -965,8 +1026,16 @@ bool use_space(location where) alter_space(where.x,where.y,scenario.ter_types[ter].flag1); play_sound(scenario.ter_types[ter].flag2); return true; - }else if (scenario.ter_types[ter].special == 23) // call special - run_special(17,0,scenario.ter_types[ter].flag1,where,&i,&i,&i); + }else if (scenario.ter_types[ter].special == TER_SPEC_CALL_SPECIAL_WHEN_USED){ // call special + short spec_type = 0; + if(scenario.ter_types[ter].flag2 == 3){ + if((is_town() || (is_combat() && which_combat_type == 1))) spec_type = 2; else spec_type = 1; + }else if(scenario.ter_types[ter].flag2 == 1 && (is_town() || (is_combat() && which_combat_type == 1))) + spec_type = 2; + else if(scenario.ter_types[ter].flag2 == 2 && (is_out() || (is_combat() && which_combat_type == 1))) + spec_type = 1; + run_special(17,spec_type,scenario.ter_types[ter].flag1,where,&i,&i,&i); + } add_string_to_buf(" Nothing to use."); return false; @@ -1428,7 +1497,7 @@ void push_things()//// unsigned char ter; location l; - if (is_out()) + if (is_out()) // TODO: Make these work outdoors return; if (belt_present == false) return; @@ -1437,11 +1506,11 @@ void push_things()//// if (univ.town.monst.dudes[i].active > 0) { l = univ.town.monst.dudes[i].cur_loc; ter = univ.town->terrain(l.x,l.y); - switch (scenario.ter_types[ter].special) { - case 16: l.y--; break; - case 17: l.x++; break; - case 18: l.y++; break; - case 19: l.x--; break; + switch (scenario.ter_types[ter].flag1) { // TODO: Implement the other 4 possible directions + case DIR_N: l.y--; break; + case DIR_E: l.x++; break; + case DIR_S: l.y++; break; + case DIR_W: l.x--; break; } if (l != univ.town.monst.dudes[i].cur_loc) { univ.town.monst.dudes[i].cur_loc = l; @@ -1454,11 +1523,11 @@ void push_things()//// if (univ.town.items[i].variety > 0) { l = univ.town.items[i].item_loc; ter = univ.town->terrain(l.x,l.y); - switch (scenario.ter_types[ter].special) { - case 16: l.y--; break; - case 17: l.x++; break; - case 18: l.y++; break; - case 19: l.x--; break; + switch (scenario.ter_types[ter].flag1) { // TODO: Implement the other 4 possible directions + case DIR_N: l.y--; break; + case DIR_E: l.x++; break; + case DIR_S: l.y++; break; + case DIR_W: l.x--; break; } if (l != univ.town.items[i].item_loc) { univ.town.items[i].item_loc = l; @@ -1471,15 +1540,15 @@ void push_things()//// if (is_town()) { ter = univ.town->terrain(univ.town.p_loc.x,univ.town.p_loc.y); l = univ.town.p_loc; - switch (scenario.ter_types[ter].special) { - case 16: l.y--; break; - case 17: l.x++; break; - case 18: l.y++; break; - case 19: l.x--; break; + switch (scenario.ter_types[ter].flag1) { // TODO: Implement the other 4 possible directions + case DIR_N: l.y--; break; + case DIR_E: l.x++; break; + case DIR_S: l.y++; break; + case DIR_W: l.x--; break; } if (l != univ.town.p_loc) { ASB("You get pushed."); - if (scenario.ter_types[ter].special >= 16) + if (scenario.ter_types[ter].special == TER_SPEC_CONVEYOR) draw_terrain(0); center = l; univ.town.p_loc = l; @@ -1506,16 +1575,16 @@ void push_things()//// if (ADVEN[i].main_status == 1) { ter = univ.town->terrain(pc_pos[i].x,pc_pos[i].y); l = pc_pos[i]; - switch (scenario.ter_types[ter].special) { - case 16: l.y--; break; - case 17: l.x++; break; - case 18: l.y++; break; - case 19: l.x--; break; + switch (scenario.ter_types[ter].flag1) { // TODO: Implement the other 4 possible directions + case DIR_N: l.y--; break; + case DIR_E: l.x++; break; + case DIR_S: l.y++; break; + case DIR_W: l.x--; break; } if (l != pc_pos[i]) { ASB("Someone gets pushed."); ter = univ.town->terrain(l.x,l.y); - if (scenario.ter_types[ter].special >= 16) + if (scenario.ter_types[ter].special == TER_SPEC_CONVEYOR) draw_terrain(0); pc_pos[i] = l; update_explored(l); @@ -2490,7 +2559,7 @@ void townmode_spec(short which_mode,cSpecial cur_node,short cur_spec_type, break; case 171: set_terrain(l,spec.ex2a); - if(scenario.ter_types[spec.ex2a].special >= 16 && scenario.ter_types[spec.ex2a].special <=19) + if(scenario.ter_types[spec.ex2a].special == TER_SPEC_CONVEYOR) belt_present = true; *redraw = true; draw_map(modeless_dialogs[5],10); @@ -2498,12 +2567,12 @@ void townmode_spec(short which_mode,cSpecial cur_node,short cur_spec_type, case 172: if (coord_to_ter(spec.ex1a,spec.ex1b) == spec.ex2a){ set_terrain(l,spec.ex2b); - if(scenario.ter_types[spec.ex2a].special >= 16 && scenario.ter_types[spec.ex2a].special <=19) + if(scenario.ter_types[spec.ex2a].special == TER_SPEC_CONVEYOR) belt_present = true; } else if (coord_to_ter(spec.ex1a,spec.ex1b) == spec.ex2b){ set_terrain(l,spec.ex2a); - if(scenario.ter_types[spec.ex2a].special >= 16 && scenario.ter_types[spec.ex2a].special <=19) + if(scenario.ter_types[spec.ex2a].special == TER_SPEC_CONVEYOR) belt_present = true; } *redraw = 1; @@ -2512,7 +2581,7 @@ void townmode_spec(short which_mode,cSpecial cur_node,short cur_spec_type, case 173: ter = coord_to_ter(spec.ex1a,spec.ex1b); set_terrain(l,scenario.ter_types[ter].trans_to_what); - if(scenario.ter_types[spec.ex2a].special >= 16 && scenario.ter_types[spec.ex2a].special <=19) + if(scenario.ter_types[spec.ex2a].special == TER_SPEC_CONVEYOR) belt_present = true; *redraw = 1; draw_map(modeless_dialogs[5],10); @@ -2547,13 +2616,13 @@ void townmode_spec(short which_mode,cSpecial cur_node,short cur_spec_type, break; case 177: ter = coord_to_ter(spec.ex1a,spec.ex1b); - if (scenario.ter_types[ter].special == 8) + if (scenario.ter_types[ter].special == TER_SPEC_LOCKABLE) set_terrain(l,scenario.ter_types[ter].flag1); *redraw = 1; break; case 178: ter = coord_to_ter(spec.ex1a,spec.ex1b); - if ((scenario.ter_types[ter].special == 9) || (scenario.ter_types[ter].special == 10)) + if (scenario.ter_types[ter].special == TER_SPEC_UNLOCKABLE) set_terrain(l,scenario.ter_types[ter].flag1); *redraw = 1; break; @@ -2884,7 +2953,7 @@ void rect_spec(short which_mode,cSpecial cur_node,short cur_spec_type, case 214: if (get_ran(1,1,100) <= spec.sd2){ set_terrain(l,spec.sd1); - if(scenario.ter_types[spec.sd1].special >= 16 && scenario.ter_types[spec.sd1].special <=19) + if(scenario.ter_types[spec.sd1].special == TER_SPEC_CONVEYOR) belt_present = true; *redraw = true; draw_map(modeless_dialogs[5],10); @@ -2893,14 +2962,14 @@ void rect_spec(short which_mode,cSpecial cur_node,short cur_spec_type, case 215: if (coord_to_ter(i,j) == spec.sd1){ set_terrain(l,spec.sd2); - if(scenario.ter_types[spec.sd2].special >= 16 && scenario.ter_types[spec.sd2].special <=19) + if(scenario.ter_types[spec.sd2].special == TER_SPEC_CONVEYOR) belt_present = true; *redraw = true; draw_map(modeless_dialogs[5],10); } else if (coord_to_ter(i,j) == spec.sd2){ set_terrain(l,spec.sd1); - if(scenario.ter_types[spec.sd1].special >= 16 && scenario.ter_types[spec.sd1].special <=19) + if(scenario.ter_types[spec.sd1].special == TER_SPEC_CONVEYOR) belt_present = true; *redraw = true; draw_map(modeless_dialogs[5],10); @@ -2909,7 +2978,7 @@ void rect_spec(short which_mode,cSpecial cur_node,short cur_spec_type, case 216: ter = coord_to_ter(i,j); set_terrain(l,scenario.ter_types[ter].trans_to_what); - if(scenario.ter_types[scenario.ter_types[ter].trans_to_what].special >= 16 && scenario.ter_types[scenario.ter_types[ter].trans_to_what].special <=19) + if(scenario.ter_types[scenario.ter_types[ter].trans_to_what].special == TER_SPEC_CONVEYOR) belt_present = true; *redraw = true; draw_map(modeless_dialogs[5],10); @@ -2918,7 +2987,7 @@ void rect_spec(short which_mode,cSpecial cur_node,short cur_spec_type, ter = coord_to_ter(i,j); if (scenario.ter_types[ter].special == 8){ set_terrain(l,scenario.ter_types[ter].flag1); - if(scenario.ter_types[scenario.ter_types[ter].trans_to_what].special >= 16 && scenario.ter_types[scenario.ter_types[ter].trans_to_what].special <=19) + if(scenario.ter_types[scenario.ter_types[ter].trans_to_what].special == TER_SPEC_CONVEYOR) belt_present = true; *redraw = true; draw_map(modeless_dialogs[5],10); @@ -2926,9 +2995,9 @@ void rect_spec(short which_mode,cSpecial cur_node,short cur_spec_type, break; case 218: ter = coord_to_ter(i,j); - if ((scenario.ter_types[ter].special == 9) || (scenario.ter_types[ter].special == 10)){ + if (scenario.ter_types[ter].special == TER_SPEC_UNLOCKABLE){ set_terrain(l,scenario.ter_types[ter].flag1); - if(scenario.ter_types[scenario.ter_types[ter].trans_to_what].special >= 16 && scenario.ter_types[scenario.ter_types[ter].trans_to_what].special <=19) + if(scenario.ter_types[scenario.ter_types[ter].trans_to_what].special == TER_SPEC_CONVEYOR) belt_present = true; *redraw = true; draw_map(modeless_dialogs[5],10); diff --git a/osx/boe.text.cpp b/osx/boe.text.cpp index 465963f4..182248a6 100644 --- a/osx/boe.text.cpp +++ b/osx/boe.text.cpp @@ -355,12 +355,12 @@ void put_item_screen(short screen_num,short suppress_buttons) //// if (!ADVEN[pc].items[i_num].is_ident()) - sprintf((char *) to_draw, "%s ",ADVEN[pc].items[i_num].name); + sprintf((char *) to_draw, "%s ",ADVEN[pc].items[i_num].name.c_str()); else { /// Don't place # of charges when Sell button up and space tight if ((ADVEN[pc].items[i_num].charges > 0) && (ADVEN[pc].items[i_num].type != 2) && (stat_screen_mode <= 1)) - sprintf((char *) to_draw, "%s (%d)",ADVEN[pc].items[i_num].full_name,ADVEN[pc].items[i_num].charges); - else sprintf((char *) to_draw, "%s",ADVEN[pc].items[i_num].full_name); + sprintf((char *) to_draw, "%s (%d)",ADVEN[pc].items[i_num].full_name.c_str(),ADVEN[pc].items[i_num].charges); + else sprintf((char *) to_draw, "%s",ADVEN[pc].items[i_num].full_name.c_str()); } dest_rect.left -= 2; win_draw_string( item_stats_gworld,dest_rect,to_draw,0,10,false); diff --git a/osx/boe.town.cpp b/osx/boe.town.cpp index f20ae816..ad0316b9 100644 --- a/osx/boe.town.cpp +++ b/osx/boe.town.cpp @@ -216,9 +216,8 @@ void start_town_mode(short which_town, short entry_dir) current_ground = 0; else if (univ.town->terrain(i,j) == 2) current_ground = 2; - if ((scenario.ter_types[univ.town->terrain(i,j)].special >= 16) && - (scenario.ter_types[univ.town->terrain(i,j)].special <= 19)) - belt_present = true; + if (scenario.ter_types[univ.town->terrain(i,j)].special == TER_SPEC_CONVEYOR) + belt_present = true; } univ.town.hostile = 0; @@ -907,45 +906,13 @@ void create_out_combat_terrain(short type,short num_walls,short spec_code) // spec_code is encounter's spec_code { short i,j,k,r1,ter_type; - // 0 grass 1 cave 2 mntn 3 bridge 4 cave bridge 5 rubble cave 6 cave tree 7 cave mush - // 8 cave swamp 9 surfac eorcks 10 surf swamp 11 surface woods 12 s. shrub 13 stalags - static const short general_types[260] = { - 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, // 0 - grassy field - 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, // 1 - ordinary cave - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // 2 - mountain - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // 3 - surface bridge - 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, // 4 - cave bridge - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,/* 50 */ // 5 - rubble-strewn cave - 0, 3, 3, 3, 3, 3, 3, 5, 5, 5, // 6 - cave tree forest - 6, 6, 7, 7, 1, 1, 8, 9, 10,11, // 7 - cave mushrooms - 10,11,12,13,13,9, 9, 9, 1, 1, // 8 - cave swamp - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 9 - surface rocks - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,/* 100 */ // 10 - surface swamp - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 11 - surface woods - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 12 - shrubbery - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 13 - stalagmites - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 14 - cave road (proposed) - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,/* 150 */ // 15 - surface road (proposed) - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 16 - hills road (proposed) - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 17 - crops (proposed) - 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, // 18 - cave fumarole (proposed) - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, // 19 - surface fumarole (proposed) - 0, 0, 1, 0, 2, 0, 0, 1, 1, 1,/* 200 */ // (note: fumaroles would have lava.) - 1, 0, 2, 1, 1, 0, 1, 1, 1, 1, // the numbers in this array are indices into the other arrays - 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, // (ter_base, ground_type, and terrain_odds first index) - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 /* 250 */ + static const short ter_base[16] = { + 2,0,36,50,71,0,0,0, + 0,2,2, 2, 2, 0,0,36 }; - static const short ter_base[14] = { - 2,0,36,50,71, - 0,0,0,0,2, - 2,2,2,0 - }; - static const short ground_type[14] = { - 2,0,36,50,71, - 0,0,0,0,2, - 2,2,2,0 + static const short ground_type[16] = { + 2,0,36,50,71,0,0,0, + 0,2,2, 2, 2, 0,0,36 }; static const location special_ter_locs[15] = { loc(11,10),loc(11,14),loc(10,20),loc(11,26),loc(9,30), @@ -976,7 +943,19 @@ void create_out_combat_terrain(short type,short num_walls,short spec_code) {71,71,71,96}, {71,71,71,96} }; - static const short terrain_odds[14][10] = { + static const unsigned char surf_fume[4][4] = { + {75,75,75,36}, + {75,75,75,75}, + {75,75,75,75}, + {36,37,75,75} + }; + static const unsigned char cave_fume[4][4] = { + {98,0 ,75,75}, + {0 ,75,75,75}, + {75,75,75,0 }, + {75,75,75,0 } + }; + static const short terrain_odds[16][10] = { {3,80,4,40,115,20,114,10,112,1}, {1,50,93,25,94,5,98,10,95,1}, {37,20,0,0,0,0,0,0,0,0}, @@ -990,14 +969,18 @@ void create_out_combat_terrain(short type,short num_walls,short spec_code) {3,200,4,400,111,250,0,0,0,0}, {3,200,4,300,112,50,113,60,114,100}, {3,100,4,250,115,120,114,30,112,2}, - {1,25,84,15,98,300,97,280,0,0} + {1,25,76,15,98,300,97,280,75,5}, + {37,20,76,20,75,5,0,0,0,0} }; // ter then odds then ter then odds ... location stuff_ul; - ter_type = scenario.ter_types[type].picture; - if (ter_type > 260) - ter_type = 1; - else ter_type = general_types[ter_type]; +// ter_type = scenario.ter_types[type].picture; +// if (ter_type > 260) +// ter_type = 1; +// else ter_type = general_types[ter_type]; + ter_type = scenario.ter_types[type].combat_arena; + if(ter_type >= 1000) ter_type = 1; // TODO: load town ter_type - 1000 as the combat arena + // TODO: Also implement the roads and crops arenas for (i = 0; i < 48; i++) for (j = 0; j < 48; j++) { @@ -1062,7 +1045,23 @@ void create_out_combat_terrain(short type,short num_walls,short spec_code) for (j = 0; j < 4; j++) for (k = 0; k < 4; k++) univ.town->terrain(stuff_ul.x + j,stuff_ul.y + k) = surf_lake[k][j]; - } + } + if (ter_type == 14) + for (i = 0; i < 15; i++) + if (get_ran(1,0,5) == 1) { + stuff_ul = special_ter_locs[i]; + for (j = 0; j < 4; j++) + for (k = 0; k < 4; k++) + univ.town->terrain(stuff_ul.x + j,stuff_ul.y + k) = cave_fume[k][j]; + } + if (ter_type == 15) + for (i = 0; i < 15; i++) + if (get_ran(1,0,5) == 1) { + stuff_ul = special_ter_locs[i]; + for (j = 0; j < 4; j++) + for (k = 0; k < 4; k++) + univ.town->terrain(stuff_ul.x + j,stuff_ul.y + k) = surf_fume[k][j]; + } if (ground_type[ter_type] == 0) { @@ -1200,7 +1199,7 @@ void pick_lock(location where,short pc_num) if (pc_has_abil_equip(pc_num,42) < 24) r1 = r1 - 12; - if ((scenario.ter_types[terrain].special < 9) || (scenario.ter_types[terrain].special > 10)) { + if (scenario.ter_types[terrain].special != TER_SPEC_UNLOCKABLE) { add_string_to_buf(" Wrong terrain type. "); return; } @@ -1228,13 +1227,13 @@ void bash_door(location where,short pc_num) //// terrain = univ.town->terrain(where.x,where.y); r1 = get_ran(1,1,100) - 15 * stat_adj(pc_num,0) + univ.town.difficulty * 4; - if ((scenario.ter_types[terrain].special < 9) || (scenario.ter_types[terrain].special > 10)) { + if (scenario.ter_types[terrain].special != TER_SPEC_UNLOCKABLE) { add_string_to_buf(" Wrong terrain type. "); return; } unlock_adjust = scenario.ter_types[terrain].flag2; - if ((unlock_adjust >= 5) || (r1 > (unlock_adjust * 15 + 40)) || (scenario.ter_types[terrain].special != 10)) { + if ((unlock_adjust >= 5) || (r1 > (unlock_adjust * 15 + 40)) || (scenario.ter_types[terrain].flag3 != 1)) { add_string_to_buf(" Didn't work. "); damage_pc(pc_num,get_ran(1,1,4),DAMAGE_UNBLOCKABLE,MONSTER_TYPE_UNKNOWN,0); } @@ -1271,14 +1270,15 @@ void erase_specials()//// } if (where.x != 100) { - switch (scenario.ter_types[univ.town->terrain(where.x,where.y)].picture) { - case 207: univ.town->terrain(where.x,where.y) = 0; break; - case 208: univ.town->terrain(where.x,where.y) = 170; break; - case 209: univ.town->terrain(where.x,where.y) = 210; break; - case 210: univ.town->terrain(where.x,where.y) = 217; break; - case 211: univ.town->terrain(where.x,where.y) = 2; break; - case 212: univ.town->terrain(where.x,where.y) = 36; break; - } +// switch (scenario.ter_types[univ.town->terrain(where.x,where.y)].picture) { +// case 207: univ.town->terrain(where.x,where.y) = 0; break; +// case 208: univ.town->terrain(where.x,where.y) = 170; break; +// case 209: univ.town->terrain(where.x,where.y) = 210; break; +// case 210: univ.town->terrain(where.x,where.y) = 217; break; +// case 211: univ.town->terrain(where.x,where.y) = 2; break; +// case 212: univ.town->terrain(where.x,where.y) = 36; break; + // } + univ.town.set_spot(where.x,where.y,false); univ.town.set_special(where.x,where.y,false); } } @@ -1336,16 +1336,17 @@ void erase_out_specials() univ.out.outdoors[i][j].special_locs[k].x = 100; } - switch (scenario.ter_types[univ.out.outdoors[i][j].terrain[where.x][where.y]].picture) { - case 207: univ.out[48 * i + where.x][48 * j + where.y] = 0; break; - case 208: univ.out[48 * i + where.x][48 * j + where.y] = 170; break; - case 209: univ.out[48 * i + where.x][48 * j + where.y] = 210; break; - case 210: univ.out[48 * i + where.x][48 * j + where.y] = 217; break; - case 211: univ.out[48 * i + where.x][48 * j + where.y] = 2; break; - case 212: univ.out[48 * i + where.x][48 * j + where.y] = 36; break; - } - } +// switch (scenario.ter_types[univ.out.outdoors[i][j].terrain[where.x][where.y]].picture) { +// case 207: univ.out[48 * i + where.x][48 * j + where.y] = 0; break; +// case 208: univ.out[48 * i + where.x][48 * j + where.y] = 170; break; +// case 209: univ.out[48 * i + where.x][48 * j + where.y] = 210; break; +// case 210: univ.out[48 * i + where.x][48 * j + where.y] = 217; break; +// case 211: univ.out[48 * i + where.x][48 * j + where.y] = 2; break; +// case 212: univ.out[48 * i + where.x][48 * j + where.y] = 36; break; +// } } + univ.out.outdoors[i][j].special_spot[where.x][where.y] = false; + } //} @@ -1764,9 +1765,8 @@ pascal void draw_map (DialogPtr the_dialog, short the_item) bool is_door(location destination) { - if ((scenario.ter_types[univ.town->terrain(destination.x,destination.y)].special == 9) || - (scenario.ter_types[univ.town->terrain(destination.x,destination.y)].special == 1) || - (scenario.ter_types[univ.town->terrain(destination.x,destination.y)].special == 10)) + if ((scenario.ter_types[univ.town->terrain(destination.x,destination.y)].special == TER_SPEC_UNLOCKABLE) || + (scenario.ter_types[univ.town->terrain(destination.x,destination.y)].special == TER_SPEC_CHANGE_WHEN_STEP_ON)) return true; return false; } diff --git a/osx/classes.h b/osx/classes.h index 3b18ba05..78a1c6ae 100644 --- a/osx/classes.h +++ b/osx/classes.h @@ -9,6 +9,7 @@ */ #include +#include #include using namespace std; diff --git a/osx/classes/outdoors.cpp b/osx/classes/outdoors.cpp index 174f0d19..3c542c20 100644 --- a/osx/classes/outdoors.cpp +++ b/osx/classes/outdoors.cpp @@ -9,12 +9,18 @@ #include "classes.h" #include "oldstructs.h" +extern cScenario scenario; + __attribute__((deprecated)) cOutdoors& cOutdoors::operator = (legacy::outdoor_record_type& old){ int i,j; for(i = 0; i < 48; i++) - for(j = 0; j < 48; j++) + for(j = 0; j < 48; j++){ terrain[i][j] = old.terrain[i][j]; + if(scenario.ter_types[terrain[i][j]].i == 3000) // marker to indicate it used to be a special spot + special_spot[i][j] = true; + else special_spot[i][j] = false; + } for(i = 0; i < 18; i++){ special_locs[i].x = old.special_locs[i].x; special_locs[i].y = old.special_locs[i].y; diff --git a/osx/classes/outdoors.h b/osx/classes/outdoors.h index 031470a5..86abe883 100644 --- a/osx/classes/outdoors.h +++ b/osx/classes/outdoors.h @@ -54,6 +54,7 @@ public: char spec_strs[90][256]; char sign_strs[8][256]; char(& out_strs(short i))[256]; + bool special_spot[48][48]; cOutdoors(); cOutdoors& operator = (legacy::outdoor_record_type& old); diff --git a/osx/classes/regtown.cpp b/osx/classes/regtown.cpp index 9ae0f39e..b5e10cf4 100644 --- a/osx/classes/regtown.cpp +++ b/osx/classes/regtown.cpp @@ -9,13 +9,22 @@ #include "classes.h" #include "oldstructs.h" +extern cScenario scenario; + __attribute__((deprecated)) void cTinyTown::append(legacy::tiny_tr_type& old){ int i,j; + cField the_field; + the_field.type = 1; for (i = 0; i < 32; i++) for (j = 0; j < 32; j++) { _terrain[i][j] = old.terrain[i][j]; - _lighting[i / 8][j] = old.lighting[i / 8][j]; + _lighting[i / 8][j] = old.lighting[i / 8][j]; + if(scenario.ter_types[_terrain[i][j]].i == 3000) { // marker to indicate it used to be a special spot + the_field.loc.x = i; + the_field.loc.y = j; + preset_fields.push_back(the_field); + } } for (i = 0; i < 16; i++) { _room_rect[i].top = old.room_rect[i].top; @@ -47,10 +56,17 @@ void cTinyTown::append(legacy::tiny_tr_type& old){ __attribute__((deprecated)) void cMedTown::append(legacy::ave_tr_type& old){ int i,j; + cField the_field; + the_field.type = 1; for (i = 0; i < 48; i++) for (j = 0; j < 48; j++) { _terrain[i][j] = old.terrain[i][j]; - _lighting[i / 8][j] = old.lighting[i / 8][j]; + _lighting[i / 8][j] = old.lighting[i / 8][j]; + if(scenario.ter_types[_terrain[i][j]].i == 3000) { // marker to indicate it used to be a special spot + the_field.loc.x = i; + the_field.loc.y = j; + preset_fields.push_back(the_field); + } } for (i = 0; i < 16; i++) { _room_rect[i].top = old.room_rect[i].top; @@ -82,10 +98,17 @@ void cMedTown::append(legacy::ave_tr_type& old){ __attribute__((deprecated)) void cBigTown::append(legacy::big_tr_type& old){ int i,j; + cField the_field; + the_field.type = 1; for (i = 0; i < 64; i++) for (j = 0; j < 64; j++) { _terrain[i][j] = old.terrain[i][j]; - _lighting[i / 8][j] = old.lighting[i / 8][j]; + _lighting[i / 8][j] = old.lighting[i / 8][j]; + if(scenario.ter_types[_terrain[i][j]].i == 3000) { // marker to indicate it used to be a special spot + the_field.loc.x = i; + the_field.loc.y = j; + preset_fields.push_back(the_field); + } } for (i = 0; i < 16; i++) { _room_rect[i].top = old.room_rect[i].top; diff --git a/osx/classes/scenario.cpp b/osx/classes/scenario.cpp index 5335098a..d01a15c6 100644 --- a/osx/classes/scenario.cpp +++ b/osx/classes/scenario.cpp @@ -72,7 +72,10 @@ cScenario& cScenario::operator = (legacy::scenario_data_type& old){ for(i = 0; i < 30; i++) boats[i] = old.scen_boats[i]; for(i = 0; i < 30; i++) horses[i] = old.scen_horses[i]; flag_g = old.flag_g; - for(i = 0; i < 256; i++) ter_types[i] = old.ter_types[i]; + for(i = 0; i < 256; i++){ + ter_types[i].i = i; + ter_types[i] = old.ter_types[i]; + } for(i = 0; i < 20; i++) scenario_timer_times[i] = old.scenario_timer_times[i]; for(i = 0; i < 20; i++) scenario_timer_specs[i] = old.scenario_timer_specs[i]; flag_h = old.flag_h; diff --git a/osx/classes/terrain.cpp b/osx/classes/terrain.cpp index 6a409fb9..ed240414 100644 --- a/osx/classes/terrain.cpp +++ b/osx/classes/terrain.cpp @@ -8,14 +8,221 @@ #include "classes.h" #include "oldstructs.h" +#include "boe.consts.h" // TODO: Put these constants in a global file __attribute__((deprecated)) cTerrain& cTerrain::operator = (legacy::terrain_type_type& old){ + static const short arenas[260] = { + 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, // 0 - grassy field + 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, // 1 - ordinary cave + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // 2 - mountain + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // 3 - surface bridge + 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, // 4 - cave bridge + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,/* 50 */ // 5 - rubble-strewn cave + 0, 3, 3, 3, 3, 3, 3, 5, 5, 5, // 6 - cave tree forest + 6, 6, 7, 7, 1, 1, 8, 9, 10,11, // 7 - cave mushrooms + 10,11,12,13,13,9, 9, 9, 1, 1, // 8 - cave swamp + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 9 - surface rocks + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,/* 100 */ // 10 - surface swamp + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 11 - surface woods + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 12 - shrubbery + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 13 - stalagmites + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 14 - cave fumarole (proposed) + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,/* 150 */ // 15 - surface fumarole (proposed) + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 101 - cave road (proposed) + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 102 - surface road (proposed) + 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, // 103 - hills road (proposed) + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, // 104 - crops (proposed) + 0, 0, 1, 0, 2, 0, 0, 1, 1, 1,/* 200 */ // (note: fumaroles would have lava.) + 1, 0, 2, 1, 1, 0, 1, 1, 1, 1, // the numbers in this array are indices into the other arrays + 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, // (ter_base, ground_type, and terrain_odds first index) + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 /* 250 */ + }; + static const short ground[274] = { + 0, 0, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 1, 1, 1, + 1, 1, 1, 0, 0, 1, 1, 1, 10,10, 10,10,10,10,10,10,10,10,10,10, + 11,11,11,11,11,11,11,11,11,11, 12,12,12,12,12,12,12,12,12,12, + 12,0, 0, 13,13,13,13,13,13,13, 13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13, 13,13,13,13,13,13,13,14,14,14, + 14,14,14,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,0, 0, + 0, 16,0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 3, 3, 3, 3, 1, 1, 1, 1, + 1, 1, 0, 1, 4, 1, 1, 0, 13,14, 15,1, 4, 13,13,17,17,0, 17,17, + 17,17,17,17,17,17,0, 1, 18,19, 13,20,0, 13,0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 0, 0, 15,15,15,15, 15,13,13,1, 1, 1, 1, 1, 1, 4, + 6, 6, 6, 6, 7, 6, 0, 21,22,23, 24,0, 13,13 + }; + static const short trims[274] = { + 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,11,12,13,1, 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10,11, 12,13,0, 0, 2, 3, 4, 5, 6, 7, + 8, 9, 10,11,12,13,0, 2, 3, 4, 5, 6, 7, 8, 9, 10,11,12,13,0, + 0, 8, 0, 4, 6, 0, 2, 0, 0, 0, 0, 0, 0, 0, 14,0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 18,18,18, 18,18,6, 4, 2, 8, 18,18,0, 0, + 18,18,15,15,15,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16,16,0, 16,16, + 16,16,16,16,16,16,0, 0, 0, 0, 0, 0, 18,0, 0, 0, 18,18,18,18, + 2, 4, 6, 8, 18,18,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14,14,14,14,14,17,18,0, 0, 0, 0, 0, 0, 0, + }; + static const short trim_ters[274] = { + 99,99,99,99,99,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99,99, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 99,99,1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 99,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 99, + 99,1, 99,1, 1, 99,1, 99,99,99, 99,99,99,99,99,99,99,99,99,99, + 99,99,99,99,99,99,99,99,99,99, 99,99,99,99,99,99,99,99,99,99, + 99,99,99,99,99,99,99,99,99,99, 99,99,99,99,99,99,99,99,99,99, + 99,99,99,99,99,99,99,99,99,99, 99,99,99,99,99,99,99,99,99,99, + 99,99,99,99,99,99,99,99,99,99, 99,99,99,99,99,99,99,99,99,99, + 99,99,99,99,99,99,99,99,99,99, 99,99,99,99,99,99,99,99,99,99, + 99,99,99,99,99,99,99,99,99,99, 99,99,4, 4, 4, 4, 99,99,99,99, + 99,99,99,99,99,99,99,99,99,99, 99,99,99,99,99,0, 1, 99,0, 0, + 0, 0, 1, 1, 1, 1, 99,99,99,99, 99,99,99,99,99,99,99,99,99,99, + 0, 0, 0, 0, 99,99,99,99,99,99, 99,99,99,99,99,99,99,99,99,99, + 99,99,99,99,99,2, 99,99,99,99, 99,99,99,99, + }; picture = old.picture; blockage = old.blockage; flag1 = old.flag1; flag2 = old.flag2; - special = (eTerSpec) old.special; + switch(old.special){ + case 0: + if(i == 7 || i == 10 || i == 13 || i == 16){ + special = TER_SPEC_NONE; + flag1 = 23; + flag2 = flag3 = 0; + }else if(picture == 215){ + special = TER_SPEC_NONE; + flag1 = 3; + flag2 = flag3 = 0; + }else if(picture == 216){ + special = TER_SPEC_NONE; + flag1 = 2; + flag2 = flag3 = 0; + }else if(picture == 143) { + special = TER_SPEC_BED; + flag1 = 230; + flag2 = flag3 = 0; + }else if((picture >= 61 && picture <= 66) || picture == 401 || picture == 402){ + special = TER_SPEC_BRIDGE; + flag1 = flag2 = flag3 = 0; + break; + }else{ + special = TER_SPEC_NONE; + flag1 = 255; + flag2 = flag3 = 0; + } + break; + case 1: + special = TER_SPEC_CHANGE_WHEN_STEP_ON; + flag3 = 0; + break; + case 2: + special = TER_SPEC_DAMAGING; + flag3 = DAMAGE_FIRE; + break; + case 3: + special = TER_SPEC_DAMAGING; + flag3 = DAMAGE_COLD; + break; + case 4: + special = TER_SPEC_DAMAGING; + flag3 = DAMAGE_MAGIC; + break; + case 5: + special = TER_SPEC_DANGEROUS; + flag3 = STATUS_POISON; + break; + case 6: + special = TER_SPEC_DANGEROUS; + flag3 = STATUS_DISEASE; + break; + case 7: + special = TER_SPEC_CRUMBLING; + flag2 = 0; // ???: may change this + flag3 = 1; // destroyed by Move Mountains but not by quickfire; 0 = both, 2 = quickfire only + break; + case 8: + special = TER_SPEC_LOCKABLE; + flag3 = 0; + break; + case 9: + special = TER_SPEC_UNLOCKABLE; + flag3 = false; // can't bash + break; + case 10: + special = TER_SPEC_UNLOCKABLE; + flag3 = true; // can bash + break; + case 11: + special = TER_SPEC_IS_A_SIGN; + flag3 = 0; + break; + case 12: + special = TER_SPEC_CALL_SPECIAL; + flag2 = 0; // local special, always (1 would be local if in town, global if outdoors) + flag3 = 255; + break; + case 13: + special = TER_SPEC_CALL_SPECIAL; + flag2 = 3; // global special, always (2 would be local if outdoors, global if in town) + flag3 = 255; + break; + case 14: + special = TER_SPEC_IS_A_CONTAINER; + flag3 = 0; + break; + case 15: + special = TER_SPEC_WATERFALL; + flag1 = DIR_S; + flag3 = 0; + break; + case 16: + special = TER_SPEC_CONVEYOR; + flag1 = DIR_N; + flag3 = 0; + break; + case 17: + special = TER_SPEC_CONVEYOR; + flag1 = DIR_E; + flag3 = 0; + break; + case 18: + special = TER_SPEC_CONVEYOR; + flag1 = DIR_S; + flag3 = 0; + break; + case 19: + special = TER_SPEC_CONVEYOR; + flag1 = DIR_W; + flag3 = 0; + break; + case 20: + special = TER_SPEC_BLOCKED_TO_MONSTERS; + flag3 = 0; + break; + case 21: + special = TER_SPEC_TOWN_ENTRANCE; + flag3 = 0; + break; + case 22: + special = TER_SPEC_CHANGE_WHEN_USED; + flag2 = 3; + flag3 = 0; + break; + case 23: + special = TER_SPEC_CALL_SPECIAL_WHEN_USED; + flag2 = 0; + flag3 = 255; + break; + } trans_to_what = old.trans_to_what; fly_over = old.fly_over; boat_over = old.boat_over; @@ -23,5 +230,108 @@ cTerrain& cTerrain::operator = (legacy::terrain_type_type& old){ light_radius = old.light_radius; step_sound = old.step_sound; shortcut_key = old.shortcut_key; + if(picture >= 260) combat_arena = 1; + else combat_arena = arenas[picture]; + if(picture < 260){ + ground_type = ground[picture]; + trim_type = (eTrimType) trims[picture]; + trim_ter = trim_ters[picture]; + }else if(picture >= 400 && picture < 1000){ + ground_type = ground[picture - 140]; + trim_type = (eTrimType) trims[picture - 140]; + trim_ter = trim_ters[picture - 140]; + }else{ // TODO: Implement new-style road and walkway handling, and deprecate picture 216. + ground_type = 255; + trim_type = TRIM_NONE; + trim_ter = 0; + } + if(trim_ter == 99) trim_ter = 0; + switch(picture){ + // Rubbles, plus pentagram as a bonus + case 68: + obj_num = 1; + obj_pos.x = 0; + obj_pos.y = 0; + obj_size.x = 2; + obj_size.y = 1; + break; + case 69: + obj_num = 1; + obj_pos.x = 1; + obj_pos.y = 0; + obj_size.x = 2; + obj_size.y = 1; + break; + case 86: + obj_num = 2; + obj_pos.x = 0; + obj_pos.y = 0; + obj_size.x = 2; + obj_size.y = 1; + break; + case 87: + obj_num = 2; + obj_pos.x = 1; + obj_pos.y = 0; + obj_size.x = 2; + obj_size.y = 1; + break; + case 233: + picture = 137; + break; + case 247: + obj_num = 3; + obj_pos.x = 0; + obj_pos.y = 0; + obj_size.x = 2; + obj_size.y = 2; + break; + case 248: + obj_num = 3; + obj_pos.x = 1; + obj_pos.y = 0; + obj_size.x = 2; + obj_size.y = 2; + break; + case 249: + obj_num = 3; + obj_pos.x = 0; + obj_pos.y = 1; + obj_size.x = 2; + obj_size.y = 2; + break; + case 250: + obj_num = 3; + obj_pos.x = 1; + obj_pos.y = 1; + obj_size.x = 2; + obj_size.y = 2; + break; + // Special spaces + case 207: + picture = 0; + i = 3000; + break; + case 208: + picture = 123; + i = 3000; + break; + case 209: + picture = 157; + i = 3000; + break; + case 210: + picture = 163; + i = 3000; + break; + case 211: + picture = 2; + i = 3000; + break; + case 212: + picture = 32; + i = 3000; + break; + }; return *this; } diff --git a/osx/classes/terrain.h b/osx/classes/terrain.h index 163cee75..e645bcac 100644 --- a/osx/classes/terrain.h +++ b/osx/classes/terrain.h @@ -11,30 +11,90 @@ namespace legacy { struct terrain_type_type; }; /* Terrains Specials Properties : scenario.ter_types[i].special */ //complete enum eTerSpec { +// TER_SPEC_NONE = 0, +// TER_SPEC_CHANGE_WHEN_STEP_ON = 1, +// TER_SPEC_DOES_FIRE_DAMAGE = 2, +// TER_SPEC_DOES_COLD_DAMAGE = 3, +// TER_SPEC_DOES_MAGIC_DAMAGE = 4, +// TER_SPEC_POISON_LAND = 5, +// TER_SPEC_DISEASED_LAND = 6, +// TER_SPEC_CRUMBLING_TERRAIN = 7, +// TER_SPEC_LOCKABLE_TERRAIN = 8, +// TER_SPEC_UNLOCKABLE_TERRAIN = 9, +// TER_SPEC_UNLOCKABLE_BASHABLE = 10, +// TER_SPEC_IS_A_SIGN = 11, +// TER_SPEC_CALL_LOCAL_SPECIAL = 12, +// TER_SPEC_CALL_SCENARIO_SPECIAL = 13, +// TER_SPEC_IS_A_CONTAINER = 14, +// TER_SPEC_WATERFALL = 15, +// TER_SPEC_CONVEYOR_NORTH = 16, +// TER_SPEC_CONVEYOR_EAST = 17, +// TER_SPEC_CONVEYOR_SOUTH = 18, +// TER_SPEC_CONVEYOR_WEST = 19, +// TER_SPEC_BLOCKED_TO_MONSTERS = 20, +// TER_SPEC_TOWN_ENTRANCE = 21, +// TER_SPEC_CHANGE_WHEN_USED = 22, +// TER_SPEC_CALL_SPECIAL_WHEN_USED = 23, TER_SPEC_NONE = 0, TER_SPEC_CHANGE_WHEN_STEP_ON = 1, - TER_SPEC_DOES_FIRE_DAMAGE = 2, - TER_SPEC_DOES_COLD_DAMAGE = 3, - TER_SPEC_DOES_MAGIC_DAMAGE = 4, - TER_SPEC_POISON_LAND = 5, - TER_SPEC_DISEASED_LAND = 6, - TER_SPEC_CRUMBLING_TERRAIN = 7, - TER_SPEC_LOCKABLE_TERRAIN = 8, - TER_SPEC_UNLOCKABLE_TERRAIN = 9, - TER_SPEC_UNLOCKABLE_BASHABLE = 10, + TER_SPEC_DAMAGING = 2, + TER_SPEC_BRIDGE = 3, // new + TER_SPEC_BED = 4, // new + TER_SPEC_DANGEROUS = 5, + TER_SPEC_UNUSED1 = 6, + TER_SPEC_CRUMBLING = 7, + TER_SPEC_LOCKABLE = 8, + TER_SPEC_UNLOCKABLE = 9, + TER_SPEC_UNUSED2 = 10, TER_SPEC_IS_A_SIGN = 11, - TER_SPEC_CALL_LOCAL_SPECIAL = 12, - TER_SPEC_CALL_SCENARIO_SPECIAL = 13, + TER_SPEC_CALL_SPECIAL = 12, + TER_SPEC_UNUSED3 = 13, TER_SPEC_IS_A_CONTAINER = 14, TER_SPEC_WATERFALL = 15, - TER_SPEC_CONVEYOR_NORTH = 16, - TER_SPEC_CONVEYOR_EAST = 17, - TER_SPEC_CONVEYOR_SOUTH = 18, - TER_SPEC_CONVEYOR_WEST = 19, + TER_SPEC_CONVEYOR = 16, + TER_SPEC_UNUSED4 = 17, + TER_SPEC_UNUSED5 = 18, + TER_SPEC_UNUSED6 = 19, TER_SPEC_BLOCKED_TO_MONSTERS = 20, TER_SPEC_TOWN_ENTRANCE = 21, TER_SPEC_CHANGE_WHEN_USED = 22, TER_SPEC_CALL_SPECIAL_WHEN_USED = 23, +// 1. Change when step on (What to change to, number of sound, Unused) +// 2. Damaging terrain; can't rest here (Amount of damage done, multiplier, damage type) +// 3. Reserved +// 4. Reserved +// 5. Dangerous land; can't rest here; percentage chance may be 0 (Strength, Percentage chance, status type) +// 6. Reserved +// 7. Crumbling terrain (Terrain to change to, strength?, destroyed by what - quickfire, shatter/move mountains, or both) +// 8. Lockable terrain (Terrain to change to when locked, Unused, Unused) +// 9. Unlockable terrain (Terrain to change to when locked, Difficulty, can be bashed) +// 10. Reserved +// 11. Sign (Unused, Unused, Unused) +// 12. Call special (Special to call, local or scenario?, Unused) +// 13. Reserved +// 14. Container (Unused, Unused, Unused) +// 15. Waterfall (Direction, Unused, Unused) +// 16. Conveyor Belt (Direction, Unused, Unused) +// 17. Reserved +// 18. Reserved +// 19. Reserved +// 20. Blocked to Monsters (Unused, Unused, Unused) +// 21. Town entrance (Terrain type if hidden, Unused, Unused) +// 22. Change when Used (Terrain to change to when used, Number of sound, Unused) +// 23. Call special when used (Special to call, local or scenario?, Unused) +// 24. Bridge - if the party boats over it, they get the option to land. (Unused, Unused, Unused) +}; + +enum eTrimType { + TRIM_NONE = 0, + TRIM_WALL = 1, // not a trim, but trims will conform to it as if it's the same ground type (eg stone wall) + TRIM_S, TRIM_SE, TRIM_E, TRIM_NE, TRIM_N, TRIM_NW, TRIM_W, TRIM_SW, + TRIM_NE_INNER, TRIM_SE_INNER, TRIM_SW_INNER, TRIM_NW_INNER, + TRIM_FRILLS = 14, // like on lava and underground water; no trim_ter required + TRIM_ROAD = 15, // the game will treat it like a road space and draw roads; no trim_ter required + TRIM_WALKWAY = 16, // the game will draw walkway corners; trim_ter is base terrain to draw on + TRIM_WATERFALL = 17, // special case for waterfalls + TRIM_CITY = 18, // the game will join roads up to this space but not draw roads on the space }; class cTerrain { @@ -44,6 +104,7 @@ public: unsigned char blockage; unsigned char flag1; unsigned char flag2; + unsigned char flag3; // new additional flag for special properties eTerSpec special; unsigned char trans_to_what; unsigned char fly_over; @@ -54,10 +115,12 @@ public: unsigned char shortcut_key; // for editor use only unsigned char obj_num; // ditto (formerly res1) unsigned char ground_type; // ditto (formerly res2) - unsigned char trim_type; // ditto, mostly (formerly res3) + eTrimType trim_type; // ditto, mostly (formerly res3) unsigned short trim_ter; // ditto unsigned short combat_arena; location obj_pos; // editor use only + location obj_size; // editor use only + unsigned short i; // for temporary use in porting cTerrain& operator = (legacy::terrain_type_type& old); void writeTo(ostream& file); diff --git a/osx/classes/town.cpp b/osx/classes/town.cpp index 5696a6f1..02fe3eeb 100644 --- a/osx/classes/town.cpp +++ b/osx/classes/town.cpp @@ -29,6 +29,8 @@ cTown& cTown::operator = (legacy::town_record_type& old){ exit_specs[i] = old.exit_specs[i]; wandering[i] = old.wandering[i]; } + preset_fields.clear(); + preset_fields.reserve(50); for(i = 0; i < 50; i++){ special_locs[i].x = old.special_locs[i].x; special_locs[i].y = old.special_locs[i].y; @@ -36,7 +38,9 @@ cTown& cTown::operator = (legacy::town_record_type& old){ // preset_fields[i].loc.x = old.preset_fields[i].field_loc.x; // preset_fields[i].loc.y = old.preset_fields[i].field_loc.y; // preset_fields[i].type = old.preset_fields[i].field_type; - preset_fields[i] = old.preset_fields[i]; + cField temp; + temp = old.preset_fields[i]; + preset_fields.push_back(temp); } for(i = 0; i < 15; i++){ sign_locs[i].x = old.sign_locs[i].x; @@ -119,8 +123,8 @@ cTown::cTown(short size){ for (i = 0; i < 64; i++) preset_items[i] = null_item; max_num_monst = 30000; - for (i = 0; i < 50; i++) - preset_fields[i].type = 0; +// for (i = 0; i < 50; i++) +// preset_fields[i].type = 0; spec_on_entry = -1; spec_on_entry_if_dead = -1; for (i = 0; i < 15; i++) { diff --git a/osx/classes/town.h b/osx/classes/town.h index 1e28e2e5..f77baa76 100644 --- a/osx/classes/town.h +++ b/osx/classes/town.h @@ -68,7 +68,7 @@ public: rectangle in_town_rect; cItem preset_items[64]; short max_num_monst; - cField preset_fields[50]; + vector preset_fields; short spec_on_entry,spec_on_entry_if_dead; short timer_spec_times[8]; short timer_specs[8]; diff --git a/osx/tools/dlgutil.cpp b/osx/tools/dlgutil.cpp index ce9c55ea..26d88fbf 100644 --- a/osx/tools/dlgutil.cpp +++ b/osx/tools/dlgutil.cpp @@ -195,13 +195,13 @@ short cd_create_custom_dialog(WindowPtr parent, Str255 strs[6],short pic_num,sho void oops_error(short error, short code, short mode){ // mode is 0 for scened, 1 for game, 2 for pced Str255 error_str1, error_str2; - static const char* progname[] = {"the scenario editor", "Blades of Exile", "the PC editor"}; - static const char* filetname[] = {"scenario", "game", "game"}; + static const char* progname[3] = {"the scenario editor", "Blades of Exile", "the PC editor"}; + static const char* filetname[3] = {"scenario", "game", "game"}; SysBeep(50); SysBeep(50); SysBeep(50); - sprintf("The program encountered an error while loading/saving/creating the %s. To prevent future problems, the program will now terminate. Trying again may solve the problem.", filetname[mode]); + sprintf((char*)error_str1,"The program encountered an error while loading/saving/creating the %s. To prevent future problems, the program will now terminate. Trying again may solve the problem.", filetname[mode]); sprintf((char *) error_str2,"Giving %s more memory might also help. Be sure to back your %s up often. Error number: %d.",progname[mode],filetname[mode],error); if(code != 0) sprintf((char*) error_str2,"%s Result code: %i.",error_str2,code); diff --git a/osx/tools/fileio.cpp b/osx/tools/fileio.cpp index 1ccb8ea7..f9916f5a 100644 --- a/osx/tools/fileio.cpp +++ b/osx/tools/fileio.cpp @@ -263,8 +263,8 @@ header_posix_ustar generateTarHeader(const std::string& fileName, unsigned long sprintf(header.mode,"%07o",0600); //leave uid filled with NULs //leave gid filled with NULs - sprintf(header.size,"%011o",fileSize); - sprintf(header.mtime,"%011o",time(NULL)); + sprintf(header.size,"%011llo",fileSize); + sprintf(header.mtime,"%011lo",time(NULL)); memset(header.checksum,' ',8); header.typeflag[0]=directory?'5':'0'; //leave linkname filled with NULs @@ -1390,7 +1390,7 @@ bool load_party_v2(FSSpec file_to_load, bool town_restore, bool in_scen, bool ma /* Split the tar archive into its component files */ while(!gzeof(party_file)){ gzread(party_file, &header, sizeof(header)); - sscanf(header.size, "%o", &tar_size); + sscanf(header.size, "%lo", &tar_size); tar_name = header.name; buf = new char[tar_size]; gzread(party_file, buf, tar_size);