mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2024-11-15 01:01:33 +00:00
Merge branch 'next' into fullscreen-toggle
This commit is contained in:
commit
009e1ef157
253 changed files with 7024 additions and 8565 deletions
|
@ -1,4 +1,4 @@
|
|||
version: 2.2.10.{branch}-{build}
|
||||
version: 2.2.11.{branch}-{build}
|
||||
os: MinGW
|
||||
|
||||
environment:
|
||||
|
|
|
@ -29,6 +29,7 @@ set(SRB2_ASSETS_GAME
|
|||
"srb2.pk3"
|
||||
"player.dta"
|
||||
"zones.pk3"
|
||||
"patch.pk3"
|
||||
"music.dta"
|
||||
"models.dat"
|
||||
)
|
||||
|
|
|
@ -39,7 +39,7 @@ https://facebook.com/SonicRoboBlast2
|
|||
|
||||
COPYRIGHT AND DISCLAIMER
|
||||
|
||||
Design and content in Sonic Robo Blast 2 is copyright 1998-2022 by Sonic Team Jr.
|
||||
Design and content in Sonic Robo Blast 2 is copyright 1998-2023 by Sonic Team Jr.
|
||||
|
||||
All original material in this game is copyrighted by their respective owners, and no copyright infringement is intended. Sonic Team Jr. is in no way affiliated with SEGA or Sonic Team, and we do not claim ownership of any of SEGA's intellectual property used in SRB2.
|
||||
|
||||
|
|
|
@ -42,6 +42,9 @@ linetagindicatesectors = true;
|
|||
// The format interface handles the map data format - DoomMapSetIO for SRB2DB2, SRB2MapSetIO for Zone Builder
|
||||
formatinterface = "SRB2MapSetIO";
|
||||
|
||||
//Maximum safe map size check (0 means skip check)
|
||||
safeboundary = 0;
|
||||
|
||||
//Sky textures for vanilla maps
|
||||
defaultskytextures
|
||||
{
|
||||
|
@ -77,7 +80,7 @@ defaultskytextures
|
|||
defaultlumpname = "MAP01";
|
||||
|
||||
// Default testing parameters
|
||||
testparameters = "-file \"%AP\" \"%F\" -warp %L";
|
||||
testparameters = "-folder \"%AF\" -file \"%AA\" \"%F\" -warp %L";
|
||||
testshortpaths = true;
|
||||
|
||||
// Default nodebuilder configurations
|
||||
|
@ -437,6 +440,8 @@ sectortypes
|
|||
144 = "Egg Capsule";
|
||||
160 = "Special Stage Time/Spheres Parameters <deprecated>";
|
||||
176 = "Custom Global Gravity <deprecated>";
|
||||
512 = "Wind/Current <deprecated>";
|
||||
1024 = "Conveyor Belt <deprecated>";
|
||||
1280 = "Speed Pad";
|
||||
1536 = "Flip Gravity on Jump";
|
||||
4096 = "Star Post Activator";
|
||||
|
@ -496,6 +501,8 @@ gen_sectortypes
|
|||
third
|
||||
{
|
||||
0 = "Normal";
|
||||
512 = "Wind/Current <deprecated>";
|
||||
1024 = "Conveyor Belt <deprecated>";
|
||||
1280 = "Speed Pad";
|
||||
1536 = "Flip Gravity on Jump";
|
||||
}
|
||||
|
@ -578,7 +585,7 @@ linedeftypes
|
|||
title = "Per-Sector Gravity";
|
||||
prefix = "(1)";
|
||||
flags64text = "[6] Flip in reverse gravity";
|
||||
flags8192text = "[13] Reverse while inside";
|
||||
flags8192text = "[13] Cancel MF2_OBJECTFLIP";
|
||||
}
|
||||
|
||||
5
|
||||
|
@ -641,35 +648,35 @@ linedeftypes
|
|||
|
||||
96
|
||||
{
|
||||
title = "Apply Tag to Tagged Sectors";
|
||||
title = "Add Front Sector Tag to Tagged Sectors";
|
||||
prefix = "(96)";
|
||||
flags1024text = "[10] Offsets are target tags";
|
||||
flags8192text = "[13] Use front side offsets";
|
||||
flags32768text = "[15] Use back side offsets";
|
||||
flags8192text = "[13] Add front side offsets";
|
||||
flags32768text = "[15] Add back side offsets";
|
||||
}
|
||||
|
||||
97
|
||||
{
|
||||
title = "Apply Tag to Front Sector";
|
||||
title = "Add Tag to Front Sector";
|
||||
prefix = "(97)";
|
||||
flags8192text = "[13] Use front side offsets";
|
||||
flags32768text = "[15] Use back side offsets";
|
||||
flags8192text = "[13] Add front side offsets";
|
||||
flags32768text = "[15] Add back side offsets";
|
||||
}
|
||||
|
||||
98
|
||||
{
|
||||
title = "Apply Tag to Back Sector";
|
||||
title = "Add Tag to Back Sector";
|
||||
prefix = "(98)";
|
||||
flags8192text = "[13] Use front side offsets";
|
||||
flags32768text = "[15] Use back side offsets";
|
||||
flags8192text = "[13] Add front side offsets";
|
||||
flags32768text = "[15] Add back side offsets";
|
||||
}
|
||||
|
||||
99
|
||||
{
|
||||
title = "Apply Tag to Front and Back Sectors";
|
||||
title = "Add Tag to Front and Back Sectors";
|
||||
prefix = "(99)";
|
||||
flags8192text = "[13] Use front side offsets";
|
||||
flags32768text = "[15] Use back side offsets";
|
||||
flags8192text = "[13] Add front side offsets";
|
||||
flags32768text = "[15] Add back side offsets";
|
||||
}
|
||||
|
||||
540
|
||||
|
@ -990,6 +997,7 @@ linedeftypes
|
|||
flags128text = "[7] Only block non-players";
|
||||
3dfloor = true;
|
||||
3dfloorflags = "47";
|
||||
invisiblefof = true;
|
||||
}
|
||||
|
||||
140
|
||||
|
@ -1227,6 +1235,7 @@ linedeftypes
|
|||
prefix = "(223)";
|
||||
3dfloor = true;
|
||||
3dfloorflags = "41";
|
||||
invisiblefof = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1524,6 +1533,7 @@ linedeftypes
|
|||
prefix = "(200)";
|
||||
3dfloor = true;
|
||||
3dfloorflags = "20201";
|
||||
invisiblefof = true;
|
||||
}
|
||||
|
||||
201
|
||||
|
@ -1532,6 +1542,7 @@ linedeftypes
|
|||
prefix = "(201)";
|
||||
3dfloor = true;
|
||||
3dfloorflags = "201";
|
||||
invisiblefof = true;
|
||||
}
|
||||
|
||||
202
|
||||
|
@ -1539,7 +1550,8 @@ linedeftypes
|
|||
title = "Fog Block";
|
||||
prefix = "(202)";
|
||||
3dfloor = true;
|
||||
3dfloorflags = "3EF19";
|
||||
3dfloorflags = "3EF01";
|
||||
invisiblefof = true;
|
||||
}
|
||||
|
||||
250
|
||||
|
@ -2341,6 +2353,7 @@ linedeftypes
|
|||
{
|
||||
title = "Enable/Disable Gravity Flip";
|
||||
prefix = "(433)";
|
||||
flags2text = "[1] Force MFE_VERTICALFLIP";
|
||||
flags8text = "[3] Set delay by backside sector";
|
||||
flags32text = "[5] Invert current gravity";
|
||||
flags64text = "[6] Return to normal";
|
||||
|
@ -2853,36 +2866,63 @@ linedeftypes
|
|||
{
|
||||
title = "Scroll Floor Texture";
|
||||
prefix = "(510)";
|
||||
flags8192text = "[13] Use angle and X offset";
|
||||
}
|
||||
|
||||
511
|
||||
{
|
||||
title = "Scroll Floor Texture (Accelerative)";
|
||||
prefix = "(511)";
|
||||
flags8192text = "[13] Use angle and X offset";
|
||||
}
|
||||
|
||||
512
|
||||
{
|
||||
title = "Scroll Floor Texture (Displacement)";
|
||||
prefix = "(512)";
|
||||
flags8192text = "[13] Use angle and X offset";
|
||||
}
|
||||
|
||||
513
|
||||
{
|
||||
title = "Scroll Ceiling Texture";
|
||||
prefix = "(513)";
|
||||
flags8192text = "[13] Use angle and X offset";
|
||||
}
|
||||
|
||||
514
|
||||
{
|
||||
title = "Scroll Ceiling Texture (Accelerative)";
|
||||
prefix = "(514)";
|
||||
flags8192text = "[13] Use angle and X offset";
|
||||
}
|
||||
|
||||
515
|
||||
{
|
||||
title = "Scroll Ceiling Texture (Displacement)";
|
||||
prefix = "(515)";
|
||||
flags8192text = "[13] Use angle and X offset";
|
||||
}
|
||||
|
||||
516
|
||||
{
|
||||
title = "Scroll Floor and Ceiling Texture";
|
||||
prefix = "(516)";
|
||||
flags8192text = "[13] Use angle and X offset";
|
||||
}
|
||||
|
||||
517
|
||||
{
|
||||
title = "Scroll Floor and Ceiling Texture (Accelerative)";
|
||||
prefix = "(517)";
|
||||
flags8192text = "[13] Use angle and X offset";
|
||||
}
|
||||
|
||||
518
|
||||
{
|
||||
title = "Scroll Floor and Ceiling Texture (Displacement)";
|
||||
prefix = "(518)";
|
||||
flags8192text = "[13] Use angle and X offset";
|
||||
}
|
||||
|
||||
520
|
||||
|
@ -2890,6 +2930,7 @@ linedeftypes
|
|||
title = "Carry Objects on Floor";
|
||||
prefix = "(520)";
|
||||
flags64text = "[6] Exclusive";
|
||||
flags8192text = "[13] Use angle and X offset";
|
||||
}
|
||||
|
||||
521
|
||||
|
@ -2897,6 +2938,7 @@ linedeftypes
|
|||
title = "Carry Objects on Floor (Accelerative)";
|
||||
prefix = "(521)";
|
||||
flags64text = "[6] Exclusive";
|
||||
flags8192text = "[13] Use angle and X offset";
|
||||
}
|
||||
|
||||
522
|
||||
|
@ -2904,6 +2946,7 @@ linedeftypes
|
|||
title = "Carry Objects on Floor (Displacement)";
|
||||
prefix = "(522)";
|
||||
flags64text = "[6] Exclusive";
|
||||
flags8192text = "[13] Use angle and X offset";
|
||||
}
|
||||
|
||||
523
|
||||
|
@ -2911,6 +2954,7 @@ linedeftypes
|
|||
title = "Carry Objects on Ceiling";
|
||||
prefix = "(523)";
|
||||
flags64text = "[6] Exclusive";
|
||||
flags8192text = "[13] Use angle and X offset";
|
||||
}
|
||||
|
||||
524
|
||||
|
@ -2918,6 +2962,7 @@ linedeftypes
|
|||
title = "Carry Objects on Ceiling (Accelerative)";
|
||||
prefix = "(524)";
|
||||
flags64text = "[6] Exclusive";
|
||||
flags8192text = "[13] Use angle and X offset";
|
||||
}
|
||||
|
||||
525
|
||||
|
@ -2925,6 +2970,31 @@ linedeftypes
|
|||
title = "Carry Objects on Ceiling (Displacement)";
|
||||
prefix = "(525)";
|
||||
flags64text = "[6] Exclusive";
|
||||
flags8192text = "[13] Use angle and X offset";
|
||||
}
|
||||
|
||||
526
|
||||
{
|
||||
title = "Carry Objects on Floor and Ceiling";
|
||||
prefix = "(526)";
|
||||
flags64text = "[6] Exclusive";
|
||||
flags8192text = "[13] Use angle and X offset";
|
||||
}
|
||||
|
||||
527
|
||||
{
|
||||
title = "Carry Objects on Floor and Ceiling (Accelerative)";
|
||||
prefix = "(527)";
|
||||
flags64text = "[6] Exclusive";
|
||||
flags8192text = "[13] Use angle and X offset";
|
||||
}
|
||||
|
||||
528
|
||||
{
|
||||
title = "Carry Objects on Floor and Ceiling (Displacement)";
|
||||
prefix = "(528)";
|
||||
flags64text = "[6] Exclusive";
|
||||
flags8192text = "[13] Use angle and X offset";
|
||||
}
|
||||
|
||||
530
|
||||
|
@ -2932,6 +3002,7 @@ linedeftypes
|
|||
title = "Scroll Floor Texture and Carry Objects";
|
||||
prefix = "(530)";
|
||||
flags64text = "[6] Exclusive";
|
||||
flags8192text = "[13] Use angle and X offset";
|
||||
}
|
||||
|
||||
531
|
||||
|
@ -2939,6 +3010,7 @@ linedeftypes
|
|||
title = "Scroll Floor Texture and Carry Objects (Accelerative)";
|
||||
prefix = "(531)";
|
||||
flags64text = "[6] Exclusive";
|
||||
flags8192text = "[13] Use angle and X offset";
|
||||
}
|
||||
|
||||
532
|
||||
|
@ -2946,6 +3018,7 @@ linedeftypes
|
|||
title = "Scroll Floor Texture and Carry Objects (Displacement)";
|
||||
prefix = "(532)";
|
||||
flags64text = "[6] Exclusive";
|
||||
flags8192text = "[13] Use angle and X offset";
|
||||
}
|
||||
|
||||
533
|
||||
|
@ -2953,6 +3026,7 @@ linedeftypes
|
|||
title = "Scroll Ceiling Texture and Carry Objects";
|
||||
prefix = "(533)";
|
||||
flags64text = "[6] Exclusive";
|
||||
flags8192text = "[13] Use angle and X offset";
|
||||
}
|
||||
|
||||
534
|
||||
|
@ -2960,6 +3034,7 @@ linedeftypes
|
|||
title = "Scroll Ceiling Texture and Carry Objects (Accelerative)";
|
||||
prefix = "(534)";
|
||||
flags64text = "[6] Exclusive";
|
||||
flags8192text = "[13] Use angle and X offset";
|
||||
}
|
||||
|
||||
535
|
||||
|
@ -2967,6 +3042,31 @@ linedeftypes
|
|||
title = "Scroll Ceiling Texture and Carry Objects (Displacement)";
|
||||
prefix = "(535)";
|
||||
flags64text = "[6] Exclusive";
|
||||
flags8192text = "[13] Use angle and X offset";
|
||||
}
|
||||
|
||||
536
|
||||
{
|
||||
title = "Scroll Floor and Ceiling Texture and Carry Objects";
|
||||
prefix = "(536)";
|
||||
flags64text = "[6] Exclusive";
|
||||
flags8192text = "[13] Use angle and X offset";
|
||||
}
|
||||
|
||||
537
|
||||
{
|
||||
title = "Scroll Floor and Ceiling Texture and Carry Objects (Accelerative)";
|
||||
prefix = "(537)";
|
||||
flags64text = "[6] Exclusive";
|
||||
flags8192text = "[13] Use angle and X offset";
|
||||
}
|
||||
|
||||
538
|
||||
{
|
||||
title = "Scroll Floor and Ceiling Texture and Carry Objects (Displacement)";
|
||||
prefix = "(538)";
|
||||
flags64text = "[6] Exclusive";
|
||||
flags8192text = "[13] Use angle and X offset";
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2978,48 +3078,54 @@ linedeftypes
|
|||
{
|
||||
title = "Wind";
|
||||
prefix = "(541)";
|
||||
flags512text = "[9] Player slides";
|
||||
flags64text = "[6] Exclusive";
|
||||
flags512text = "[9] Player slides";
|
||||
flags8192text = "[13] Use angle and X offset";
|
||||
}
|
||||
|
||||
542
|
||||
{
|
||||
title = "Upwards Wind";
|
||||
prefix = "(542)";
|
||||
flags512text = "[9] Player slides";
|
||||
flags64text = "[6] Exclusive";
|
||||
flags512text = "[9] Player slides";
|
||||
flags8192text = "[13] Use X offset";
|
||||
}
|
||||
|
||||
543
|
||||
{
|
||||
title = "Downwards Wind";
|
||||
prefix = "(543)";
|
||||
flags512text = "[9] Player slides";
|
||||
flags64text = "[6] Exclusive";
|
||||
flags512text = "[9] Player slides";
|
||||
flags8192text = "[13] Use X offset";
|
||||
}
|
||||
|
||||
544
|
||||
{
|
||||
title = "Current";
|
||||
prefix = "(544)";
|
||||
flags512text = "[9] Player slides";
|
||||
flags64text = "[6] Exclusive";
|
||||
flags512text = "[9] Player slides";
|
||||
flags8192text = "[13] Use angle and X offset";
|
||||
}
|
||||
|
||||
545
|
||||
{
|
||||
title = "Upwards Current";
|
||||
prefix = "(545)";
|
||||
flags512text = "[9] Player slides";
|
||||
flags64text = "[6] Exclusive";
|
||||
flags512text = "[9] Player slides";
|
||||
flags8192text = "[13] Use X offset";
|
||||
}
|
||||
|
||||
546
|
||||
{
|
||||
title = "Downwards Current";
|
||||
prefix = "(546)";
|
||||
flags512text = "[9] Player slides";
|
||||
flags64text = "[6] Exclusive";
|
||||
flags512text = "[9] Player slides";
|
||||
flags8192text = "[13] Use X offset";
|
||||
}
|
||||
|
||||
547
|
||||
|
@ -3027,6 +3133,7 @@ linedeftypes
|
|||
title = "Push/Pull";
|
||||
prefix = "(547)";
|
||||
flags64text = "[6] Exclusive";
|
||||
flags8192text = "[13] Use X offset";
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3813,7 +3920,7 @@ thingtypes
|
|||
|
||||
enemies
|
||||
{
|
||||
color = 9; // Light_Blue
|
||||
color = 9; // Light Blue
|
||||
arrow = 1;
|
||||
title = "Enemies";
|
||||
|
||||
|
@ -4123,7 +4230,7 @@ thingtypes
|
|||
|
||||
bosses
|
||||
{
|
||||
color = 8; // Dark_Gray
|
||||
color = 4; // Dark Red
|
||||
arrow = 1;
|
||||
title = "Bosses";
|
||||
|
||||
|
@ -4222,6 +4329,7 @@ thingtypes
|
|||
sprite = "internal:capsule";
|
||||
angletext = "Tag";
|
||||
fixedrotation = 1;
|
||||
tagthing = true;
|
||||
}
|
||||
292
|
||||
{
|
||||
|
@ -4309,13 +4417,13 @@ thingtypes
|
|||
308
|
||||
{
|
||||
title = "CTF Team Ring (Red)";
|
||||
sprite = "internal:TRNGA0r";
|
||||
sprite = "internal:TRNGA0R";
|
||||
width = 16;
|
||||
}
|
||||
309
|
||||
{
|
||||
title = "CTF Team Ring (Blue)";
|
||||
sprite = "internal:TRNGA0b";
|
||||
sprite = "internal:TRNGA0B";
|
||||
width = 16;
|
||||
}
|
||||
330
|
||||
|
@ -4352,7 +4460,7 @@ thingtypes
|
|||
|
||||
collectibles
|
||||
{
|
||||
color = 10; // Light_Green
|
||||
color = 10; // Light Green
|
||||
title = "Other Collectibles";
|
||||
width = 16;
|
||||
height = 32;
|
||||
|
@ -4456,6 +4564,7 @@ thingtypes
|
|||
flags8text = "[8] Random (Weak)";
|
||||
angletext = "Tag";
|
||||
fixedrotation = 1;
|
||||
tagthing = true;
|
||||
|
||||
400
|
||||
{
|
||||
|
@ -4588,6 +4697,7 @@ thingtypes
|
|||
flags1text = "[1] Run linedef executor on pop";
|
||||
angletext = "Tag";
|
||||
fixedrotation = 1;
|
||||
tagthing = true;
|
||||
|
||||
431
|
||||
{
|
||||
|
@ -4658,7 +4768,7 @@ thingtypes
|
|||
|
||||
generic
|
||||
{
|
||||
color = 11; // Light_Cyan
|
||||
color = 11; // Light Cyan
|
||||
title = "Generic Items & Hazards";
|
||||
|
||||
500
|
||||
|
@ -4764,7 +4874,7 @@ thingtypes
|
|||
|
||||
springs
|
||||
{
|
||||
color = 12; // Light_Red
|
||||
color = 12; // Light Red
|
||||
title = "Springs and Fans";
|
||||
width = 20;
|
||||
height = 16;
|
||||
|
@ -4926,13 +5036,13 @@ thingtypes
|
|||
{
|
||||
arrow = 0;
|
||||
title = "5 Vertical Rings (Yellow Spring)";
|
||||
sprite = "RINGA0";
|
||||
sprite = "internal:ringverticalyellow";
|
||||
}
|
||||
601
|
||||
{
|
||||
arrow = 0;
|
||||
title = "5 Vertical Rings (Red Spring)";
|
||||
sprite = "RINGA0";
|
||||
sprite = "internal:ringverticalred";
|
||||
height = 1024;
|
||||
}
|
||||
602
|
||||
|
@ -4950,7 +5060,7 @@ thingtypes
|
|||
604
|
||||
{
|
||||
title = "Circle of Rings";
|
||||
sprite = "RINGA0";
|
||||
sprite = "internal:circlering";
|
||||
width = 96;
|
||||
height = 192;
|
||||
unflippable = true;
|
||||
|
@ -4959,7 +5069,7 @@ thingtypes
|
|||
605
|
||||
{
|
||||
title = "Circle of Rings (Big)";
|
||||
sprite = "RINGA0";
|
||||
sprite = "internal:circlebigring";
|
||||
width = 192;
|
||||
unflippable = true;
|
||||
centerHitbox = true;
|
||||
|
@ -4967,7 +5077,7 @@ thingtypes
|
|||
606
|
||||
{
|
||||
title = "Circle of Blue Spheres";
|
||||
sprite = "SPHRA0";
|
||||
sprite = "internal:circlesphere";
|
||||
width = 96;
|
||||
height = 192;
|
||||
unflippable = true;
|
||||
|
@ -4976,7 +5086,7 @@ thingtypes
|
|||
607
|
||||
{
|
||||
title = "Circle of Blue Spheres (Big)";
|
||||
sprite = "SPHRA0";
|
||||
sprite = "internal:circlebigsphere";
|
||||
width = 192;
|
||||
unflippable = true;
|
||||
centerHitbox = true;
|
||||
|
@ -4984,7 +5094,7 @@ thingtypes
|
|||
608
|
||||
{
|
||||
title = "Circle of Rings and Spheres";
|
||||
sprite = "SPHRA0";
|
||||
sprite = "internal:circleringsphere";
|
||||
width = 96;
|
||||
height = 192;
|
||||
unflippable = true;
|
||||
|
@ -4993,13 +5103,77 @@ thingtypes
|
|||
609
|
||||
{
|
||||
title = "Circle of Rings and Spheres (Big)";
|
||||
sprite = "SPHRA0";
|
||||
sprite = "internal:circlebigringsphere";
|
||||
width = 192;
|
||||
unflippable = true;
|
||||
centerHitbox = true;
|
||||
}
|
||||
}
|
||||
|
||||
ambience
|
||||
{
|
||||
color = 8; // Dark Gray
|
||||
title = "Ambience";
|
||||
width = 8;
|
||||
height = 16;
|
||||
sprite = "internal:ambiance";
|
||||
|
||||
700
|
||||
{
|
||||
title = "Water Ambience A (Large)";
|
||||
}
|
||||
|
||||
701
|
||||
{
|
||||
title = "Water Ambience B (Large)";
|
||||
}
|
||||
|
||||
702
|
||||
{
|
||||
title = "Water Ambience C (Medium)";
|
||||
}
|
||||
|
||||
703
|
||||
{
|
||||
title = "Water Ambience D (Medium)";
|
||||
}
|
||||
|
||||
704
|
||||
{
|
||||
title = "Water Ambience E (Small)";
|
||||
}
|
||||
|
||||
705
|
||||
{
|
||||
title = "Water Ambience F (Small)";
|
||||
}
|
||||
|
||||
706
|
||||
{
|
||||
title = "Water Ambience G (Extra Large)";
|
||||
}
|
||||
|
||||
707
|
||||
{
|
||||
title = "Water Ambience H (Extra Large)";
|
||||
}
|
||||
|
||||
708
|
||||
{
|
||||
title = "Disco Ambience";
|
||||
}
|
||||
|
||||
709
|
||||
{
|
||||
title = "Volcano Ambience";
|
||||
}
|
||||
|
||||
710
|
||||
{
|
||||
title = "Machine Ambience";
|
||||
}
|
||||
}
|
||||
|
||||
invisible
|
||||
{
|
||||
color = 15; // White
|
||||
|
@ -5008,72 +5182,6 @@ thingtypes
|
|||
height = 16;
|
||||
sprite = "UNKNA0";
|
||||
|
||||
700
|
||||
{
|
||||
title = "Water Ambience A (Large)";
|
||||
sprite = "internal:ambiance";
|
||||
}
|
||||
|
||||
701
|
||||
{
|
||||
title = "Water Ambience B (Large)";
|
||||
sprite = "internal:ambiance";
|
||||
}
|
||||
|
||||
702
|
||||
{
|
||||
title = "Water Ambience C (Medium)";
|
||||
sprite = "internal:ambiance";
|
||||
}
|
||||
|
||||
703
|
||||
{
|
||||
title = "Water Ambience D (Medium)";
|
||||
sprite = "internal:ambiance";
|
||||
}
|
||||
|
||||
704
|
||||
{
|
||||
title = "Water Ambience E (Small)";
|
||||
sprite = "internal:ambiance";
|
||||
}
|
||||
|
||||
705
|
||||
{
|
||||
title = "Water Ambience F (Small)";
|
||||
sprite = "internal:ambiance";
|
||||
}
|
||||
|
||||
706
|
||||
{
|
||||
title = "Water Ambience G (Extra Large)";
|
||||
sprite = "internal:ambiance";
|
||||
}
|
||||
|
||||
707
|
||||
{
|
||||
title = "Water Ambience H (Extra Large)";
|
||||
sprite = "internal:ambiance";
|
||||
}
|
||||
|
||||
708
|
||||
{
|
||||
title = "Disco Ambience";
|
||||
sprite = "internal:ambiance";
|
||||
}
|
||||
|
||||
709
|
||||
{
|
||||
title = "Volcano Ambience";
|
||||
sprite = "internal:ambiance";
|
||||
}
|
||||
|
||||
710
|
||||
{
|
||||
title = "Machine Ambience";
|
||||
sprite = "internal:ambiance";
|
||||
}
|
||||
|
||||
750
|
||||
{
|
||||
title = "Slope Vertex";
|
||||
|
@ -5082,6 +5190,7 @@ thingtypes
|
|||
fixedrotation = 1;
|
||||
parametertext = "Absolute?";
|
||||
flagsvaluetext = "Absolute Z";
|
||||
tagthing = true;
|
||||
}
|
||||
|
||||
751
|
||||
|
@ -5127,20 +5236,22 @@ thingtypes
|
|||
756
|
||||
{
|
||||
title = "Blast Linedef Executor";
|
||||
sprite = "TOADA0";
|
||||
sprite = "internal:blastexec";
|
||||
width = 32;
|
||||
height = 16;
|
||||
angletext = "Tag";
|
||||
fixedrotation = 1;
|
||||
tagthing = true;
|
||||
}
|
||||
757
|
||||
{
|
||||
title = "Fan Particle Generator";
|
||||
sprite = "PRTLA0";
|
||||
sprite = "internal:fanparticles";
|
||||
width = 8;
|
||||
height = 16;
|
||||
angletext = "Tag";
|
||||
fixedrotation = 1;
|
||||
tagthing = true;
|
||||
}
|
||||
758
|
||||
{
|
||||
|
@ -5153,6 +5264,8 @@ thingtypes
|
|||
sprite = "internal:polyanchor";
|
||||
angletext = "Tag";
|
||||
fixedrotation = 1;
|
||||
tagthing = true;
|
||||
unflippable = true;
|
||||
}
|
||||
|
||||
761
|
||||
|
@ -5161,6 +5274,8 @@ thingtypes
|
|||
sprite = "internal:polycenter";
|
||||
angletext = "Tag";
|
||||
fixedrotation = 1;
|
||||
tagthing = true;
|
||||
unflippable = true;
|
||||
}
|
||||
|
||||
762
|
||||
|
@ -5169,6 +5284,8 @@ thingtypes
|
|||
sprite = "internal:polycentercrush";
|
||||
angletext = "Tag";
|
||||
fixedrotation = 1;
|
||||
tagthing = true;
|
||||
unflippable = true;
|
||||
}
|
||||
780
|
||||
{
|
||||
|
@ -5182,7 +5299,7 @@ thingtypes
|
|||
|
||||
greenflower
|
||||
{
|
||||
color = 10; // Green
|
||||
color = 2; // Green
|
||||
title = "Greenflower";
|
||||
|
||||
800
|
||||
|
@ -5287,7 +5404,7 @@ thingtypes
|
|||
|
||||
technohill
|
||||
{
|
||||
color = 10; // Green
|
||||
color = 2; // Green
|
||||
title = "Techno Hill";
|
||||
|
||||
900
|
||||
|
@ -5331,7 +5448,7 @@ thingtypes
|
|||
|
||||
deepsea
|
||||
{
|
||||
color = 10; // Green
|
||||
color = 2; // Green
|
||||
title = "Deep Sea";
|
||||
|
||||
1000
|
||||
|
@ -5466,7 +5583,7 @@ thingtypes
|
|||
|
||||
castleeggman
|
||||
{
|
||||
color = 10; // Green
|
||||
color = 2; // Green
|
||||
title = "Castle Eggman";
|
||||
|
||||
1100
|
||||
|
@ -5515,6 +5632,7 @@ thingtypes
|
|||
angletext = "Tag";
|
||||
parametertext = "Spokes";
|
||||
fixedrotation = 1;
|
||||
tagthing = true;
|
||||
}
|
||||
1105
|
||||
{
|
||||
|
@ -5527,6 +5645,7 @@ thingtypes
|
|||
angletext = "Tag";
|
||||
parametertext = "Spokes";
|
||||
fixedrotation = 1;
|
||||
tagthing = true;
|
||||
}
|
||||
1106
|
||||
{
|
||||
|
@ -5539,23 +5658,25 @@ thingtypes
|
|||
angletext = "Tag";
|
||||
parametertext = "Spokes";
|
||||
fixedrotation = 1;
|
||||
tagthing = true;
|
||||
}
|
||||
1107
|
||||
{
|
||||
title = "Chain Spawnpoint";
|
||||
sprite = "BMCHA0";
|
||||
sprite = "BMCHB0";
|
||||
width = 17;
|
||||
height = 34;
|
||||
flags8text = "[8] Double size";
|
||||
angletext = "Tag";
|
||||
parametertext = "Spokes";
|
||||
fixedrotation = 1;
|
||||
tagthing = true;
|
||||
}
|
||||
1108
|
||||
{
|
||||
arrow = 1;
|
||||
title = "Hidden Chain Spawnpoint";
|
||||
sprite = "internal:chain3";
|
||||
sprite = "SMCHA0";
|
||||
width = 17;
|
||||
height = 34;
|
||||
flags8text = "[8] Double size";
|
||||
|
@ -5571,6 +5692,7 @@ thingtypes
|
|||
angletext = "Tag";
|
||||
parametertext = "Spokes";
|
||||
fixedrotation = 1;
|
||||
tagthing = true;
|
||||
}
|
||||
1110
|
||||
{
|
||||
|
@ -5582,6 +5704,7 @@ thingtypes
|
|||
angletext = "Tag";
|
||||
parametertext = "Spokes";
|
||||
fixedrotation = 1;
|
||||
tagthing = true;
|
||||
}
|
||||
1111
|
||||
{
|
||||
|
@ -5735,7 +5858,7 @@ thingtypes
|
|||
|
||||
aridcanyon
|
||||
{
|
||||
color = 10; // Green
|
||||
color = 2; // Green
|
||||
title = "Arid Canyon";
|
||||
|
||||
1200
|
||||
|
@ -5763,6 +5886,7 @@ thingtypes
|
|||
height = 16;
|
||||
angletext = "Tag";
|
||||
fixedrotation = 1;
|
||||
tagthing = true;
|
||||
}
|
||||
1203
|
||||
{
|
||||
|
@ -5954,7 +6078,7 @@ thingtypes
|
|||
|
||||
redvolcano
|
||||
{
|
||||
color = 10; // Green
|
||||
color = 2; // Green
|
||||
title = "Red Volcano";
|
||||
|
||||
1300
|
||||
|
@ -6054,7 +6178,7 @@ thingtypes
|
|||
|
||||
botanicserenity
|
||||
{
|
||||
color = 10; // Green
|
||||
color = 2; // Green
|
||||
title = "Botanic Serenity";
|
||||
width = 16;
|
||||
height = 32;
|
||||
|
@ -6297,7 +6421,7 @@ thingtypes
|
|||
|
||||
azuretemple
|
||||
{
|
||||
color = 10; // Green
|
||||
color = 2; // Green
|
||||
title = "Azure Temple";
|
||||
|
||||
1500
|
||||
|
@ -6373,7 +6497,7 @@ thingtypes
|
|||
|
||||
dreamhill
|
||||
{
|
||||
color = 10; // Green
|
||||
color = 2; // Green
|
||||
title = "Dream Hill";
|
||||
|
||||
1600
|
||||
|
@ -6401,8 +6525,8 @@ thingtypes
|
|||
|
||||
nightstrk
|
||||
{
|
||||
color = 13; // Pink
|
||||
title = "NiGHTS Track";
|
||||
color = 16; // Light Pink
|
||||
title = "NiGHTS Track & Basics";
|
||||
width = 8;
|
||||
height = 4096;
|
||||
sprite = "UNKNA0";
|
||||
|
@ -6437,6 +6561,19 @@ thingtypes
|
|||
flagsvaluetext = "Order";
|
||||
parametertext = "Mare";
|
||||
}
|
||||
1703
|
||||
{
|
||||
title = "Ideya Drone";
|
||||
sprite = "NDRNA1";
|
||||
width = 16;
|
||||
height = 56;
|
||||
flags1text = "[1] Align player to middle";
|
||||
flags4text = "[4] Align player to top";
|
||||
flags8text = "[8] Die upon time up";
|
||||
angletext = "Time limit";
|
||||
fixedrotation = 1;
|
||||
parametertext = "Height";
|
||||
}
|
||||
1710
|
||||
{
|
||||
title = "Ideya Capture";
|
||||
|
@ -6454,20 +6591,6 @@ thingtypes
|
|||
title = "NiGHTS Items";
|
||||
width = 16;
|
||||
height = 32;
|
||||
|
||||
1703
|
||||
{
|
||||
title = "Ideya Drone";
|
||||
sprite = "NDRNA1";
|
||||
width = 16;
|
||||
height = 56;
|
||||
flags1text = "[1] Align player to middle";
|
||||
flags4text = "[4] Align player to top";
|
||||
flags8text = "[8] Die upon time up";
|
||||
angletext = "Time limit";
|
||||
fixedrotation = 1;
|
||||
parametertext = "Height";
|
||||
}
|
||||
1704
|
||||
{
|
||||
arrow = 1;
|
||||
|
@ -6478,13 +6601,12 @@ thingtypes
|
|||
unflippable = true;
|
||||
flagsvaluetext = "Pitch";
|
||||
angletext = "Yaw";
|
||||
fixedrotation = 1;
|
||||
}
|
||||
1705
|
||||
{
|
||||
arrow = 1;
|
||||
title = "Hoop (Generic)";
|
||||
sprite = "HOOPA0";
|
||||
sprite = "internal:nightshoop";
|
||||
width = 80;
|
||||
height = 160;
|
||||
unflippable = true;
|
||||
|
@ -6501,7 +6623,6 @@ thingtypes
|
|||
height = 24;
|
||||
flags8height = 24;
|
||||
flags8text = "[8] Float";
|
||||
unflippable = true;
|
||||
}
|
||||
1707
|
||||
{
|
||||
|
@ -6546,7 +6667,7 @@ thingtypes
|
|||
flags2text = "[2] Radius +32";
|
||||
flags4text = "[4] Radius +64";
|
||||
flags8text = "[8] Radius +128";
|
||||
sprite = "HOOPA0";
|
||||
sprite = "internal:nightshoop";
|
||||
width = 80;
|
||||
height = 160;
|
||||
unflippable = true;
|
||||
|
@ -6656,7 +6777,7 @@ thingtypes
|
|||
|
||||
christmasdisco
|
||||
{
|
||||
color = 10; // Green
|
||||
color = 2; // Green
|
||||
title = "Christmas & Disco";
|
||||
|
||||
1850
|
||||
|
@ -6759,7 +6880,7 @@ thingtypes
|
|||
|
||||
stalagmites
|
||||
{
|
||||
color = 10; // Green
|
||||
color = 2; // Green
|
||||
title = "Stalagmites";
|
||||
width = 16;
|
||||
height = 40;
|
||||
|
@ -6838,7 +6959,7 @@ thingtypes
|
|||
|
||||
hauntedheights
|
||||
{
|
||||
color = 10; // Green
|
||||
color = 2; // Green
|
||||
title = "Haunted Heights";
|
||||
|
||||
2000
|
||||
|
@ -6927,7 +7048,7 @@ thingtypes
|
|||
|
||||
frozenhillside
|
||||
{
|
||||
color = 10; // Green
|
||||
color = 2; // Green
|
||||
title = "Frozen Hillside";
|
||||
|
||||
2100
|
||||
|
@ -6978,7 +7099,7 @@ thingtypes
|
|||
|
||||
tutorial
|
||||
{
|
||||
color = 10; // Green
|
||||
color = 2; // Green
|
||||
title = "Tutorial";
|
||||
|
||||
799
|
||||
|
@ -6989,10 +7110,11 @@ thingtypes
|
|||
height = 144;
|
||||
parametertext = "Start frame";
|
||||
}
|
||||
}
|
||||
|
||||
flickies
|
||||
{
|
||||
color = 10; // Green
|
||||
color = 3; // Teal
|
||||
title = "Flickies";
|
||||
width = 8;
|
||||
height = 20;
|
||||
|
|
|
@ -15,7 +15,7 @@ common
|
|||
ignoredextensions = "wad pk3 pk7 bak backup1 backup2 backup3 zip rar 7z";
|
||||
|
||||
// Default testing parameters
|
||||
testparameters = "-file \"%AP\" \"%F\" -warp %L";
|
||||
testparameters = "-folder \"%AF\" -file \"%AA\" \"%F\" -warp %L";
|
||||
testshortpaths = true;
|
||||
|
||||
// Action special help
|
||||
|
@ -26,7 +26,7 @@ common
|
|||
generalizedsectors = true;
|
||||
|
||||
// Maximum safe map size check (0 means skip check)
|
||||
safeboundary = 1;
|
||||
safeboundary = 0;
|
||||
|
||||
// Map boundaries. Map objects can only be placed within these boundaries
|
||||
leftboundary = -32768;
|
||||
|
@ -40,6 +40,8 @@ common
|
|||
defaultflatscale = 1.0f;
|
||||
scaledtextureoffsets = true;
|
||||
|
||||
maxcolormapalpha = 25;
|
||||
|
||||
// Thing number for start position in 3D Mode
|
||||
start3dmode = 3328;
|
||||
|
||||
|
@ -68,137 +70,6 @@ common
|
|||
}
|
||||
}
|
||||
|
||||
mapformat_doom
|
||||
{
|
||||
// The format interface handles the map data format
|
||||
formatinterface = "DoomMapSetIO";
|
||||
|
||||
// Default nodebuilder configurations
|
||||
defaultsavecompiler = "zennode_normal";
|
||||
defaulttestcompiler = "zennode_fast";
|
||||
|
||||
/*
|
||||
GAME DETECT PATTERN
|
||||
Used to guess the game for which a WAD file is made.
|
||||
|
||||
1 = One of these lumps must exist
|
||||
2 = None of these lumps must exist
|
||||
3 = All of these lumps must exist
|
||||
*/
|
||||
|
||||
gamedetect
|
||||
{
|
||||
EXTENDED = 2;
|
||||
|
||||
|
||||
BEHAVIOR = 2;
|
||||
|
||||
E#M# = 2;
|
||||
|
||||
MAP?? = 1;
|
||||
}
|
||||
|
||||
/*
|
||||
MAP LUMP NAMES
|
||||
Map lumps are loaded with the map as long as they are right after each other. When the editor
|
||||
meets a lump which is not defined in this list it will ignore the map if not satisfied.
|
||||
The order of items defines the order in which lumps will be written to WAD file on save.
|
||||
To indicate the map header lump, use ~MAP
|
||||
|
||||
Legenda:
|
||||
required = Lump is required to exist.
|
||||
blindcopy = Lump will be copied along with the map blindly. (usefull for lumps Doom Builder doesn't use)
|
||||
nodebuild = The nodebuilder generates this lump.
|
||||
allowempty = The nodebuilder is allowed to leave this lump empty.
|
||||
script = This lump is a text-based script. Specify the filename of the script configuration to use.
|
||||
*/
|
||||
|
||||
maplumpnames
|
||||
{
|
||||
include("SRB222_misc.cfg", "doommaplumpnames");
|
||||
}
|
||||
|
||||
// When this is set to true, sectors with the same tag will light up when a line is highlighted
|
||||
linetagindicatesectors = true;
|
||||
|
||||
// Special linedefs
|
||||
include("SRB222_misc.cfg", "speciallinedefs");
|
||||
|
||||
// Default flags for first new thing
|
||||
defaultthingflags
|
||||
{
|
||||
}
|
||||
|
||||
// DEFAULT SECTOR BRIGHTNESS LEVELS
|
||||
sectorbrightness
|
||||
{
|
||||
include("SRB222_misc.cfg", "sectorbrightness");
|
||||
}
|
||||
|
||||
// SECTOR TYPES
|
||||
sectortypes
|
||||
{
|
||||
include("SRB222_sectors.cfg", "sectortypes");
|
||||
}
|
||||
|
||||
// GENERALISED SECTOR TYPES
|
||||
gen_sectortypes
|
||||
{
|
||||
include("SRB222_sectors.cfg", "gen_sectortypes");
|
||||
}
|
||||
|
||||
// LINEDEF FLAGS
|
||||
linedefflags
|
||||
{
|
||||
include("SRB222_misc.cfg", "linedefflags");
|
||||
}
|
||||
|
||||
// Linedef flags UDMF translation table
|
||||
// This is needed for copy/paste and prefabs to work properly
|
||||
// When the UDMF field name is prefixed with ! it is inverted
|
||||
linedefflagstranslation
|
||||
{
|
||||
include("SRB222_misc.cfg", "linedefflagstranslation");
|
||||
}
|
||||
|
||||
// LINEDEF ACTIVATIONS
|
||||
linedefactivations
|
||||
{
|
||||
}
|
||||
|
||||
// LINEDEF TYPES
|
||||
linedeftypes
|
||||
{
|
||||
include("SRB222_linedefs.cfg", "doom");
|
||||
}
|
||||
|
||||
// THING FLAGS
|
||||
thingflags
|
||||
{
|
||||
include("SRB222_misc.cfg", "thingflags");
|
||||
}
|
||||
|
||||
// Thing flags UDMF translation table
|
||||
// This is needed for copy/paste and prefabs to work properly
|
||||
// When the UDMF field name is prefixed with ! it is inverted
|
||||
thingflagstranslation
|
||||
{
|
||||
include("SRB222_misc.cfg", "thingflagstranslation");
|
||||
}
|
||||
|
||||
// THING FLAGS ERROR MASK
|
||||
// Mask for the thing flags which indicates the options
|
||||
// that make the same thing appear in the same modes
|
||||
thingflagsmask1 = 7; // 1 + 2 + 4
|
||||
thingflagsmask2 = 0;
|
||||
|
||||
// THING TYPES
|
||||
thingtypes
|
||||
{
|
||||
include("SRB222_things.cfg", "doom");
|
||||
}
|
||||
}
|
||||
|
||||
mapformat_udmf
|
||||
{
|
||||
// The format interface handles the map data format
|
||||
|
@ -223,8 +94,16 @@ mapformat_udmf
|
|||
include("SRB222_misc.cfg", "universalfields");
|
||||
}
|
||||
|
||||
// Disable Doom-related modes that don't make sense for SRB2
|
||||
soundsupport = false;
|
||||
automapsupport = false;
|
||||
|
||||
// When this is set to true, sectors with the same tag will light up when a line is highlighted
|
||||
linetagindicatesectors = false;
|
||||
localsidedeftextureoffsets = true;
|
||||
distinctfloorandceilingbrightness = true;
|
||||
|
||||
planeequationsupport = true;
|
||||
|
||||
// Special linedefs
|
||||
include("SRB222_misc.cfg", "speciallinedefs_udmf");
|
||||
|
@ -240,6 +119,11 @@ mapformat_udmf
|
|||
include("SRB222_misc.cfg", "sectorflags");
|
||||
}
|
||||
|
||||
sectorflagscategories
|
||||
{
|
||||
include("SRB222_misc.cfg", "sectorflagscategories");
|
||||
}
|
||||
|
||||
// DEFAULT SECTOR BRIGHTNESS LEVELS
|
||||
sectorbrightness
|
||||
{
|
||||
|
@ -247,6 +131,7 @@ mapformat_udmf
|
|||
}
|
||||
|
||||
damagetypes = "Generic Water Fire Lava Electric Spike DeathPitTilt DeathPitNoTilt Instakill SpecialStage";
|
||||
triggerertypes = "Player AllPlayers Mobj";
|
||||
|
||||
// LINEDEF FLAGS
|
||||
linedefflags
|
||||
|
@ -282,7 +167,6 @@ mapformat_udmf
|
|||
// How to compare thing flags (for the stuck things error checker)
|
||||
thingflagscompare
|
||||
{
|
||||
include("UDMF_misc.cfg", "thingflagscompare");
|
||||
}
|
||||
|
||||
// THING TYPES
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,24 +1,3 @@
|
|||
linedefflags
|
||||
{
|
||||
1 = "[0] Impassable";
|
||||
2 = "[1] Block Enemies";
|
||||
4 = "[2] Double-Sided";
|
||||
8 = "[3] Upper Unpegged";
|
||||
16 = "[4] Lower Unpegged";
|
||||
32 = "[5] Slope Skew (E1)";
|
||||
64 = "[6] Not Climbable";
|
||||
128 = "[7] No Midtexture Skew (E2)";
|
||||
256 = "[8] Peg Midtexture (E3)";
|
||||
512 = "[9] Solid Midtexture (E4)";
|
||||
1024 = "[10] Repeat Midtexture (E5)";
|
||||
2048 = "[11] Netgame Only";
|
||||
4096 = "[12] No Netgame";
|
||||
8192 = "[13] Effect 6";
|
||||
16384 = "[14] Bouncy Wall";
|
||||
32768 = "[15] Transfer Line";
|
||||
}
|
||||
|
||||
|
||||
// Linedef flags UDMF translation table
|
||||
// This is needed for copy/paste and prefabs to work properly
|
||||
// When the UDMF field name is prefixed with ! it is inverted
|
||||
|
@ -42,7 +21,6 @@ linedefflagstranslation
|
|||
32768 = "transfer";
|
||||
}
|
||||
|
||||
|
||||
linedefflags_udmf
|
||||
{
|
||||
blocking = "Impassable";
|
||||
|
@ -74,19 +52,13 @@ linedefrenderstyles
|
|||
|
||||
sectorflags
|
||||
{
|
||||
colormapfog = "Fog Planes in Colormap";
|
||||
colormapfadesprites = "Fade Fullbright in Colormap";
|
||||
colormapprotected = "Protected Colormap";
|
||||
flipspecial_nofloor = "No Trigger on Floor Touch";
|
||||
flipspecial_ceiling = "Trigger on Ceiling Touch";
|
||||
triggerspecial_touch = "Trigger on Edge Touch";
|
||||
triggerspecial_headbump = "Trigger on Headbump";
|
||||
triggerline_plane = "Linedef Trigger Requires Plane Touch";
|
||||
triggerline_mobj = "Non-Pushables Can Trigger Linedef";
|
||||
invertprecip = "Invert Precipitation";
|
||||
gravityflip = "Flip Objects in Reverse Gravity";
|
||||
heatwave = "Heat Wave";
|
||||
noclipcamera = "Intangible to the Camera";
|
||||
colormapfog = "Fog Planes";
|
||||
colormapfadesprites = "Fade Fullbright";
|
||||
colormapprotected = "Protected from Tagging";
|
||||
outerspace = "Space Countdown";
|
||||
doublestepup = "Ramp Sector (double step-up/down)";
|
||||
nostepdown = "Non-Ramp Sector (No step-down)";
|
||||
|
@ -104,23 +76,59 @@ sectorflags
|
|||
zoomtubeend = "Zoom Tube End";
|
||||
finishline = "Circuit Finish Line";
|
||||
ropehang = "Rope Hang";
|
||||
jumpflip = "Flip Gravity on Jump";
|
||||
gravityoverride = "Make Reverse Gravity Temporary";
|
||||
flipspecial_nofloor = "No Trigger on Floor Touch";
|
||||
flipspecial_ceiling = "Trigger on Ceiling Touch";
|
||||
triggerspecial_touch = "Trigger on Edge Touch";
|
||||
triggerspecial_headbump = "Trigger on Headbump";
|
||||
triggerline_plane = "Linedef Trigger Requires Plane Touch";
|
||||
triggerline_mobj = "Non-Pushables Can Trigger Linedef";
|
||||
}
|
||||
|
||||
thingflags
|
||||
sectorflagscategories
|
||||
{
|
||||
1 = "[1] Extra";
|
||||
2 = "[2] Flip";
|
||||
4 = "[4] Special";
|
||||
8 = "[8] Ambush";
|
||||
invertprecip = "regular";
|
||||
gravityflip = "regular";
|
||||
heatwave = "regular";
|
||||
noclipcamera = "regular";
|
||||
colormapfog = "colormap";
|
||||
colormapfadesprites = "colormap";
|
||||
colormapprotected = "colormap";
|
||||
outerspace = "special";
|
||||
doublestepup = "special";
|
||||
nostepdown = "special";
|
||||
speedpad = "special";
|
||||
starpostactivator = "special";
|
||||
exit = "special";
|
||||
specialstagepit = "special";
|
||||
returnflag = "special";
|
||||
redteambase = "special";
|
||||
blueteambase = "special";
|
||||
fan = "special";
|
||||
supertransform = "special";
|
||||
forcespin = "special";
|
||||
zoomtubestart = "special";
|
||||
zoomtubeend = "special";
|
||||
finishline = "special";
|
||||
ropehang = "special";
|
||||
jumpflip = "special";
|
||||
gravityoverride = "special";
|
||||
flipspecial_nofloor = "trigger";
|
||||
flipspecial_ceiling = "trigger";
|
||||
triggerspecial_touch = "trigger";
|
||||
triggerspecial_headbump = "trigger";
|
||||
triggerline_plane = "trigger";
|
||||
triggerline_mobj = "trigger";
|
||||
}
|
||||
|
||||
// THING FLAGS
|
||||
thingflags_udmf
|
||||
{
|
||||
flip = "Flip";
|
||||
absolutez = "Absolute Z height";
|
||||
}
|
||||
|
||||
|
||||
// Thing flags UDMF translation table
|
||||
// This is needed for copy/paste and prefabs to work properly
|
||||
// When the UDMF field name is prefixed with ! it is inverted
|
||||
|
@ -130,9 +138,9 @@ thingflagstranslation
|
|||
2 = "flip";
|
||||
4 = "special";
|
||||
8 = "ambush";
|
||||
16 = "absolutez";
|
||||
}
|
||||
|
||||
|
||||
// DEFAULT SECTOR BRIGHTNESS LEVELS
|
||||
sectorbrightness
|
||||
{
|
||||
|
@ -171,6 +179,8 @@ sectorbrightness
|
|||
0;
|
||||
}
|
||||
|
||||
numbrightnesslevels = 32;
|
||||
|
||||
/*
|
||||
TEXTURES AND FLAT SOURCES
|
||||
This tells Doom Builder where to find the information for textures
|
||||
|
@ -221,145 +231,18 @@ universalfields
|
|||
{
|
||||
sector
|
||||
{
|
||||
lightalpha
|
||||
{
|
||||
type = 0;
|
||||
default = 25;
|
||||
}
|
||||
|
||||
fadealpha
|
||||
{
|
||||
type = 0;
|
||||
default = 25;
|
||||
}
|
||||
|
||||
fadestart
|
||||
{
|
||||
type = 0;
|
||||
default = 0;
|
||||
}
|
||||
|
||||
fadeend
|
||||
{
|
||||
type = 0;
|
||||
default = 33;
|
||||
}
|
||||
|
||||
foglighting
|
||||
{
|
||||
type = 3;
|
||||
default = false;
|
||||
}
|
||||
|
||||
friction
|
||||
{
|
||||
type = 1;
|
||||
default = 0.90625;
|
||||
}
|
||||
|
||||
triggertag
|
||||
{
|
||||
type = 15;
|
||||
default = 0;
|
||||
}
|
||||
|
||||
triggerer
|
||||
{
|
||||
type = 2;
|
||||
default = "Player";
|
||||
}
|
||||
}
|
||||
|
||||
linedef
|
||||
{
|
||||
arg5
|
||||
{
|
||||
type = 0;
|
||||
default = 0;
|
||||
}
|
||||
arg6
|
||||
{
|
||||
type = 0;
|
||||
default = 0;
|
||||
}
|
||||
arg7
|
||||
{
|
||||
type = 0;
|
||||
default = 0;
|
||||
}
|
||||
arg8
|
||||
{
|
||||
type = 0;
|
||||
default = 0;
|
||||
}
|
||||
arg9
|
||||
{
|
||||
type = 0;
|
||||
default = 0;
|
||||
}
|
||||
stringarg0
|
||||
{
|
||||
type = 2;
|
||||
default = "";
|
||||
}
|
||||
stringarg1
|
||||
{
|
||||
type = 2;
|
||||
default = "";
|
||||
}
|
||||
executordelay
|
||||
{
|
||||
type = 0;
|
||||
default = 0;
|
||||
}
|
||||
}
|
||||
|
||||
sidedef
|
||||
{
|
||||
repeatcnt
|
||||
{
|
||||
type = 0;
|
||||
default = 0;
|
||||
}
|
||||
}
|
||||
|
||||
thing
|
||||
{
|
||||
arg5
|
||||
{
|
||||
type = 0;
|
||||
default = 0;
|
||||
}
|
||||
arg6
|
||||
{
|
||||
type = 0;
|
||||
default = 0;
|
||||
}
|
||||
arg7
|
||||
{
|
||||
type = 0;
|
||||
default = 0;
|
||||
}
|
||||
arg8
|
||||
{
|
||||
type = 0;
|
||||
default = 0;
|
||||
}
|
||||
arg9
|
||||
{
|
||||
type = 0;
|
||||
default = 0;
|
||||
}
|
||||
stringarg0
|
||||
{
|
||||
type = 2;
|
||||
default = "";
|
||||
}
|
||||
stringarg1
|
||||
{
|
||||
type = 2;
|
||||
default = "";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -378,87 +261,6 @@ allowempty = The nodebuilder is allowed to leave this lump empty.
|
|||
scriptbuild = This lump is a text-based script, which should be compiled using current script compiler;
|
||||
script = This lump is a text-based script. Specify the filename of the script configuration to use.
|
||||
*/
|
||||
|
||||
doommaplumpnames
|
||||
{
|
||||
~MAP
|
||||
{
|
||||
required = true;
|
||||
blindcopy = true;
|
||||
nodebuild = false;
|
||||
}
|
||||
|
||||
THINGS
|
||||
{
|
||||
required = true;
|
||||
nodebuild = true;
|
||||
allowempty = true;
|
||||
}
|
||||
|
||||
LINEDEFS
|
||||
{
|
||||
required = true;
|
||||
nodebuild = true;
|
||||
allowempty = false;
|
||||
}
|
||||
|
||||
SIDEDEFS
|
||||
{
|
||||
required = true;
|
||||
nodebuild = true;
|
||||
allowempty = false;
|
||||
}
|
||||
|
||||
VERTEXES
|
||||
{
|
||||
required = true;
|
||||
nodebuild = true;
|
||||
allowempty = false;
|
||||
}
|
||||
|
||||
SEGS
|
||||
{
|
||||
required = false;
|
||||
nodebuild = true;
|
||||
allowempty = false;
|
||||
}
|
||||
|
||||
SSECTORS
|
||||
{
|
||||
required = false;
|
||||
nodebuild = true;
|
||||
allowempty = false;
|
||||
}
|
||||
|
||||
NODES
|
||||
{
|
||||
required = false;
|
||||
nodebuild = true;
|
||||
allowempty = false;
|
||||
}
|
||||
|
||||
SECTORS
|
||||
{
|
||||
required = true;
|
||||
nodebuild = true;
|
||||
allowempty = false;
|
||||
}
|
||||
|
||||
REJECT
|
||||
{
|
||||
required = false;
|
||||
nodebuild = true;
|
||||
allowempty = false;
|
||||
}
|
||||
|
||||
BLOCKMAP
|
||||
{
|
||||
required = false;
|
||||
nodebuild = true;
|
||||
allowempty = true;
|
||||
}
|
||||
}
|
||||
|
||||
udmfmaplumpnames
|
||||
{
|
||||
ZNODES
|
||||
|
@ -682,48 +484,32 @@ thingsfilters
|
|||
|
||||
}
|
||||
|
||||
//filter3
|
||||
//{
|
||||
// name = "Normal Gravity";
|
||||
// category = "";
|
||||
// type = -1;
|
||||
//
|
||||
// fields
|
||||
// {
|
||||
// 2 = false;
|
||||
// }
|
||||
//}
|
||||
|
||||
filter3
|
||||
{
|
||||
name = "Normal Gravity";
|
||||
category = "";
|
||||
type = -1;
|
||||
|
||||
fields
|
||||
{
|
||||
2 = false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
filter4
|
||||
{
|
||||
name = "Reverse Gravity";
|
||||
category = "";
|
||||
type = -1;
|
||||
|
||||
fields
|
||||
{
|
||||
2 = true;
|
||||
}
|
||||
|
||||
}
|
||||
//filter4
|
||||
//{
|
||||
// name = "Reverse Gravity";
|
||||
// category = "";
|
||||
// type = -1;
|
||||
//
|
||||
// fields
|
||||
// {
|
||||
// 2 = true;
|
||||
// }
|
||||
//}
|
||||
}
|
||||
|
||||
// Special linedefs
|
||||
speciallinedefs
|
||||
{
|
||||
soundlinedefflag = 64; // See linedefflags
|
||||
singlesidedflag = 1; // See linedefflags
|
||||
doublesidedflag = 4; // See linedefflags
|
||||
impassableflag = 1;
|
||||
upperunpeggedflag = 8;
|
||||
lowerunpeggedflag = 16;
|
||||
repeatmidtextureflag = 1024;
|
||||
pegmidtextureflag = 256;
|
||||
}
|
||||
|
||||
speciallinedefs_udmf
|
||||
{
|
||||
soundlinedefflag = "noclimb";
|
||||
|
@ -734,6 +520,8 @@ speciallinedefs_udmf
|
|||
lowerunpeggedflag = "dontpegbottom";
|
||||
repeatmidtextureflag = "wrapmidtex";
|
||||
pegmidtextureflag = "midpeg";
|
||||
slopeskewflag = "skewtd";
|
||||
nomidtextureskewflag = "noskew";
|
||||
}
|
||||
|
||||
scriptlumpnames
|
||||
|
|
|
@ -1,107 +0,0 @@
|
|||
sectortypes
|
||||
{
|
||||
0 = "Normal";
|
||||
1 = "Damage";
|
||||
2 = "Damage (Water)";
|
||||
3 = "Damage (Fire)";
|
||||
4 = "Damage (Electrical)";
|
||||
5 = "Spikes";
|
||||
6 = "Death Pit (Camera Tilt)";
|
||||
7 = "Death Pit (No Camera Tilt)";
|
||||
8 = "Instant Kill";
|
||||
9 = "Ring Drainer (Floor Touch)";
|
||||
10 = "Ring Drainer (Anywhere in Sector)";
|
||||
11 = "Special Stage Damage";
|
||||
12 = "Space Countdown";
|
||||
13 = "Ramp Sector (double step-up/down)";
|
||||
14 = "Non-Ramp Sector (no step-down)";
|
||||
15 = "Bouncy FOF <deprecated>";
|
||||
16 = "Trigger Line Ex. (Pushable Objects)";
|
||||
32 = "Trigger Line Ex. (Anywhere, All Players)";
|
||||
48 = "Trigger Line Ex. (Floor Touch, All Players)";
|
||||
64 = "Trigger Line Ex. (Anywhere in Sector)";
|
||||
80 = "Trigger Line Ex. (Floor Touch)";
|
||||
96 = "Trigger Line Ex. (Emerald Check) <deprecated>";
|
||||
112 = "Trigger Line Ex. (NiGHTS Mare) <deprecated>";
|
||||
128 = "Check for Linedef Executor on FOFs";
|
||||
144 = "Egg Capsule";
|
||||
160 = "Special Stage Time/Spheres Parameters <deprecated>";
|
||||
176 = "Custom Global Gravity <deprecated>";
|
||||
1280 = "Speed Pad";
|
||||
1536 = "Flip Gravity on Jump";
|
||||
4096 = "Star Post Activator";
|
||||
8192 = "Exit/Special Stage Pit/Return Flag";
|
||||
12288 = "CTF Red Team Base";
|
||||
16384 = "CTF Blue Team Base";
|
||||
20480 = "Fan Sector";
|
||||
24576 = "Super Sonic Transform";
|
||||
28672 = "Force Spin";
|
||||
32768 = "Zoom Tube Start";
|
||||
36864 = "Zoom Tube End";
|
||||
40960 = "Circuit Finish Line";
|
||||
45056 = "Rope Hang";
|
||||
49152 = "Intangible to the Camera";
|
||||
}
|
||||
|
||||
gen_sectortypes
|
||||
{
|
||||
first
|
||||
{
|
||||
0 = "Normal";
|
||||
1 = "Damage";
|
||||
2 = "Damage (Water)";
|
||||
3 = "Damage (Fire)";
|
||||
4 = "Damage (Electrical)";
|
||||
5 = "Spikes";
|
||||
6 = "Death Pit (Camera Tilt)";
|
||||
7 = "Death Pit (No Camera Tilt)";
|
||||
8 = "Instant Kill";
|
||||
9 = "Ring Drainer (Floor Touch)";
|
||||
10 = "Ring Drainer (Anywhere in Sector)";
|
||||
11 = "Special Stage Damage";
|
||||
12 = "Space Countdown";
|
||||
13 = "Ramp Sector (double step-up/down)";
|
||||
14 = "Non-Ramp Sector (no step-down)";
|
||||
15 = "Bouncy FOF <deprecated>";
|
||||
}
|
||||
|
||||
second
|
||||
{
|
||||
0 = "Normal";
|
||||
16 = "Trigger Line Ex. (Pushable Objects)";
|
||||
32 = "Trigger Line Ex. (Anywhere, All Players)";
|
||||
48 = "Trigger Line Ex. (Floor Touch, All Players)";
|
||||
64 = "Trigger Line Ex. (Anywhere in Sector)";
|
||||
80 = "Trigger Line Ex. (Floor Touch)";
|
||||
96 = "Trigger Line Ex. (Emerald Check) <deprecated>";
|
||||
112 = "Trigger Line Ex. (NiGHTS Mare) <deprecated>";
|
||||
128 = "Check for Linedef Executor on FOFs";
|
||||
144 = "Egg Capsule";
|
||||
160 = "Special Stage Time/Spheres Parameters <deprecated>";
|
||||
176 = "Custom Global Gravity <deprecated>";
|
||||
}
|
||||
|
||||
third
|
||||
{
|
||||
0 = "Normal";
|
||||
1280 = "Speed Pad";
|
||||
1536 = "Flip Gravity on Jump";
|
||||
}
|
||||
|
||||
fourth
|
||||
{
|
||||
0 = "Normal";
|
||||
4096 = "Star Post Activator";
|
||||
8192 = "Exit/Special Stage Pit/Return Flag";
|
||||
12288 = "CTF Red Team Base";
|
||||
16384 = "CTF Blue Team Base";
|
||||
20480 = "Fan Sector";
|
||||
24576 = "Super Sonic Transform";
|
||||
28672 = "Force Spin";
|
||||
32768 = "Zoom Tube Start";
|
||||
36864 = "Zoom Tube End";
|
||||
40960 = "Circuit Finish Line";
|
||||
45056 = "Rope Hang";
|
||||
49152 = "Intangible to the Camera";
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load diff
|
@ -1,32 +0,0 @@
|
|||
/************************************************************************\
|
||||
Ultimate Doom Builder Game Configuration for Sonic Robo Blast 2 Version 2.2
|
||||
\************************************************************************/
|
||||
|
||||
// This is required to prevent accidental use of a different configuration
|
||||
type = "Doom Builder 2 Game Configuration";
|
||||
|
||||
// This is the title to show for this game
|
||||
game = "Sonic Robo Blast 2 - 2.2 (Doom format)";
|
||||
|
||||
// This is the simplified game engine/sourceport name
|
||||
engine = "zdoom";
|
||||
|
||||
// Settings common to all games and all map formats
|
||||
include("Includes\\SRB222_common.cfg", "common");
|
||||
|
||||
// Settings common to Doom map format
|
||||
include("Includes\\SRB222_common.cfg", "mapformat_doom");
|
||||
|
||||
include("Includes\\Game_SRB222.cfg");
|
||||
|
||||
// Script lumps detection
|
||||
scriptlumpnames
|
||||
{
|
||||
include("Includes\\SRB222_misc.cfg", "scriptlumpnames");
|
||||
}
|
||||
|
||||
//Default things filters
|
||||
thingsfilters
|
||||
{
|
||||
include("Includes\\SRB222_misc.cfg", "thingsfilters");
|
||||
}
|
|
@ -2,8 +2,8 @@
|
|||
# the poly3 Makefile adapted over and over...
|
||||
#
|
||||
# Copyright 1998-2000 DooM Legacy Team.
|
||||
# Copyright 2020-2022 James R.
|
||||
# Copyright 2003-2022 Sonic Team Junior.
|
||||
# Copyright 2020-2023 James R.
|
||||
# Copyright 2003-2023 Sonic Team Junior.
|
||||
#
|
||||
# This program is free software distributed under the
|
||||
# terms of the GNU General Public License, version 2.
|
||||
|
|
|
@ -64,6 +64,7 @@ r_skins.c
|
|||
r_sky.c
|
||||
r_splats.c
|
||||
r_things.c
|
||||
r_bbox.c
|
||||
r_textures.c
|
||||
r_patch.c
|
||||
r_patchrotation.c
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
|
|
@ -24,7 +24,7 @@ static INT64 start_time; // as microseconds since the epoch
|
|||
|
||||
// I should probably return how much memory is remaining
|
||||
// for this process, considering Android's process memory limit.
|
||||
UINT32 I_GetFreeMem(UINT32 *total)
|
||||
size_t I_GetFreeMem(size_t *total)
|
||||
{
|
||||
// what the heck? sysinfo() is partially missing in bionic?
|
||||
/* struct sysinfo si; */
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
Copyright 2019-2022, James R.
|
||||
Copyright 2019-2023, James R.
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
Copyright 2019-2022, James R.
|
||||
Copyright 2019-2023, James R.
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 2007-2016 by John "JTE" Muniz.
|
||||
// Copyright (C) 2011-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 2011-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
@ -118,7 +118,7 @@ static void B_BuildTailsTiccmd(mobj_t *sonic, mobj_t *tails, ticcmd_t *cmd)
|
|||
return;
|
||||
}
|
||||
|
||||
// Adapted from CobaltBW's tails_AI.wad
|
||||
// Adapted from clairebun's tails_AI.wad
|
||||
|
||||
// Check water
|
||||
if (water)
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 2007-2016 by John "JTE" Muniz.
|
||||
// Copyright (C) 2012-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 2012-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
|
|
@ -24,12 +24,14 @@
|
|||
#include "../byteptr.h"
|
||||
#include "../lua_script.h"
|
||||
#include "../m_misc.h"
|
||||
#include "../i_time.h"
|
||||
|
||||
|
||||
#define IO_INPUT 1
|
||||
#define IO_OUTPUT 2
|
||||
|
||||
#define FILELIMIT (1024 * 1024) // Size limit for reading/writing files
|
||||
#define MAXBYTESPERMINUTE (10 * 1024 * 1024) // Rate limit for writing files
|
||||
#define MAXOPENSPERMINUTE 50 // Rate limit for opening new files
|
||||
|
||||
#define FMT_FILECALLBACKID "file_callback_%d"
|
||||
|
||||
|
@ -46,6 +48,10 @@ static const char *whitelist[] = {
|
|||
};
|
||||
|
||||
|
||||
static INT64 numwrittenbytes = 0;
|
||||
static INT64 numopenedfiles = 0;
|
||||
|
||||
|
||||
static int pushresult (lua_State *L, int i, const char *filename) {
|
||||
int en = errno; /* calls to Lua API may change this value */
|
||||
if (i) {
|
||||
|
@ -252,6 +258,17 @@ static int io_openlocal (lua_State *L) {
|
|||
"Files can't be opened while being downloaded\n",
|
||||
filename);
|
||||
|
||||
// Reading not restricted
|
||||
if (client && (strchr(mode, 'w') || strchr(mode, 'a') || strchr(mode, '+')))
|
||||
{
|
||||
if (numopenedfiles >= (I_GetTime() / (60*TICRATE) + 1) * MAXOPENSPERMINUTE)
|
||||
I_Error("Access denied to %s\n"
|
||||
"File opening rate exceeded\n",
|
||||
filename);
|
||||
|
||||
numopenedfiles++;
|
||||
}
|
||||
|
||||
MakePathDirs(realfilename);
|
||||
|
||||
// Open and return the file
|
||||
|
@ -527,9 +544,12 @@ static int g_write (lua_State *L, FILE *f, int arg) {
|
|||
else {
|
||||
size_t l;
|
||||
const char *s = luaL_checklstring(L, arg, &l);
|
||||
if (ftell(f) + l > FILELIMIT) {
|
||||
luaL_error(L,"write limit bypassed in file. Changes have been discarded.");
|
||||
break;
|
||||
if (client) {
|
||||
if (numwrittenbytes + l > (I_GetTime() / (60*TICRATE) + 1) * MAXBYTESPERMINUTE) {
|
||||
luaL_error(L,"file write rate limit exceeded; changes have been discarded");
|
||||
break;
|
||||
}
|
||||
numwrittenbytes += l;
|
||||
}
|
||||
status = status && (fwrite(s, sizeof(char), l, f) == l);
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
@ -34,6 +34,7 @@
|
|||
#include "lua_script.h"
|
||||
#include "d_netfil.h" // findfile
|
||||
#include "r_data.h" // Color_cons_t
|
||||
#include "d_main.h" // D_IsPathAllowed
|
||||
|
||||
//========
|
||||
// protos.
|
||||
|
@ -57,6 +58,7 @@ static boolean CV_FilterVarByVersion(consvar_t *v, const char *valstr);
|
|||
static boolean CV_Command(void);
|
||||
consvar_t *CV_FindVar(const char *name);
|
||||
static const char *CV_StringValue(const char *var_name);
|
||||
static boolean CV_Immutable(const consvar_t *var);
|
||||
|
||||
static consvar_t *consvar_vars; // list of registered console variables
|
||||
static UINT16 consvar_number_of_netids = 0;
|
||||
|
@ -108,6 +110,7 @@ static cmdalias_t *com_alias; // aliases list
|
|||
// =========================================================================
|
||||
|
||||
static vsbuf_t com_text; // variable sized buffer
|
||||
static com_flags_t com_flags = 0;
|
||||
|
||||
/** Purges control characters out of some text.
|
||||
*
|
||||
|
@ -140,7 +143,7 @@ COM_Purge (char *s, int *np)
|
|||
* \param ptext The text to add.
|
||||
* \sa COM_BufInsertTextEx
|
||||
*/
|
||||
void COM_BufAddTextEx(const char *ptext, int flags)
|
||||
void COM_BufAddTextEx(const char *ptext, com_flags_t flags)
|
||||
{
|
||||
int l;
|
||||
char *text;
|
||||
|
@ -163,7 +166,7 @@ void COM_BufAddTextEx(const char *ptext, int flags)
|
|||
* \param ptext The text to execute. A newline is automatically added.
|
||||
* \sa COM_BufAddTextEx
|
||||
*/
|
||||
void COM_BufInsertTextEx(const char *ptext, int flags)
|
||||
void COM_BufInsertTextEx(const char *ptext, com_flags_t flags)
|
||||
{
|
||||
const INT32 old_wait = com_wait;
|
||||
|
||||
|
@ -264,6 +267,8 @@ void COM_BufExecute(void)
|
|||
break;
|
||||
}
|
||||
}
|
||||
|
||||
com_flags = 0;
|
||||
}
|
||||
|
||||
/** Executes a string immediately. Used for skirting around WAIT commands.
|
||||
|
@ -308,6 +313,7 @@ typedef struct xcommand_s
|
|||
const char *name;
|
||||
struct xcommand_s *next;
|
||||
com_func_t function;
|
||||
com_flags_t flags;
|
||||
} xcommand_t;
|
||||
|
||||
static xcommand_t *com_commands = NULL; // current commands
|
||||
|
@ -317,7 +323,6 @@ static size_t com_argc;
|
|||
static char *com_argv[MAX_ARGS];
|
||||
static const char *com_null_string = "";
|
||||
static char *com_args = NULL; // current command args or NULL
|
||||
static int com_flags;
|
||||
|
||||
static void Got_NetVar(UINT8 **p, INT32 playernum);
|
||||
|
||||
|
@ -329,16 +334,16 @@ void COM_Init(void)
|
|||
VS_Alloc(&com_text, COM_BUF_SIZE);
|
||||
|
||||
// add standard commands
|
||||
COM_AddCommand("alias", COM_Alias_f);
|
||||
COM_AddCommand("echo", COM_Echo_f);
|
||||
COM_AddCommand("cecho", COM_CEcho_f);
|
||||
COM_AddCommand("cechoflags", COM_CEchoFlags_f);
|
||||
COM_AddCommand("cechoduration", COM_CEchoDuration_f);
|
||||
COM_AddCommand("exec", COM_Exec_f);
|
||||
COM_AddCommand("wait", COM_Wait_f);
|
||||
COM_AddCommand("help", COM_Help_f);
|
||||
COM_AddCommand("toggle", COM_Toggle_f);
|
||||
COM_AddCommand("add", COM_Add_f);
|
||||
COM_AddCommand("alias", COM_Alias_f, 0);
|
||||
COM_AddCommand("echo", COM_Echo_f, COM_LUA);
|
||||
COM_AddCommand("cecho", COM_CEcho_f, COM_LUA);
|
||||
COM_AddCommand("cechoflags", COM_CEchoFlags_f, COM_LUA);
|
||||
COM_AddCommand("cechoduration", COM_CEchoDuration_f, COM_LUA);
|
||||
COM_AddCommand("exec", COM_Exec_f, 0);
|
||||
COM_AddCommand("wait", COM_Wait_f, 0);
|
||||
COM_AddCommand("help", COM_Help_f, COM_LUA);
|
||||
COM_AddCommand("toggle", COM_Toggle_f, COM_LUA);
|
||||
COM_AddCommand("add", COM_Add_f, COM_LUA);
|
||||
RegisterNetXCmd(XD_NETVAR, Got_NetVar);
|
||||
}
|
||||
|
||||
|
@ -440,7 +445,6 @@ static void COM_TokenizeString(char *ptext)
|
|||
|
||||
com_argc = 0;
|
||||
com_args = NULL;
|
||||
com_flags = 0;
|
||||
|
||||
while (com_argc < MAX_ARGS)
|
||||
{
|
||||
|
@ -478,7 +482,7 @@ static void COM_TokenizeString(char *ptext)
|
|||
* \param name Name of the command.
|
||||
* \param func Function called when the command is run.
|
||||
*/
|
||||
void COM_AddCommand(const char *name, com_func_t func)
|
||||
void COM_AddCommand(const char *name, com_func_t func, com_flags_t flags)
|
||||
{
|
||||
xcommand_t *cmd;
|
||||
|
||||
|
@ -508,6 +512,7 @@ void COM_AddCommand(const char *name, com_func_t func)
|
|||
cmd = ZZ_Alloc(sizeof *cmd);
|
||||
cmd->name = name;
|
||||
cmd->function = func;
|
||||
cmd->flags = flags;
|
||||
cmd->next = com_commands;
|
||||
com_commands = cmd;
|
||||
}
|
||||
|
@ -540,6 +545,7 @@ int COM_AddLuaCommand(const char *name)
|
|||
cmd = ZZ_Alloc(sizeof *cmd);
|
||||
cmd->name = name;
|
||||
cmd->function = COM_Lua_f;
|
||||
cmd->flags = COM_LUA;
|
||||
cmd->next = com_commands;
|
||||
com_commands = cmd;
|
||||
return 0;
|
||||
|
@ -635,6 +641,12 @@ static void COM_ExecuteString(char *ptext)
|
|||
{
|
||||
if (!stricmp(com_argv[0], cmd->name)) //case insensitive now that we have lower and uppercase!
|
||||
{
|
||||
if ((com_flags & COM_LUA) && !(cmd->flags & COM_LUA))
|
||||
{
|
||||
CONS_Alert(CONS_WARNING, "Command '%s' cannot be run from Lua.\n", cmd->name);
|
||||
return;
|
||||
}
|
||||
|
||||
cmd->function();
|
||||
return;
|
||||
}
|
||||
|
@ -770,6 +782,9 @@ static void COM_Exec_f(void)
|
|||
return;
|
||||
}
|
||||
|
||||
if (!D_CheckPathAllowed(COM_Argv(1), "tried to exec"))
|
||||
return;
|
||||
|
||||
// load file
|
||||
// Try with Argv passed verbatim first, for back compat
|
||||
FIL_ReadFile(COM_Argv(1), &buf);
|
||||
|
@ -794,8 +809,8 @@ static void COM_Exec_f(void)
|
|||
CONS_Printf(M_GetText("executing %s\n"), COM_Argv(1));
|
||||
|
||||
// insert text file into the command buffer
|
||||
COM_BufAddText((char *)buf);
|
||||
COM_BufAddText("\n");
|
||||
COM_BufAddTextEx((char *)buf, com_flags);
|
||||
COM_BufAddTextEx("\n", com_flags);
|
||||
|
||||
// free buffer
|
||||
Z_Free(buf);
|
||||
|
@ -998,6 +1013,9 @@ static void COM_Toggle_f(void)
|
|||
return;
|
||||
}
|
||||
|
||||
if (CV_Immutable(cvar))
|
||||
return;
|
||||
|
||||
if (!(cvar->PossibleValue == CV_YesNo || cvar->PossibleValue == CV_OnOff))
|
||||
{
|
||||
CONS_Alert(CONS_NOTICE, M_GetText("%s is not a boolean value\n"), COM_Argv(1));
|
||||
|
@ -1027,6 +1045,9 @@ static void COM_Add_f(void)
|
|||
return;
|
||||
}
|
||||
|
||||
if (CV_Immutable(cvar))
|
||||
return;
|
||||
|
||||
if (( cvar->flags & CV_FLOAT ))
|
||||
{
|
||||
float n =FIXED_TO_FLOAT (cvar->value) + atof(COM_Argv(2));
|
||||
|
@ -1116,7 +1137,7 @@ void VS_Write(vsbuf_t *buf, const void *data, size_t length)
|
|||
M_Memcpy(VS_GetSpace(buf, length), data, length);
|
||||
}
|
||||
|
||||
void VS_WriteEx(vsbuf_t *buf, const void *data, size_t length, int flags)
|
||||
void VS_WriteEx(vsbuf_t *buf, const void *data, size_t length, com_flags_t flags)
|
||||
{
|
||||
char *p;
|
||||
p = VS_GetSpace(buf, 2 + length);
|
||||
|
@ -2370,7 +2391,7 @@ static boolean CV_Command(void)
|
|||
if (!v)
|
||||
return false;
|
||||
|
||||
if (( com_flags & COM_SAFE ) && ( v->flags & CV_NOLUA ))
|
||||
if (CV_Immutable(v))
|
||||
{
|
||||
CONS_Alert(CONS_WARNING, "Variable '%s' cannot be changed from Lua.\n", v->name);
|
||||
return true;
|
||||
|
@ -2459,6 +2480,22 @@ void CV_SaveVariables(FILE *f)
|
|||
}
|
||||
}
|
||||
|
||||
// Returns true if this cvar cannot be modified in current context.
|
||||
// Such as if the cvar does not have CV_ALLOWLUA.
|
||||
static boolean CV_Immutable(const consvar_t *var)
|
||||
{
|
||||
// Currently operating from Lua
|
||||
if (com_flags & COM_LUA)
|
||||
{
|
||||
if (!(var->flags & CV_ALLOWLUA))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
//============================================================================
|
||||
// SCRIPT PARSE
|
||||
//============================================================================
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
@ -20,23 +20,23 @@
|
|||
// Command buffer & command execution
|
||||
//===================================
|
||||
|
||||
/* Lua command registration flags. */
|
||||
enum
|
||||
/* Command registration flags. */
|
||||
typedef enum
|
||||
{
|
||||
COM_ADMIN = 1,
|
||||
COM_SPLITSCREEN = 2,
|
||||
COM_LOCAL = 4,
|
||||
};
|
||||
|
||||
/* Command buffer flags. */
|
||||
enum
|
||||
{
|
||||
COM_SAFE = 1,
|
||||
};
|
||||
// COM_BufInsertText etc: can only access cvars
|
||||
// with CV_ALLOWLUA set.
|
||||
// COM_AddCommand: without this flag, the command
|
||||
// CANNOT be run from Lua.
|
||||
COM_LUA = 8,
|
||||
} com_flags_t;
|
||||
|
||||
typedef void (*com_func_t)(void);
|
||||
|
||||
void COM_AddCommand(const char *name, com_func_t func);
|
||||
void COM_AddCommand(const char *name, com_func_t func, com_flags_t flags);
|
||||
int COM_AddLuaCommand(const char *name);
|
||||
|
||||
size_t COM_Argc(void);
|
||||
|
@ -53,11 +53,11 @@ const char *COM_CompleteAlias(const char *partial, INT32 skips);
|
|||
|
||||
// insert at queu (at end of other command)
|
||||
#define COM_BufAddText(s) COM_BufAddTextEx(s, 0)
|
||||
void COM_BufAddTextEx(const char *btext, int flags);
|
||||
void COM_BufAddTextEx(const char *btext, com_flags_t flags);
|
||||
|
||||
// insert in head (before other command)
|
||||
#define COM_BufInsertText(s) COM_BufInsertTextEx(s, 0)
|
||||
void COM_BufInsertTextEx(const char *btext, int flags);
|
||||
void COM_BufInsertTextEx(const char *btext, com_flags_t flags);
|
||||
|
||||
// don't bother inserting, just do immediately
|
||||
void COM_ImmedExecute(const char *ptext);
|
||||
|
@ -89,7 +89,7 @@ void VS_Free(vsbuf_t *buf);
|
|||
void VS_Clear(vsbuf_t *buf);
|
||||
void *VS_GetSpace(vsbuf_t *buf, size_t length);
|
||||
void VS_Write(vsbuf_t *buf, const void *data, size_t length);
|
||||
void VS_WriteEx(vsbuf_t *buf, const void *data, size_t length, int flags);
|
||||
void VS_WriteEx(vsbuf_t *buf, const void *data, size_t length, com_flags_t flags);
|
||||
void VS_Print(vsbuf_t *buf, const char *data); // strcats onto the sizebuf
|
||||
|
||||
//==================
|
||||
|
@ -120,7 +120,7 @@ typedef enum
|
|||
// can only be set when we have the pointer to it
|
||||
// used on menus
|
||||
CV_CHEAT = 2048, // Don't let this be used in multiplayer unless cheats are on.
|
||||
CV_NOLUA = 4096,/* don't let this be called from Lua */
|
||||
CV_ALLOWLUA = 4096,/* Let this be called from Lua */
|
||||
} cvflags_t;
|
||||
|
||||
typedef struct CV_PossibleValue_s
|
||||
|
|
|
@ -27,12 +27,13 @@
|
|||
* Last updated 2020 / 10 / 02 - v2.2.8 - patch.pk3
|
||||
* Last updated 2021 / 05 / 06 - v2.2.9 - patch.pk3 & zones.pk3
|
||||
* Last updated 2022 / 03 / 06 - v2.2.10 - main assets
|
||||
* Last updated 2023 / 05 / 02 - v2.2.11 - patch.pk3 & zones.pk3
|
||||
*/
|
||||
#define ASSET_HASH_SRB2_PK3 "ad911f29a28a18968ee5b2d11c2acb39"
|
||||
#define ASSET_HASH_ZONES_PK3 "86ae55cae4e0a93ceda868635706a093"
|
||||
#define ASSET_HASH_ZONES_PK3 "1c8adf8d079ecb87d00081f158acf3c7"
|
||||
#define ASSET_HASH_PLAYER_DTA "2e7aaae8a6b1b77d90ffe7606ceadb6c"
|
||||
#ifdef USE_PATCH_DTA
|
||||
#define ASSET_HASH_PATCH_PK3 "7d467a883f7887b3c311798ee2f56b6a"
|
||||
#define ASSET_HASH_PATCH_PK3 "2e69558bce3b9610624549a75e29e19b"
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
117
src/console.c
117
src/console.c
|
@ -1,7 +1,7 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
@ -61,7 +61,7 @@ static boolean con_started = false; // console has been initialised
|
|||
static boolean con_forcepic = true; // at startup toggle console translucency when first off
|
||||
boolean con_recalc; // set true when screen size has changed
|
||||
|
||||
static tic_t con_tick; // console ticker for anim or blinking prompt cursor
|
||||
static tic_t con_tick; // console ticker for blinking prompt cursor
|
||||
// con_scrollup should use time (currenttime - lasttime)..
|
||||
|
||||
static boolean consoletoggle; // true when console key pushed, ticker will handle
|
||||
|
@ -110,6 +110,7 @@ static void CON_RecalcSize(void);
|
|||
static void CON_ChangeHeight(void);
|
||||
|
||||
static void CON_DrawBackpic(void);
|
||||
static void CONS_height_Change(void);
|
||||
static void CONS_hudlines_Change(void);
|
||||
static void CONS_backcolor_Change(void);
|
||||
|
||||
|
@ -136,7 +137,7 @@ static CV_PossibleValue_t speed_cons_t[] = {{0, "MIN"}, {64, "MAX"}, {0, NULL}};
|
|||
static consvar_t cons_speed = CVAR_INIT ("con_speed", "8", CV_SAVE, speed_cons_t, NULL);
|
||||
|
||||
// percentage of screen height to use for console
|
||||
static consvar_t cons_height = CVAR_INIT ("con_height", "50", CV_SAVE, CV_Unsigned, NULL);
|
||||
static consvar_t cons_height = CVAR_INIT ("con_height", "50", CV_CALL|CV_SAVE, CV_Unsigned, CONS_height_Change);
|
||||
|
||||
static CV_PossibleValue_t backpic_cons_t[] = {{0, "translucent"}, {1, "picture"}, {0, NULL}};
|
||||
// whether to use console background picture, or translucent mode
|
||||
|
@ -156,6 +157,18 @@ consvar_t cons_backcolor = CVAR_INIT ("con_backcolor", "Green", CV_CALL|CV_SAVE,
|
|||
|
||||
static void CON_Print(char *msg);
|
||||
|
||||
// Change the console height on demand
|
||||
//
|
||||
static void CONS_height_Change(void)
|
||||
{
|
||||
Lock_state();
|
||||
|
||||
if (con_destlines > 0 && !con_startup) // If the console is open (as in, not using "bind")...
|
||||
CON_ChangeHeight(); // ...update its height now, not only when it's closed and re-opened
|
||||
|
||||
Unlock_state();
|
||||
}
|
||||
|
||||
//
|
||||
//
|
||||
static void CONS_hudlines_Change(void)
|
||||
|
@ -382,16 +395,16 @@ static void CON_SetupColormaps(void)
|
|||
|
||||
// 0x1 0x3 0x9 0xF
|
||||
colset(magentamap, 177, 177, 178, 178, 178, 180, 180, 180, 182, 182, 182, 182, 184, 184, 184, 185);
|
||||
colset(yellowmap, 82, 82, 73, 73, 73, 64, 64, 64, 66, 66, 66, 66, 67, 67, 67, 68);
|
||||
colset(lgreenmap, 96, 96, 98, 98, 98, 101, 101, 101, 104, 104, 104, 104, 106, 106, 106, 107);
|
||||
colset(bluemap, 146, 146, 147, 147, 147, 149, 149, 149, 152, 152, 152, 152, 155, 155, 155, 157);
|
||||
colset(redmap, 32, 32, 33, 33, 33, 35, 35, 35, 39, 39, 39, 39, 42, 42, 42, 44);
|
||||
colset(yellowmap, 82, 82, 73, 73, 73, 74, 74, 74, 66, 66, 66, 66, 67, 67, 67, 68);
|
||||
colset(lgreenmap, 96, 96, 98, 98, 98, 100, 100, 100, 103, 103, 103, 103, 105, 105, 105, 107);
|
||||
colset(bluemap, 146, 146, 147, 147, 147, 148, 148, 148, 149, 149, 149, 149, 150, 150, 150, 151);
|
||||
colset(redmap, 32, 32, 33, 33, 33, 34, 34, 34, 35, 35, 35, 35, 37, 37, 37, 39);
|
||||
colset(graymap, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23);
|
||||
colset(orangemap, 50, 50, 52, 52, 52, 54, 54, 54, 56, 56, 56, 56, 59, 59, 59, 60);
|
||||
colset(skymap, 129, 129, 130, 130, 130, 131, 131, 131, 133, 133, 133, 133, 135, 135, 135, 136);
|
||||
colset(purplemap, 160, 160, 161, 161, 161, 162, 162, 162, 163, 163, 163, 163, 164, 164, 164, 165);
|
||||
colset(aquamap, 120, 120, 121, 121, 121, 122, 122, 122, 123, 123, 123, 123, 124, 124, 124, 125);
|
||||
colset(peridotmap, 72, 72, 188, 188, 189, 189, 189, 189, 190, 190, 190, 190, 191, 191, 191, 94);
|
||||
colset(peridotmap, 73, 73, 188, 188, 188, 189, 189, 189, 190, 190, 190, 190, 191, 191, 191, 94);
|
||||
colset(azuremap, 144, 144, 145, 145, 145, 146, 146, 146, 170, 170, 170, 170, 171, 171, 171, 172);
|
||||
colset(brownmap, 219, 219, 221, 221, 221, 222, 222, 222, 224, 224, 224, 224, 227, 227, 227, 229);
|
||||
colset(rosymap, 200, 200, 201, 201, 201, 202, 202, 202, 203, 203, 203, 203, 204, 204, 204, 205);
|
||||
|
@ -443,7 +456,7 @@ void CON_Init(void)
|
|||
|
||||
// register our commands
|
||||
//
|
||||
COM_AddCommand("cls", CONS_Clear_f);
|
||||
COM_AddCommand("cls", CONS_Clear_f, 0);
|
||||
//COM_AddCommand("english", CONS_English_f);
|
||||
// set console full screen for game startup MAKE SURE VID_Init() done !!!
|
||||
Lock_state();
|
||||
|
@ -470,7 +483,7 @@ void CON_Init(void)
|
|||
CV_RegisterVar(&cons_height);
|
||||
CV_RegisterVar(&cons_backpic);
|
||||
CV_RegisterVar(&cons_backcolor);
|
||||
COM_AddCommand("bind", CONS_Bind_f);
|
||||
COM_AddCommand("bind", CONS_Bind_f, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -643,33 +656,39 @@ static void CON_ChangeHeight(void)
|
|||
//
|
||||
static void CON_MoveConsole(void)
|
||||
{
|
||||
fixed_t conspeed;
|
||||
static fixed_t fracmovement = 0;
|
||||
|
||||
Lock_state();
|
||||
|
||||
conspeed = FixedDiv(cons_speed.value*vid.fdupy, FRACUNIT);
|
||||
|
||||
// instant
|
||||
if (!cons_speed.value)
|
||||
{
|
||||
con_curlines = con_destlines;
|
||||
Unlock_state();
|
||||
return;
|
||||
}
|
||||
|
||||
// up/down move to dest
|
||||
if (con_curlines < con_destlines)
|
||||
// Not instant - Increment fracmovement fractionally
|
||||
fracmovement += FixedMul(cons_speed.value*vid.fdupy, renderdeltatics);
|
||||
|
||||
if (con_curlines < con_destlines) // Move the console downwards
|
||||
{
|
||||
con_curlines += FixedInt(conspeed);
|
||||
if (con_curlines > con_destlines)
|
||||
con_curlines = con_destlines;
|
||||
con_curlines += FixedInt(fracmovement); // Move by fracmovement's integer value
|
||||
if (con_curlines > con_destlines) // If we surpassed the destination...
|
||||
con_curlines = con_destlines; // ...clamp to it!
|
||||
}
|
||||
else if (con_curlines > con_destlines)
|
||||
else // Move the console upwards
|
||||
{
|
||||
con_curlines -= FixedInt(conspeed);
|
||||
con_curlines -= FixedInt(fracmovement);
|
||||
if (con_curlines < con_destlines)
|
||||
con_curlines = con_destlines;
|
||||
|
||||
if (con_destlines == 0) // If the console is being closed, not just moved up...
|
||||
con_tick = 0; // ...don't show the blinking cursor
|
||||
}
|
||||
|
||||
fracmovement %= FRACUNIT; // Reset fracmovement's integer value, but keep the fraction
|
||||
|
||||
Unlock_state();
|
||||
}
|
||||
|
||||
|
@ -752,10 +771,6 @@ void CON_Ticker(void)
|
|||
CON_ChangeHeight();
|
||||
}
|
||||
|
||||
// console movement
|
||||
if (con_destlines != con_curlines)
|
||||
CON_MoveConsole();
|
||||
|
||||
// clip the view, so that the part under the console is not drawn
|
||||
con_clipviewtop = -1;
|
||||
if (cons_backpic.value) // clip only when using an opaque background
|
||||
|
@ -1809,41 +1824,41 @@ static void CON_DrawConsole(void)
|
|||
}
|
||||
|
||||
// draw console text lines from top to bottom
|
||||
if (con_curlines < minheight)
|
||||
return;
|
||||
|
||||
i = con_cy - con_scrollup;
|
||||
|
||||
// skip the last empty line due to the cursor being at the start of a new line
|
||||
i--;
|
||||
|
||||
i -= (con_curlines - minheight) / charheight;
|
||||
|
||||
if (rendermode == render_none) return;
|
||||
|
||||
for (y = (con_curlines-minheight) % charheight; y <= con_curlines-minheight; y += charheight, i++)
|
||||
if (con_curlines >= minheight)
|
||||
{
|
||||
INT32 x;
|
||||
size_t c;
|
||||
i = con_cy - con_scrollup;
|
||||
|
||||
p = (UINT8 *)&con_buffer[((i > 0 ? i : 0)%con_totallines)*con_width];
|
||||
// skip the last empty line due to the cursor being at the start of a new line
|
||||
i--;
|
||||
|
||||
for (c = 0, x = charwidth; c < con_width; c++, x += charwidth, p++)
|
||||
i -= (con_curlines - minheight) / charheight;
|
||||
|
||||
if (rendermode == render_none) return;
|
||||
|
||||
for (y = (con_curlines-minheight) % charheight; y <= con_curlines-minheight; y += charheight, i++)
|
||||
{
|
||||
while (*p & 0x80)
|
||||
INT32 x;
|
||||
size_t c;
|
||||
|
||||
p = (UINT8 *)&con_buffer[((i > 0 ? i : 0)%con_totallines)*con_width];
|
||||
|
||||
for (c = 0, x = charwidth; c < con_width; c++, x += charwidth, p++)
|
||||
{
|
||||
charflags = (*p & 0x7f) << V_CHARCOLORSHIFT;
|
||||
p++;
|
||||
c++;
|
||||
while (*p & 0x80)
|
||||
{
|
||||
charflags = (*p & 0x7f) << V_CHARCOLORSHIFT;
|
||||
p++;
|
||||
c++;
|
||||
}
|
||||
if (c >= con_width)
|
||||
break;
|
||||
V_DrawCharacter(x, y, (INT32)(*p) | charflags | cv_constextsize.value | V_NOSCALESTART, true);
|
||||
}
|
||||
if (c >= con_width)
|
||||
break;
|
||||
V_DrawCharacter(x, y, (INT32)(*p) | charflags | cv_constextsize.value | V_NOSCALESTART, true);
|
||||
}
|
||||
}
|
||||
|
||||
// draw prompt if enough place (not while game startup)
|
||||
if ((con_curlines == con_destlines) && (con_curlines >= minheight) && !con_startup)
|
||||
if ((con_curlines >= (minheight-charheight)) && !con_startup)
|
||||
CON_DrawInput();
|
||||
}
|
||||
|
||||
|
@ -1866,6 +1881,10 @@ void CON_Drawer(void)
|
|||
CON_ClearHUD();
|
||||
}
|
||||
|
||||
// console movement
|
||||
if (con_curlines != con_destlines)
|
||||
CON_MoveConsole();
|
||||
|
||||
if (con_curlines > 0)
|
||||
CON_DrawConsole();
|
||||
else if (gamestate == GS_LEVEL
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
@ -1318,9 +1318,9 @@ static boolean CL_SendJoin(void)
|
|||
|
||||
static INT32 FindRejoinerNum(SINT8 node)
|
||||
{
|
||||
char strippednodeaddress[64];
|
||||
char addressbuffer[64];
|
||||
const char *nodeaddress;
|
||||
char *port;
|
||||
const char *strippednodeaddress;
|
||||
INT32 i;
|
||||
|
||||
// Make sure there is no dead dress before proceeding to the stripping
|
||||
|
@ -1331,10 +1331,8 @@ static INT32 FindRejoinerNum(SINT8 node)
|
|||
return -1;
|
||||
|
||||
// Strip the address of its port
|
||||
strcpy(strippednodeaddress, nodeaddress);
|
||||
port = strchr(strippednodeaddress, ':');
|
||||
if (port)
|
||||
*port = '\0';
|
||||
strcpy(addressbuffer, nodeaddress);
|
||||
strippednodeaddress = I_NetSplitAddress(addressbuffer, NULL);
|
||||
|
||||
// Check if any player matches the stripped address
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
|
@ -1377,8 +1375,9 @@ static void SV_SendServerInfo(INT32 node, tic_t servertime)
|
|||
netbuffer->u.serverinfo.time = (tic_t)LONG(servertime);
|
||||
netbuffer->u.serverinfo.leveltime = (tic_t)LONG(leveltime);
|
||||
|
||||
netbuffer->u.serverinfo.numberofplayer = (UINT8)D_NumPlayers();
|
||||
netbuffer->u.serverinfo.maxplayer = (UINT8)cv_maxplayers.value;
|
||||
// Exclude bots from both counts
|
||||
netbuffer->u.serverinfo.numberofplayer = (UINT8)(D_NumPlayers() - D_NumBots());
|
||||
netbuffer->u.serverinfo.maxplayer = (UINT8)(cv_maxplayers.value - D_NumBots());
|
||||
|
||||
netbuffer->u.serverinfo.refusereason = GetRefuseReason(node);
|
||||
|
||||
|
@ -1505,6 +1504,7 @@ static boolean SV_SendServerConfig(INT32 node)
|
|||
netbuffer->u.servercfg.gamestate = (UINT8)gamestate;
|
||||
netbuffer->u.servercfg.gametype = (UINT8)gametype;
|
||||
netbuffer->u.servercfg.modifiedgame = (UINT8)modifiedgame;
|
||||
netbuffer->u.servercfg.usedCheats = (UINT8)usedCheats;
|
||||
|
||||
memcpy(netbuffer->u.servercfg.server_context, server_context, 8);
|
||||
|
||||
|
@ -2485,7 +2485,7 @@ static boolean CL_ServerConnectionTicker(const char *tmpsave, tic_t *oldtic, tic
|
|||
{
|
||||
if (!snake)
|
||||
{
|
||||
F_MenuPresTicker(true); // title sky
|
||||
F_MenuPresTicker(); // title sky
|
||||
F_TitleScreenTicker(true);
|
||||
F_TitleScreenDrawer();
|
||||
}
|
||||
|
@ -3506,10 +3506,10 @@ static void Got_KickCmd(UINT8 **p, INT32 playernum)
|
|||
static CV_PossibleValue_t netticbuffer_cons_t[] = {{0, "MIN"}, {3, "MAX"}, {0, NULL}};
|
||||
consvar_t cv_netticbuffer = CVAR_INIT ("netticbuffer", "1", CV_SAVE, netticbuffer_cons_t, NULL);
|
||||
|
||||
consvar_t cv_allownewplayer = CVAR_INIT ("allowjoin", "On", CV_SAVE|CV_NETVAR, CV_OnOff, NULL);
|
||||
consvar_t cv_allownewplayer = CVAR_INIT ("allowjoin", "On", CV_SAVE|CV_NETVAR|CV_ALLOWLUA, CV_OnOff, NULL);
|
||||
consvar_t cv_joinnextround = CVAR_INIT ("joinnextround", "Off", CV_SAVE|CV_NETVAR, CV_OnOff, NULL); /// \todo not done
|
||||
static CV_PossibleValue_t maxplayers_cons_t[] = {{2, "MIN"}, {32, "MAX"}, {0, NULL}};
|
||||
consvar_t cv_maxplayers = CVAR_INIT ("maxplayers", "8", CV_SAVE|CV_NETVAR, maxplayers_cons_t, NULL);
|
||||
consvar_t cv_maxplayers = CVAR_INIT ("maxplayers", "8", CV_SAVE|CV_NETVAR|CV_ALLOWLUA, maxplayers_cons_t, NULL);
|
||||
static CV_PossibleValue_t joindelay_cons_t[] = {{1, "MIN"}, {3600, "MAX"}, {0, "Off"}, {0, NULL}};
|
||||
consvar_t cv_joindelay = CVAR_INIT ("joindelay", "10", CV_SAVE|CV_NETVAR, joindelay_cons_t, NULL);
|
||||
static CV_PossibleValue_t rejointimeout_cons_t[] = {{1, "MIN"}, {60 * FRACUNIT, "MAX"}, {0, "Off"}, {0, NULL}};
|
||||
|
@ -3537,22 +3537,22 @@ void D_ClientServerInit(void)
|
|||
VERSION/100, VERSION%100, SUBVERSION));
|
||||
|
||||
#ifndef NONET
|
||||
COM_AddCommand("getplayernum", Command_GetPlayerNum);
|
||||
COM_AddCommand("kick", Command_Kick);
|
||||
COM_AddCommand("ban", Command_Ban);
|
||||
COM_AddCommand("banip", Command_BanIP);
|
||||
COM_AddCommand("clearbans", Command_ClearBans);
|
||||
COM_AddCommand("showbanlist", Command_ShowBan);
|
||||
COM_AddCommand("reloadbans", Command_ReloadBan);
|
||||
COM_AddCommand("connect", Command_connect);
|
||||
COM_AddCommand("nodes", Command_Nodes);
|
||||
COM_AddCommand("resendgamestate", Command_ResendGamestate);
|
||||
COM_AddCommand("getplayernum", Command_GetPlayerNum, COM_LUA);
|
||||
COM_AddCommand("kick", Command_Kick, COM_LUA);
|
||||
COM_AddCommand("ban", Command_Ban, COM_LUA);
|
||||
COM_AddCommand("banip", Command_BanIP, COM_LUA);
|
||||
COM_AddCommand("clearbans", Command_ClearBans, COM_LUA);
|
||||
COM_AddCommand("showbanlist", Command_ShowBan, COM_LUA);
|
||||
COM_AddCommand("reloadbans", Command_ReloadBan, COM_LUA);
|
||||
COM_AddCommand("connect", Command_connect, COM_LUA);
|
||||
COM_AddCommand("nodes", Command_Nodes, COM_LUA);
|
||||
COM_AddCommand("resendgamestate", Command_ResendGamestate, COM_LUA);
|
||||
#ifdef PACKETDROP
|
||||
COM_AddCommand("drop", Command_Drop);
|
||||
COM_AddCommand("droprate", Command_Droprate);
|
||||
COM_AddCommand("drop", Command_Drop, COM_LUA);
|
||||
COM_AddCommand("droprate", Command_Droprate, COM_LUA);
|
||||
#endif
|
||||
#ifdef _DEBUG
|
||||
COM_AddCommand("numnodes", Command_Numnodes);
|
||||
COM_AddCommand("numnodes", Command_Numnodes, COM_LUA);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
@ -3643,6 +3643,9 @@ void SV_ResetServer(void)
|
|||
|
||||
CV_RevertNetVars();
|
||||
|
||||
// Ensure synched when creating a new server
|
||||
M_CopyGameData(serverGamedata, clientGamedata);
|
||||
|
||||
DEBFILE("\n-=-=-=-=-=-=-= Server Reset =-=-=-=-=-=-=-\n\n");
|
||||
}
|
||||
|
||||
|
@ -3766,14 +3769,13 @@ static void Got_AddPlayer(UINT8 **p, INT32 playernum)
|
|||
|
||||
if (server && I_GetNodeAddress)
|
||||
{
|
||||
char addressbuffer[64];
|
||||
const char *address = I_GetNodeAddress(node);
|
||||
char *port = NULL;
|
||||
if (address) // MI: fix msvcrt.dll!_mbscat crash?
|
||||
{
|
||||
strcpy(playeraddress[newplayernum], address);
|
||||
port = strchr(playeraddress[newplayernum], ':');
|
||||
if (port)
|
||||
*port = '\0';
|
||||
strcpy(addressbuffer, address);
|
||||
strcpy(playeraddress[newplayernum],
|
||||
I_NetSplitAddress(addressbuffer, NULL));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -4077,7 +4079,7 @@ ConnectionRefused (SINT8 node, INT32 rejoinernum)
|
|||
{
|
||||
return va(
|
||||
"Maximum players reached: %d",
|
||||
cv_maxplayers.value);
|
||||
cv_maxplayers.value - D_NumBots());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4405,6 +4407,8 @@ static void HandlePacketFromAwayNode(SINT8 node)
|
|||
maketic = gametic = neededtic = (tic_t)LONG(netbuffer->u.servercfg.gametic);
|
||||
G_SetGametype(netbuffer->u.servercfg.gametype);
|
||||
modifiedgame = netbuffer->u.servercfg.modifiedgame;
|
||||
if (netbuffer->u.servercfg.usedCheats)
|
||||
G_SetUsedCheats(true);
|
||||
memcpy(server_context, netbuffer->u.servercfg.server_context, 8);
|
||||
}
|
||||
|
||||
|
@ -5609,6 +5613,19 @@ INT32 D_NumPlayers(void)
|
|||
return num;
|
||||
}
|
||||
|
||||
/** Similar to the above, but counts only bots.
|
||||
* Purpose is to remove bots from both the player count and the
|
||||
* max player count on the server view
|
||||
*/
|
||||
INT32 D_NumBots(void)
|
||||
{
|
||||
INT32 num = 0, ix;
|
||||
for (ix = 0; ix < MAXPLAYERS; ix++)
|
||||
if (playeringame[ix] && players[ix].bot)
|
||||
num++;
|
||||
return num;
|
||||
}
|
||||
|
||||
tic_t GetLag(INT32 node)
|
||||
{
|
||||
return gametic - nettics[node];
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
@ -158,6 +158,7 @@ typedef struct
|
|||
|
||||
UINT8 gametype;
|
||||
UINT8 modifiedgame;
|
||||
UINT8 usedCheats;
|
||||
|
||||
char server_context[8]; // Unique context id, generated at server startup.
|
||||
} ATTRPACK serverconfig_pak;
|
||||
|
@ -447,6 +448,7 @@ extern char motd[254], server_context[8];
|
|||
extern UINT8 playernode[MAXPLAYERS];
|
||||
|
||||
INT32 D_NumPlayers(void);
|
||||
INT32 D_NumBots(void);
|
||||
void D_ResetTiccmds(void);
|
||||
|
||||
tic_t GetLag(INT32 node);
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
|
103
src/d_main.c
103
src/d_main.c
|
@ -2,7 +2,7 @@
|
|||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
@ -1224,7 +1224,7 @@ void D_SRB2Main(void)
|
|||
// Print GPL notice for our console users (Linux)
|
||||
CONS_Printf(
|
||||
"\n\nSonic Robo Blast 2\n"
|
||||
"Copyright (C) 1998-2022 by Sonic Team Junior\n\n"
|
||||
"Copyright (C) 1998-2023 by Sonic Team Junior\n\n"
|
||||
"This program comes with ABSOLUTELY NO WARRANTY.\n\n"
|
||||
"This is free software, and you are welcome to redistribute it\n"
|
||||
"and/or modify it under the terms of the GNU General Public License\n"
|
||||
|
@ -1350,6 +1350,9 @@ void D_SRB2Main(void)
|
|||
CONS_Printf("Z_Init(): Init zone memory allocation daemon. \n");
|
||||
Z_Init();
|
||||
|
||||
clientGamedata = M_NewGameDataStruct();
|
||||
serverGamedata = M_NewGameDataStruct();
|
||||
|
||||
// Do this up here so that WADs loaded through the command line can use ExecCfg
|
||||
COM_Init();
|
||||
|
||||
|
@ -1473,7 +1476,15 @@ void D_SRB2Main(void)
|
|||
//--------------------------------------------------------- CONFIG.CFG
|
||||
M_FirstLoadConfig(); // WARNING : this do a "COM_BufExecute()"
|
||||
|
||||
G_LoadGameData();
|
||||
if (M_CheckParm("-gamedata") && M_IsNextParm())
|
||||
{
|
||||
// Moved from G_LoadGameData itself, as it would cause some crazy
|
||||
// confusion issues when loading mods.
|
||||
strlcpy(gamedatafilename, M_GetNextParm(), sizeof gamedatafilename);
|
||||
}
|
||||
|
||||
G_LoadGameData(clientGamedata);
|
||||
M_CopyGameData(serverGamedata, clientGamedata);
|
||||
|
||||
#if defined (__unix__) || defined (UNIXCOMMON) || defined (HAVE_SDL)
|
||||
VID_PrepareModeList(); // Regenerate Modelist according to cv_fullscreen
|
||||
|
@ -1500,7 +1511,7 @@ void D_SRB2Main(void)
|
|||
else
|
||||
{
|
||||
if (!M_CheckParm("-server"))
|
||||
G_SetGameModified(true);
|
||||
G_SetUsedCheats(true);
|
||||
autostart = true;
|
||||
}
|
||||
}
|
||||
|
@ -1704,7 +1715,7 @@ void D_SRB2Main(void)
|
|||
// ... unless you're in a dedicated server. Yes, technically this means you can view any level by
|
||||
// running a dedicated server and joining it yourself, but that's better than making dedicated server's
|
||||
// lives hell.
|
||||
else if (!dedicated && M_MapLocked(pstartmap))
|
||||
else if (!dedicated && M_MapLocked(pstartmap, serverGamedata))
|
||||
I_Error("You need to unlock this level before you can warp to it!\n");
|
||||
else
|
||||
{
|
||||
|
@ -1777,3 +1788,85 @@ const char *D_Home(void)
|
|||
if (usehome) return userhome;
|
||||
else return NULL;
|
||||
}
|
||||
|
||||
static boolean check_top_dir(const char **path, const char *top)
|
||||
{
|
||||
// empty string does NOT match
|
||||
if (!strcmp(top, ""))
|
||||
return false;
|
||||
|
||||
if (!startswith(*path, top))
|
||||
return false;
|
||||
|
||||
*path += strlen(top);
|
||||
|
||||
// if it doesn't already end with a path separator,
|
||||
// check if a separator follows
|
||||
if (!endswith(top, PATHSEP))
|
||||
{
|
||||
if (startswith(*path, PATHSEP))
|
||||
*path += strlen(PATHSEP);
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static int cmp_strlen_desc(const void *a, const void *b)
|
||||
{
|
||||
return ((int)strlen(*(const char*const*)b) - (int)strlen(*(const char*const*)a));
|
||||
}
|
||||
|
||||
boolean D_IsPathAllowed(const char *path)
|
||||
{
|
||||
const char *paths[] = {
|
||||
srb2home,
|
||||
srb2path,
|
||||
cv_addons_folder.string
|
||||
};
|
||||
|
||||
const size_t n_paths = sizeof paths / sizeof *paths;
|
||||
|
||||
size_t i;
|
||||
|
||||
// Sort folder paths by longest to shortest so
|
||||
// overlapping paths work. E.g.:
|
||||
// Path 1: /home/james/.srb2/addons
|
||||
// Path 2: /home/james/.srb2
|
||||
qsort(paths, n_paths, sizeof *paths, cmp_strlen_desc);
|
||||
|
||||
// These paths are allowed to be absolute
|
||||
// path is offset so ".." can be checked only in the
|
||||
// rest of the path
|
||||
for (i = 0; i < n_paths; ++i)
|
||||
{
|
||||
if (check_top_dir(&path, paths[i]))
|
||||
break;
|
||||
}
|
||||
|
||||
// Only if none of the presets matched
|
||||
if (i == n_paths)
|
||||
{
|
||||
// Cannot be an absolute path
|
||||
if (M_IsPathAbsolute(path))
|
||||
return false;
|
||||
}
|
||||
|
||||
// Cannot traverse upwards
|
||||
if (strstr(path, ".."))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
boolean D_CheckPathAllowed(const char *path, const char *why)
|
||||
{
|
||||
if (!D_IsPathAllowed(path))
|
||||
{
|
||||
CONS_Alert(CONS_WARNING, "%s: %s, location is not allowed\n", why, path);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
@ -44,6 +44,9 @@ void D_ProcessEvents(void);
|
|||
|
||||
const char *D_Home(void);
|
||||
|
||||
boolean D_IsPathAllowed(const char *path);
|
||||
boolean D_CheckPathAllowed(const char *path, const char *why);
|
||||
|
||||
//
|
||||
// BASE LEVEL
|
||||
//
|
||||
|
|
28
src/d_net.c
28
src/d_net.c
|
@ -2,7 +2,7 @@
|
|||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
@ -1207,26 +1207,32 @@ static void Internal_FreeNodenum(INT32 nodenum)
|
|||
(void)nodenum;
|
||||
}
|
||||
|
||||
char *I_NetSplitAddress(char *host, char **port)
|
||||
{
|
||||
boolean v4 = (strchr(host, '.') != NULL);
|
||||
|
||||
host = strtok(host, v4 ? ":" : "[]");
|
||||
|
||||
if (port)
|
||||
*port = strtok(NULL, ":");
|
||||
|
||||
return host;
|
||||
}
|
||||
|
||||
SINT8 I_NetMakeNode(const char *hostname)
|
||||
{
|
||||
SINT8 newnode = -1;
|
||||
if (I_NetMakeNodewPort)
|
||||
{
|
||||
char *localhostname = strdup(hostname);
|
||||
char *t = localhostname;
|
||||
const char *port;
|
||||
char *port;
|
||||
if (!localhostname)
|
||||
return newnode;
|
||||
|
||||
// retrieve portnum from address!
|
||||
strtok(localhostname, ":");
|
||||
port = strtok(NULL, ":");
|
||||
hostname = I_NetSplitAddress(localhostname, &port);
|
||||
|
||||
// remove the port in the hostname as we've it already
|
||||
while ((*t != ':') && (*t != '\0'))
|
||||
t++;
|
||||
*t = '\0';
|
||||
|
||||
newnode = I_NetMakeNodewPort(localhostname, port);
|
||||
newnode = I_NetMakeNodewPort(hostname, port);
|
||||
free(localhostname);
|
||||
}
|
||||
return newnode;
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
|
308
src/d_netcmd.c
308
src/d_netcmd.c
|
@ -1,7 +1,7 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
@ -203,37 +203,37 @@ static CV_PossibleValue_t matchboxes_cons_t[] = {{0, "Normal"}, {1, "Mystery"},
|
|||
static CV_PossibleValue_t chances_cons_t[] = {{0, "MIN"}, {9, "MAX"}, {0, NULL}};
|
||||
static CV_PossibleValue_t pause_cons_t[] = {{0, "Server"}, {1, "All"}, {0, NULL}};
|
||||
|
||||
consvar_t cv_showinputjoy = CVAR_INIT ("showinputjoy", "Off", 0, CV_OnOff, NULL);
|
||||
consvar_t cv_showinputjoy = CVAR_INIT ("showinputjoy", "Off", CV_ALLOWLUA, CV_OnOff, NULL);
|
||||
|
||||
#ifdef NETGAME_DEVMODE
|
||||
static consvar_t cv_fishcake = CVAR_INIT ("fishcake", "Off", CV_CALL|CV_NOSHOWHELP|CV_RESTRICT, CV_OnOff, Fishcake_OnChange);
|
||||
#endif
|
||||
static consvar_t cv_dummyconsvar = CVAR_INIT ("dummyconsvar", "Off", CV_CALL|CV_NOSHOWHELP, CV_OnOff, DummyConsvar_OnChange);
|
||||
|
||||
consvar_t cv_restrictskinchange = CVAR_INIT ("restrictskinchange", "Yes", CV_SAVE|CV_NETVAR|CV_CHEAT, CV_YesNo, NULL);
|
||||
consvar_t cv_allowteamchange = CVAR_INIT ("allowteamchange", "Yes", CV_SAVE|CV_NETVAR, CV_YesNo, NULL);
|
||||
consvar_t cv_restrictskinchange = CVAR_INIT ("restrictskinchange", "Yes", CV_SAVE|CV_NETVAR|CV_CHEAT|CV_ALLOWLUA, CV_YesNo, NULL);
|
||||
consvar_t cv_allowteamchange = CVAR_INIT ("allowteamchange", "Yes", CV_SAVE|CV_NETVAR|CV_ALLOWLUA, CV_YesNo, NULL);
|
||||
|
||||
consvar_t cv_startinglives = CVAR_INIT ("startinglives", "3", CV_SAVE|CV_NETVAR|CV_CHEAT, startingliveslimit_cons_t, NULL);
|
||||
consvar_t cv_startinglives = CVAR_INIT ("startinglives", "3", CV_SAVE|CV_NETVAR|CV_CHEAT|CV_ALLOWLUA, startingliveslimit_cons_t, NULL);
|
||||
|
||||
static CV_PossibleValue_t respawntime_cons_t[] = {{1, "MIN"}, {30, "MAX"}, {0, "Off"}, {0, NULL}};
|
||||
consvar_t cv_respawntime = CVAR_INIT ("respawndelay", "3", CV_SAVE|CV_NETVAR|CV_CHEAT, respawntime_cons_t, NULL);
|
||||
consvar_t cv_respawntime = CVAR_INIT ("respawndelay", "3", CV_SAVE|CV_NETVAR|CV_CHEAT|CV_ALLOWLUA, respawntime_cons_t, NULL);
|
||||
|
||||
consvar_t cv_competitionboxes = CVAR_INIT ("competitionboxes", "Mystery", CV_SAVE|CV_NETVAR|CV_CHEAT, competitionboxes_cons_t, NULL);
|
||||
consvar_t cv_competitionboxes = CVAR_INIT ("competitionboxes", "Mystery", CV_SAVE|CV_NETVAR|CV_CHEAT|CV_ALLOWLUA, competitionboxes_cons_t, NULL);
|
||||
|
||||
static CV_PossibleValue_t seenames_cons_t[] = {{0, "Off"}, {1, "Colorless"}, {2, "Team"}, {3, "Ally/Foe"}, {0, NULL}};
|
||||
consvar_t cv_seenames = CVAR_INIT ("seenames", "Ally/Foe", CV_SAVE, seenames_cons_t, 0);
|
||||
consvar_t cv_allowseenames = CVAR_INIT ("allowseenames", "Yes", CV_SAVE|CV_NETVAR, CV_YesNo, NULL);
|
||||
consvar_t cv_seenames = CVAR_INIT ("seenames", "Ally/Foe", CV_SAVE|CV_ALLOWLUA, seenames_cons_t, 0);
|
||||
consvar_t cv_allowseenames = CVAR_INIT ("allowseenames", "Yes", CV_SAVE|CV_NETVAR|CV_ALLOWLUA, CV_YesNo, NULL);
|
||||
|
||||
// names
|
||||
consvar_t cv_playername = CVAR_INIT ("name", "Sonic", CV_SAVE|CV_CALL|CV_NOINIT, NULL, Name_OnChange);
|
||||
consvar_t cv_playername2 = CVAR_INIT ("name2", "Tails", CV_SAVE|CV_CALL|CV_NOINIT, NULL, Name2_OnChange);
|
||||
// player colors
|
||||
UINT16 lastgoodcolor = SKINCOLOR_BLUE, lastgoodcolor2 = SKINCOLOR_BLUE;
|
||||
consvar_t cv_playercolor = CVAR_INIT ("color", "Blue", CV_CALL|CV_NOINIT, Color_cons_t, Color_OnChange);
|
||||
consvar_t cv_playercolor2 = CVAR_INIT ("color2", "Orange", CV_CALL|CV_NOINIT, Color_cons_t, Color2_OnChange);
|
||||
consvar_t cv_playercolor = CVAR_INIT ("color", "Blue", CV_CALL|CV_NOINIT|CV_ALLOWLUA, Color_cons_t, Color_OnChange);
|
||||
consvar_t cv_playercolor2 = CVAR_INIT ("color2", "Orange", CV_CALL|CV_NOINIT|CV_ALLOWLUA, Color_cons_t, Color2_OnChange);
|
||||
// player's skin, saved for commodity, when using a favorite skins wad..
|
||||
consvar_t cv_skin = CVAR_INIT ("skin", DEFAULTSKIN, CV_CALL|CV_NOINIT, NULL, Skin_OnChange);
|
||||
consvar_t cv_skin2 = CVAR_INIT ("skin2", DEFAULTSKIN2, CV_CALL|CV_NOINIT, NULL, Skin2_OnChange);
|
||||
consvar_t cv_skin = CVAR_INIT ("skin", DEFAULTSKIN, CV_CALL|CV_NOINIT|CV_ALLOWLUA, NULL, Skin_OnChange);
|
||||
consvar_t cv_skin2 = CVAR_INIT ("skin2", DEFAULTSKIN2, CV_CALL|CV_NOINIT|CV_ALLOWLUA, NULL, Skin2_OnChange);
|
||||
|
||||
// saved versions of the above six
|
||||
consvar_t cv_defaultplayercolor = CVAR_INIT ("defaultcolor", "Blue", CV_SAVE, Color_cons_t, NULL);
|
||||
|
@ -268,43 +268,43 @@ consvar_t cv_mouse2opt = CVAR_INIT ("mouse2opt", "0", CV_SAVE, NULL, NULL);
|
|||
consvar_t cv_mouse2port = CVAR_INIT ("mouse2port", "COM2", CV_SAVE, mouse2port_cons_t, NULL);
|
||||
#endif
|
||||
|
||||
consvar_t cv_matchboxes = CVAR_INIT ("matchboxes", "Normal", CV_SAVE|CV_NETVAR|CV_CHEAT, matchboxes_cons_t, NULL);
|
||||
consvar_t cv_specialrings = CVAR_INIT ("specialrings", "On", CV_SAVE|CV_NETVAR, CV_OnOff, NULL);
|
||||
consvar_t cv_powerstones = CVAR_INIT ("powerstones", "On", CV_SAVE|CV_NETVAR, CV_OnOff, NULL);
|
||||
consvar_t cv_matchboxes = CVAR_INIT ("matchboxes", "Normal", CV_SAVE|CV_NETVAR|CV_CHEAT|CV_ALLOWLUA, matchboxes_cons_t, NULL);
|
||||
consvar_t cv_specialrings = CVAR_INIT ("specialrings", "On", CV_SAVE|CV_NETVAR|CV_ALLOWLUA, CV_OnOff, NULL);
|
||||
consvar_t cv_powerstones = CVAR_INIT ("powerstones", "On", CV_SAVE|CV_NETVAR|CV_ALLOWLUA, CV_OnOff, NULL);
|
||||
|
||||
consvar_t cv_recycler = CVAR_INIT ("tv_recycler", "5", CV_SAVE|CV_NETVAR|CV_CHEAT, chances_cons_t, NULL);
|
||||
consvar_t cv_teleporters = CVAR_INIT ("tv_teleporter", "5", CV_SAVE|CV_NETVAR|CV_CHEAT, chances_cons_t, NULL);
|
||||
consvar_t cv_superring = CVAR_INIT ("tv_superring", "5", CV_SAVE|CV_NETVAR|CV_CHEAT, chances_cons_t, NULL);
|
||||
consvar_t cv_supersneakers = CVAR_INIT ("tv_supersneaker", "5", CV_SAVE|CV_NETVAR|CV_CHEAT, chances_cons_t, NULL);
|
||||
consvar_t cv_invincibility = CVAR_INIT ("tv_invincibility", "5", CV_SAVE|CV_NETVAR|CV_CHEAT, chances_cons_t, NULL);
|
||||
consvar_t cv_jumpshield = CVAR_INIT ("tv_jumpshield", "5", CV_SAVE|CV_NETVAR|CV_CHEAT, chances_cons_t, NULL);
|
||||
consvar_t cv_watershield = CVAR_INIT ("tv_watershield", "5", CV_SAVE|CV_NETVAR|CV_CHEAT, chances_cons_t, NULL);
|
||||
consvar_t cv_ringshield = CVAR_INIT ("tv_ringshield", "5", CV_SAVE|CV_NETVAR|CV_CHEAT, chances_cons_t, NULL);
|
||||
consvar_t cv_forceshield = CVAR_INIT ("tv_forceshield", "5", CV_SAVE|CV_NETVAR|CV_CHEAT, chances_cons_t, NULL);
|
||||
consvar_t cv_bombshield = CVAR_INIT ("tv_bombshield", "5", CV_SAVE|CV_NETVAR|CV_CHEAT, chances_cons_t, NULL);
|
||||
consvar_t cv_1up = CVAR_INIT ("tv_1up", "5", CV_SAVE|CV_NETVAR|CV_CHEAT, chances_cons_t, NULL);
|
||||
consvar_t cv_eggmanbox = CVAR_INIT ("tv_eggman", "5", CV_SAVE|CV_NETVAR|CV_CHEAT, chances_cons_t, NULL);
|
||||
consvar_t cv_recycler = CVAR_INIT ("tv_recycler", "5", CV_SAVE|CV_NETVAR|CV_CHEAT|CV_ALLOWLUA, chances_cons_t, NULL);
|
||||
consvar_t cv_teleporters = CVAR_INIT ("tv_teleporter", "5", CV_SAVE|CV_NETVAR|CV_CHEAT|CV_ALLOWLUA, chances_cons_t, NULL);
|
||||
consvar_t cv_superring = CVAR_INIT ("tv_superring", "5", CV_SAVE|CV_NETVAR|CV_CHEAT|CV_ALLOWLUA, chances_cons_t, NULL);
|
||||
consvar_t cv_supersneakers = CVAR_INIT ("tv_supersneaker", "5", CV_SAVE|CV_NETVAR|CV_CHEAT|CV_ALLOWLUA, chances_cons_t, NULL);
|
||||
consvar_t cv_invincibility = CVAR_INIT ("tv_invincibility", "5", CV_SAVE|CV_NETVAR|CV_CHEAT|CV_ALLOWLUA, chances_cons_t, NULL);
|
||||
consvar_t cv_jumpshield = CVAR_INIT ("tv_jumpshield", "5", CV_SAVE|CV_NETVAR|CV_CHEAT|CV_ALLOWLUA, chances_cons_t, NULL);
|
||||
consvar_t cv_watershield = CVAR_INIT ("tv_watershield", "5", CV_SAVE|CV_NETVAR|CV_CHEAT|CV_ALLOWLUA, chances_cons_t, NULL);
|
||||
consvar_t cv_ringshield = CVAR_INIT ("tv_ringshield", "5", CV_SAVE|CV_NETVAR|CV_CHEAT|CV_ALLOWLUA, chances_cons_t, NULL);
|
||||
consvar_t cv_forceshield = CVAR_INIT ("tv_forceshield", "5", CV_SAVE|CV_NETVAR|CV_CHEAT|CV_ALLOWLUA, chances_cons_t, NULL);
|
||||
consvar_t cv_bombshield = CVAR_INIT ("tv_bombshield", "5", CV_SAVE|CV_NETVAR|CV_CHEAT|CV_ALLOWLUA, chances_cons_t, NULL);
|
||||
consvar_t cv_1up = CVAR_INIT ("tv_1up", "5", CV_SAVE|CV_NETVAR|CV_CHEAT|CV_ALLOWLUA, chances_cons_t, NULL);
|
||||
consvar_t cv_eggmanbox = CVAR_INIT ("tv_eggman", "5", CV_SAVE|CV_NETVAR|CV_CHEAT|CV_ALLOWLUA, chances_cons_t, NULL);
|
||||
|
||||
consvar_t cv_ringslinger = CVAR_INIT ("ringslinger", "No", CV_NETVAR|CV_NOSHOWHELP|CV_CALL|CV_CHEAT, CV_YesNo, Ringslinger_OnChange);
|
||||
consvar_t cv_gravity = CVAR_INIT ("gravity", "0.5", CV_RESTRICT|CV_FLOAT|CV_CALL, NULL, Gravity_OnChange);
|
||||
consvar_t cv_ringslinger = CVAR_INIT ("ringslinger", "No", CV_NETVAR|CV_NOSHOWHELP|CV_CALL|CV_CHEAT|CV_ALLOWLUA, CV_YesNo, Ringslinger_OnChange);
|
||||
consvar_t cv_gravity = CVAR_INIT ("gravity", "0.5", CV_RESTRICT|CV_FLOAT|CV_CALL|CV_ALLOWLUA, NULL, Gravity_OnChange);
|
||||
|
||||
consvar_t cv_soundtest = CVAR_INIT ("soundtest", "0", CV_CALL, NULL, SoundTest_OnChange);
|
||||
|
||||
static CV_PossibleValue_t minitimelimit_cons_t[] = {{1, "MIN"}, {9999, "MAX"}, {0, NULL}};
|
||||
consvar_t cv_countdowntime = CVAR_INIT ("countdowntime", "60", CV_SAVE|CV_NETVAR|CV_CHEAT, minitimelimit_cons_t, NULL);
|
||||
consvar_t cv_countdowntime = CVAR_INIT ("countdowntime", "60", CV_SAVE|CV_NETVAR|CV_CHEAT|CV_ALLOWLUA, minitimelimit_cons_t, NULL);
|
||||
|
||||
consvar_t cv_touchtag = CVAR_INIT ("touchtag", "Off", CV_SAVE|CV_NETVAR, CV_OnOff, NULL);
|
||||
consvar_t cv_hidetime = CVAR_INIT ("hidetime", "30", CV_SAVE|CV_NETVAR|CV_CALL, minitimelimit_cons_t, Hidetime_OnChange);
|
||||
consvar_t cv_touchtag = CVAR_INIT ("touchtag", "Off", CV_SAVE|CV_NETVAR|CV_ALLOWLUA, CV_OnOff, NULL);
|
||||
consvar_t cv_hidetime = CVAR_INIT ("hidetime", "30", CV_SAVE|CV_NETVAR|CV_CALL|CV_ALLOWLUA, minitimelimit_cons_t, Hidetime_OnChange);
|
||||
|
||||
consvar_t cv_autobalance = CVAR_INIT ("autobalance", "Off", CV_SAVE|CV_NETVAR|CV_CALL, CV_OnOff, AutoBalance_OnChange);
|
||||
consvar_t cv_teamscramble = CVAR_INIT ("teamscramble", "Off", CV_SAVE|CV_NETVAR|CV_CALL|CV_NOINIT, teamscramble_cons_t, TeamScramble_OnChange);
|
||||
consvar_t cv_scrambleonchange = CVAR_INIT ("scrambleonchange", "Off", CV_SAVE|CV_NETVAR, teamscramble_cons_t, NULL);
|
||||
consvar_t cv_autobalance = CVAR_INIT ("autobalance", "Off", CV_SAVE|CV_NETVAR|CV_CALL|CV_ALLOWLUA, CV_OnOff, AutoBalance_OnChange);
|
||||
consvar_t cv_teamscramble = CVAR_INIT ("teamscramble", "Off", CV_SAVE|CV_NETVAR|CV_CALL|CV_NOINIT|CV_ALLOWLUA, teamscramble_cons_t, TeamScramble_OnChange);
|
||||
consvar_t cv_scrambleonchange = CVAR_INIT ("scrambleonchange", "Off", CV_SAVE|CV_NETVAR|CV_ALLOWLUA, teamscramble_cons_t, NULL);
|
||||
|
||||
consvar_t cv_friendlyfire = CVAR_INIT ("friendlyfire", "Off", CV_SAVE|CV_NETVAR, CV_OnOff, NULL);
|
||||
consvar_t cv_itemfinder = CVAR_INIT ("itemfinder", "Off", CV_CALL, CV_OnOff, ItemFinder_OnChange);
|
||||
consvar_t cv_friendlyfire = CVAR_INIT ("friendlyfire", "Off", CV_SAVE|CV_NETVAR|CV_ALLOWLUA, CV_OnOff, NULL);
|
||||
consvar_t cv_itemfinder = CVAR_INIT ("itemfinder", "Off", CV_CALL|CV_ALLOWLUA, CV_OnOff, ItemFinder_OnChange);
|
||||
|
||||
// Scoring type options
|
||||
consvar_t cv_overtime = CVAR_INIT ("overtime", "Yes", CV_SAVE|CV_NETVAR, CV_YesNo, NULL);
|
||||
consvar_t cv_overtime = CVAR_INIT ("overtime", "Yes", CV_SAVE|CV_NETVAR|CV_ALLOWLUA, CV_YesNo, NULL);
|
||||
|
||||
consvar_t cv_rollingdemos = CVAR_INIT ("rollingdemos", "On", CV_SAVE, CV_OnOff, NULL);
|
||||
|
||||
|
@ -315,13 +315,13 @@ static CV_PossibleValue_t powerupdisplay_cons_t[] = {{0, "Never"}, {1, "First-pe
|
|||
consvar_t cv_powerupdisplay = CVAR_INIT ("powerupdisplay", "First-person only", CV_SAVE, powerupdisplay_cons_t, NULL);
|
||||
|
||||
static CV_PossibleValue_t pointlimit_cons_t[] = {{1, "MIN"}, {MAXSCORE, "MAX"}, {0, "None"}, {0, NULL}};
|
||||
consvar_t cv_pointlimit = CVAR_INIT ("pointlimit", "None", CV_SAVE|CV_NETVAR|CV_CALL|CV_NOINIT, pointlimit_cons_t, PointLimit_OnChange);
|
||||
consvar_t cv_pointlimit = CVAR_INIT ("pointlimit", "None", CV_SAVE|CV_NETVAR|CV_CALL|CV_NOINIT|CV_ALLOWLUA, pointlimit_cons_t, PointLimit_OnChange);
|
||||
static CV_PossibleValue_t timelimit_cons_t[] = {{1, "MIN"}, {30, "MAX"}, {0, "None"}, {0, NULL}};
|
||||
consvar_t cv_timelimit = CVAR_INIT ("timelimit", "None", CV_SAVE|CV_NETVAR|CV_CALL|CV_NOINIT, timelimit_cons_t, TimeLimit_OnChange);
|
||||
consvar_t cv_timelimit = CVAR_INIT ("timelimit", "None", CV_SAVE|CV_NETVAR|CV_CALL|CV_NOINIT|CV_ALLOWLUA, timelimit_cons_t, TimeLimit_OnChange);
|
||||
static CV_PossibleValue_t numlaps_cons_t[] = {{1, "MIN"}, {50, "MAX"}, {0, NULL}};
|
||||
consvar_t cv_numlaps = CVAR_INIT ("numlaps", "4", CV_NETVAR|CV_CALL|CV_NOINIT, numlaps_cons_t, NumLaps_OnChange);
|
||||
consvar_t cv_numlaps = CVAR_INIT ("numlaps", "4", CV_NETVAR|CV_CALL|CV_NOINIT|CV_ALLOWLUA, numlaps_cons_t, NumLaps_OnChange);
|
||||
static CV_PossibleValue_t basenumlaps_cons_t[] = {{1, "MIN"}, {50, "MAX"}, {0, "Map default"}, {0, NULL}};
|
||||
consvar_t cv_basenumlaps = CVAR_INIT ("basenumlaps", "Map default", CV_SAVE|CV_NETVAR|CV_CALL|CV_CHEAT, basenumlaps_cons_t, BaseNumLaps_OnChange);
|
||||
consvar_t cv_basenumlaps = CVAR_INIT ("basenumlaps", "Map default", CV_SAVE|CV_NETVAR|CV_CALL|CV_CHEAT|CV_ALLOWLUA, basenumlaps_cons_t, BaseNumLaps_OnChange);
|
||||
|
||||
// Point and time limits for every gametype
|
||||
INT32 pointlimits[NUMGAMETYPES];
|
||||
|
@ -330,11 +330,11 @@ INT32 timelimits[NUMGAMETYPES];
|
|||
// log elemental hazards -- not a netvar, is local to current player
|
||||
consvar_t cv_hazardlog = CVAR_INIT ("hazardlog", "Yes", 0, CV_YesNo, NULL);
|
||||
|
||||
consvar_t cv_forceskin = CVAR_INIT ("forceskin", "None", CV_NETVAR|CV_CALL|CV_CHEAT, NULL, ForceSkin_OnChange);
|
||||
consvar_t cv_forceskin = CVAR_INIT ("forceskin", "None", CV_NETVAR|CV_CALL|CV_CHEAT|CV_ALLOWLUA, NULL, ForceSkin_OnChange);
|
||||
consvar_t cv_downloading = CVAR_INIT ("downloading", "On", 0, CV_OnOff, NULL);
|
||||
consvar_t cv_allowexitlevel = CVAR_INIT ("allowexitlevel", "No", CV_SAVE|CV_NETVAR, CV_YesNo, NULL);
|
||||
consvar_t cv_allowexitlevel = CVAR_INIT ("allowexitlevel", "No", CV_SAVE|CV_NETVAR|CV_ALLOWLUA, CV_YesNo, NULL);
|
||||
|
||||
consvar_t cv_killingdead = CVAR_INIT ("killingdead", "Off", CV_NETVAR, CV_OnOff, NULL);
|
||||
consvar_t cv_killingdead = CVAR_INIT ("killingdead", "Off", CV_NETVAR|CV_ALLOWLUA, CV_OnOff, NULL);
|
||||
|
||||
consvar_t cv_netstat = CVAR_INIT ("netstat", "Off", 0, CV_OnOff, NULL); // show bandwidth statistics
|
||||
static CV_PossibleValue_t nettimeout_cons_t[] = {{TICRATE/7, "MIN"}, {60*TICRATE, "MAX"}, {0, NULL}};
|
||||
|
@ -352,26 +352,26 @@ consvar_t cv_showping = CVAR_INIT ("showping", "Warning", CV_SAVE, showping_cons
|
|||
|
||||
// Intermission time Tails 04-19-2002
|
||||
static CV_PossibleValue_t inttime_cons_t[] = {{0, "MIN"}, {3600, "MAX"}, {0, NULL}};
|
||||
consvar_t cv_inttime = CVAR_INIT ("inttime", "10", CV_SAVE|CV_NETVAR, inttime_cons_t, NULL);
|
||||
consvar_t cv_inttime = CVAR_INIT ("inttime", "10", CV_SAVE|CV_NETVAR|CV_ALLOWLUA, inttime_cons_t, NULL);
|
||||
|
||||
static CV_PossibleValue_t coopstarposts_cons_t[] = {{0, "Per-player"}, {1, "Shared"}, {2, "Teamwork"}, {0, NULL}};
|
||||
consvar_t cv_coopstarposts = CVAR_INIT ("coopstarposts", "Per-player", CV_SAVE|CV_NETVAR|CV_CALL, coopstarposts_cons_t, CoopStarposts_OnChange);
|
||||
consvar_t cv_coopstarposts = CVAR_INIT ("coopstarposts", "Per-player", CV_SAVE|CV_NETVAR|CV_CALL|CV_ALLOWLUA, coopstarposts_cons_t, CoopStarposts_OnChange);
|
||||
|
||||
static CV_PossibleValue_t cooplives_cons_t[] = {{0, "Infinite"}, {1, "Per-player"}, {2, "Avoid Game Over"}, {3, "Single pool"}, {0, NULL}};
|
||||
consvar_t cv_cooplives = CVAR_INIT ("cooplives", "Avoid Game Over", CV_SAVE|CV_NETVAR|CV_CALL|CV_CHEAT, cooplives_cons_t, CoopLives_OnChange);
|
||||
consvar_t cv_cooplives = CVAR_INIT ("cooplives", "Avoid Game Over", CV_SAVE|CV_NETVAR|CV_CALL|CV_CHEAT|CV_ALLOWLUA, cooplives_cons_t, CoopLives_OnChange);
|
||||
|
||||
static CV_PossibleValue_t advancemap_cons_t[] = {{0, "Off"}, {1, "Next"}, {2, "Random"}, {0, NULL}};
|
||||
consvar_t cv_advancemap = CVAR_INIT ("advancemap", "Next", CV_SAVE|CV_NETVAR, advancemap_cons_t, NULL);
|
||||
consvar_t cv_advancemap = CVAR_INIT ("advancemap", "Next", CV_SAVE|CV_NETVAR|CV_ALLOWLUA, advancemap_cons_t, NULL);
|
||||
|
||||
static CV_PossibleValue_t playersforexit_cons_t[] = {{0, "One"}, {1, "1/4"}, {2, "Half"}, {3, "3/4"}, {4, "All"}, {0, NULL}};
|
||||
consvar_t cv_playersforexit = CVAR_INIT ("playersforexit", "All", CV_SAVE|CV_NETVAR, playersforexit_cons_t, NULL);
|
||||
consvar_t cv_playersforexit = CVAR_INIT ("playersforexit", "All", CV_SAVE|CV_NETVAR|CV_ALLOWLUA, playersforexit_cons_t, NULL);
|
||||
|
||||
consvar_t cv_exitmove = CVAR_INIT ("exitmove", "On", CV_SAVE|CV_NETVAR|CV_CALL, CV_OnOff, ExitMove_OnChange);
|
||||
consvar_t cv_exitmove = CVAR_INIT ("exitmove", "On", CV_SAVE|CV_NETVAR|CV_CALL|CV_ALLOWLUA, CV_OnOff, ExitMove_OnChange);
|
||||
|
||||
consvar_t cv_runscripts = CVAR_INIT ("runscripts", "Yes", 0, CV_YesNo, NULL);
|
||||
consvar_t cv_runscripts = CVAR_INIT ("runscripts", "Yes", CV_ALLOWLUA, CV_YesNo, NULL);
|
||||
|
||||
consvar_t cv_pause = CVAR_INIT ("pausepermission", "Server", CV_SAVE|CV_NETVAR, pause_cons_t, NULL);
|
||||
consvar_t cv_mute = CVAR_INIT ("mute", "Off", CV_NETVAR|CV_CALL, CV_OnOff, Mute_OnChange);
|
||||
consvar_t cv_pause = CVAR_INIT ("pausepermission", "Server", CV_SAVE|CV_NETVAR|CV_ALLOWLUA, pause_cons_t, NULL);
|
||||
consvar_t cv_mute = CVAR_INIT ("mute", "Off", CV_NETVAR|CV_CALL|CV_ALLOWLUA, CV_OnOff, Mute_OnChange);
|
||||
|
||||
consvar_t cv_sleep = CVAR_INIT ("cpusleep", "1", CV_SAVE, sleeping_cons_t, NULL);
|
||||
|
||||
|
@ -464,57 +464,57 @@ void D_RegisterServerCommands(void)
|
|||
RegisterNetXCmd(XD_LUAFILE, Got_LuaFile);
|
||||
|
||||
// Remote Administration
|
||||
COM_AddCommand("password", Command_Changepassword_f);
|
||||
COM_AddCommand("login", Command_Login_f); // useful in dedicated to kick off remote admin
|
||||
COM_AddCommand("promote", Command_Verify_f);
|
||||
COM_AddCommand("password", Command_Changepassword_f, COM_LUA);
|
||||
COM_AddCommand("login", Command_Login_f, COM_LUA); // useful in dedicated to kick off remote admin
|
||||
COM_AddCommand("promote", Command_Verify_f, COM_LUA);
|
||||
RegisterNetXCmd(XD_VERIFIED, Got_Verification);
|
||||
COM_AddCommand("demote", Command_RemoveAdmin_f);
|
||||
COM_AddCommand("demote", Command_RemoveAdmin_f, COM_LUA);
|
||||
RegisterNetXCmd(XD_DEMOTED, Got_Removal);
|
||||
|
||||
COM_AddCommand("motd", Command_MotD_f);
|
||||
COM_AddCommand("motd", Command_MotD_f, COM_LUA);
|
||||
RegisterNetXCmd(XD_SETMOTD, Got_MotD_f); // For remote admin
|
||||
|
||||
RegisterNetXCmd(XD_TEAMCHANGE, Got_Teamchange);
|
||||
COM_AddCommand("serverchangeteam", Command_ServerTeamChange_f);
|
||||
COM_AddCommand("serverchangeteam", Command_ServerTeamChange_f, COM_LUA);
|
||||
|
||||
RegisterNetXCmd(XD_CLEARSCORES, Got_Clearscores);
|
||||
COM_AddCommand("clearscores", Command_Clearscores_f);
|
||||
COM_AddCommand("map", Command_Map_f);
|
||||
COM_AddCommand("clearscores", Command_Clearscores_f, COM_LUA);
|
||||
COM_AddCommand("map", Command_Map_f, COM_LUA);
|
||||
|
||||
COM_AddCommand("exitgame", Command_ExitGame_f);
|
||||
COM_AddCommand("retry", Command_Retry_f);
|
||||
COM_AddCommand("exitlevel", Command_ExitLevel_f);
|
||||
COM_AddCommand("showmap", Command_Showmap_f);
|
||||
COM_AddCommand("mapmd5", Command_Mapmd5_f);
|
||||
COM_AddCommand("exitgame", Command_ExitGame_f, COM_LUA);
|
||||
COM_AddCommand("retry", Command_Retry_f, COM_LUA);
|
||||
COM_AddCommand("exitlevel", Command_ExitLevel_f, COM_LUA);
|
||||
COM_AddCommand("showmap", Command_Showmap_f, COM_LUA);
|
||||
COM_AddCommand("mapmd5", Command_Mapmd5_f, COM_LUA);
|
||||
|
||||
COM_AddCommand("addfolder", Command_Addfolder);
|
||||
COM_AddCommand("addfile", Command_Addfile);
|
||||
COM_AddCommand("listwad", Command_ListWADS_f);
|
||||
COM_AddCommand("addfolder", Command_Addfolder, COM_LUA);
|
||||
COM_AddCommand("addfile", Command_Addfile, COM_LUA);
|
||||
COM_AddCommand("listwad", Command_ListWADS_f, COM_LUA);
|
||||
|
||||
COM_AddCommand("runsoc", Command_RunSOC);
|
||||
COM_AddCommand("pause", Command_Pause);
|
||||
COM_AddCommand("suicide", Command_Suicide);
|
||||
COM_AddCommand("runsoc", Command_RunSOC, COM_LUA);
|
||||
COM_AddCommand("pause", Command_Pause, COM_LUA);
|
||||
COM_AddCommand("suicide", Command_Suicide, COM_LUA);
|
||||
|
||||
COM_AddCommand("gametype", Command_ShowGametype_f);
|
||||
COM_AddCommand("version", Command_Version_f);
|
||||
COM_AddCommand("gametype", Command_ShowGametype_f, COM_LUA);
|
||||
COM_AddCommand("version", Command_Version_f, COM_LUA);
|
||||
#ifdef UPDATE_ALERT
|
||||
COM_AddCommand("mod_details", Command_ModDetails_f);
|
||||
COM_AddCommand("mod_details", Command_ModDetails_f, COM_LUA);
|
||||
#endif
|
||||
COM_AddCommand("quit", Command_Quit_f);
|
||||
COM_AddCommand("quit", Command_Quit_f, COM_LUA);
|
||||
|
||||
COM_AddCommand("saveconfig", Command_SaveConfig_f);
|
||||
COM_AddCommand("loadconfig", Command_LoadConfig_f);
|
||||
COM_AddCommand("changeconfig", Command_ChangeConfig_f);
|
||||
COM_AddCommand("isgamemodified", Command_Isgamemodified_f); // test
|
||||
COM_AddCommand("showscores", Command_ShowScores_f);
|
||||
COM_AddCommand("showtime", Command_ShowTime_f);
|
||||
COM_AddCommand("cheats", Command_Cheats_f); // test
|
||||
COM_AddCommand("saveconfig", Command_SaveConfig_f, 0);
|
||||
COM_AddCommand("loadconfig", Command_LoadConfig_f, 0);
|
||||
COM_AddCommand("changeconfig", Command_ChangeConfig_f, 0);
|
||||
COM_AddCommand("isgamemodified", Command_Isgamemodified_f, COM_LUA); // test
|
||||
COM_AddCommand("showscores", Command_ShowScores_f, COM_LUA);
|
||||
COM_AddCommand("showtime", Command_ShowTime_f, COM_LUA);
|
||||
COM_AddCommand("cheats", Command_Cheats_f, COM_LUA); // test
|
||||
#ifdef _DEBUG
|
||||
COM_AddCommand("togglemodified", Command_Togglemodified_f);
|
||||
COM_AddCommand("archivetest", Command_Archivetest_f);
|
||||
COM_AddCommand("togglemodified", Command_Togglemodified_f, COM_LUA);
|
||||
COM_AddCommand("archivetest", Command_Archivetest_f, COM_LUA);
|
||||
#endif
|
||||
|
||||
COM_AddCommand("downloads", Command_Downloads_f);
|
||||
COM_AddCommand("downloads", Command_Downloads_f, COM_LUA);
|
||||
|
||||
// for master server connection
|
||||
AddMServCommands();
|
||||
|
@ -601,7 +601,7 @@ void D_RegisterServerCommands(void)
|
|||
CV_RegisterVar(&cv_blamecfail);
|
||||
#endif
|
||||
|
||||
COM_AddCommand("ping", Command_Ping_f);
|
||||
COM_AddCommand("ping", Command_Ping_f, COM_LUA);
|
||||
CV_RegisterVar(&cv_nettimeout);
|
||||
CV_RegisterVar(&cv_jointimeout);
|
||||
|
||||
|
@ -613,6 +613,10 @@ void D_RegisterServerCommands(void)
|
|||
|
||||
CV_RegisterVar(&cv_allowseenames);
|
||||
|
||||
// Other filesrch.c consvars are defined in D_RegisterClientCommands
|
||||
CV_RegisterVar(&cv_addons_option);
|
||||
CV_RegisterVar(&cv_addons_folder);
|
||||
|
||||
CV_RegisterVar(&cv_dummyconsvar);
|
||||
}
|
||||
|
||||
|
@ -645,25 +649,25 @@ void D_RegisterClientCommands(void)
|
|||
if (dedicated)
|
||||
return;
|
||||
|
||||
COM_AddCommand("numthinkers", Command_Numthinkers_f);
|
||||
COM_AddCommand("countmobjs", Command_CountMobjs_f);
|
||||
COM_AddCommand("numthinkers", Command_Numthinkers_f, COM_LUA);
|
||||
COM_AddCommand("countmobjs", Command_CountMobjs_f, COM_LUA);
|
||||
|
||||
COM_AddCommand("changeteam", Command_Teamchange_f);
|
||||
COM_AddCommand("changeteam2", Command_Teamchange2_f);
|
||||
COM_AddCommand("changeteam", Command_Teamchange_f, COM_LUA);
|
||||
COM_AddCommand("changeteam2", Command_Teamchange2_f, COM_LUA);
|
||||
|
||||
COM_AddCommand("playdemo", Command_Playdemo_f);
|
||||
COM_AddCommand("timedemo", Command_Timedemo_f);
|
||||
COM_AddCommand("stopdemo", Command_Stopdemo_f);
|
||||
COM_AddCommand("playintro", Command_Playintro_f);
|
||||
COM_AddCommand("playdemo", Command_Playdemo_f, 0);
|
||||
COM_AddCommand("timedemo", Command_Timedemo_f, 0);
|
||||
COM_AddCommand("stopdemo", Command_Stopdemo_f, COM_LUA);
|
||||
COM_AddCommand("playintro", Command_Playintro_f, COM_LUA);
|
||||
|
||||
COM_AddCommand("resetcamera", Command_ResetCamera_f);
|
||||
COM_AddCommand("resetcamera", Command_ResetCamera_f, COM_LUA);
|
||||
|
||||
COM_AddCommand("setcontrol", Command_Setcontrol_f);
|
||||
COM_AddCommand("setcontrol2", Command_Setcontrol2_f);
|
||||
COM_AddCommand("setcontrol", Command_Setcontrol_f, 0);
|
||||
COM_AddCommand("setcontrol2", Command_Setcontrol2_f, 0);
|
||||
|
||||
COM_AddCommand("screenshot", M_ScreenShot);
|
||||
COM_AddCommand("startmovie", Command_StartMovie_f);
|
||||
COM_AddCommand("stopmovie", Command_StopMovie_f);
|
||||
COM_AddCommand("screenshot", M_ScreenShot, COM_LUA);
|
||||
COM_AddCommand("startmovie", Command_StartMovie_f, COM_LUA);
|
||||
COM_AddCommand("stopmovie", Command_StopMovie_f, COM_LUA);
|
||||
|
||||
CV_RegisterVar(&cv_screenshot_option);
|
||||
CV_RegisterVar(&cv_screenshot_folder);
|
||||
|
@ -725,7 +729,7 @@ void D_RegisterClientCommands(void)
|
|||
CV_RegisterVar(&cv_ghost_last);
|
||||
CV_RegisterVar(&cv_ghost_guest);
|
||||
|
||||
COM_AddCommand("displayplayer", Command_Displayplayer_f);
|
||||
COM_AddCommand("displayplayer", Command_Displayplayer_f, COM_LUA);
|
||||
|
||||
// FIXME: not to be here.. but needs be done for config loading
|
||||
CV_RegisterVar(&cv_globalgamma);
|
||||
|
@ -794,8 +798,8 @@ void D_RegisterClientCommands(void)
|
|||
CV_RegisterVar(&cv_digitaldeadzone2);
|
||||
|
||||
// filesrch.c
|
||||
CV_RegisterVar(&cv_addons_option);
|
||||
CV_RegisterVar(&cv_addons_folder);
|
||||
//CV_RegisterVar(&cv_addons_option); // These two are now defined
|
||||
//CV_RegisterVar(&cv_addons_folder); // in D_RegisterServerCommands
|
||||
CV_RegisterVar(&cv_addons_md5);
|
||||
CV_RegisterVar(&cv_addons_showall);
|
||||
CV_RegisterVar(&cv_addons_search_type);
|
||||
|
@ -869,6 +873,9 @@ void D_RegisterClientCommands(void)
|
|||
// screen.c
|
||||
CV_RegisterVar(&cv_fullscreen);
|
||||
CV_RegisterVar(&cv_renderview);
|
||||
CV_RegisterVar(&cv_renderhitboxinterpolation);
|
||||
CV_RegisterVar(&cv_renderhitboxgldepth);
|
||||
CV_RegisterVar(&cv_renderhitbox);
|
||||
CV_RegisterVar(&cv_renderer);
|
||||
CV_RegisterVar(&cv_scr_depth);
|
||||
CV_RegisterVar(&cv_scr_width);
|
||||
|
@ -883,7 +890,7 @@ void D_RegisterClientCommands(void)
|
|||
CV_RegisterVar(&cv_ps_descriptor);
|
||||
|
||||
// ingame object placing
|
||||
COM_AddCommand("objectplace", Command_ObjectPlace_f);
|
||||
COM_AddCommand("objectplace", Command_ObjectPlace_f, COM_LUA);
|
||||
//COM_AddCommand("writethings", Command_Writethings_f);
|
||||
CV_RegisterVar(&cv_speed);
|
||||
CV_RegisterVar(&cv_opflags);
|
||||
|
@ -895,32 +902,32 @@ void D_RegisterClientCommands(void)
|
|||
CV_RegisterVar(&cv_freedemocamera);
|
||||
|
||||
// add cheat commands
|
||||
COM_AddCommand("noclip", Command_CheatNoClip_f);
|
||||
COM_AddCommand("god", Command_CheatGod_f);
|
||||
COM_AddCommand("notarget", Command_CheatNoTarget_f);
|
||||
COM_AddCommand("getallemeralds", Command_Getallemeralds_f);
|
||||
COM_AddCommand("resetemeralds", Command_Resetemeralds_f);
|
||||
COM_AddCommand("setrings", Command_Setrings_f);
|
||||
COM_AddCommand("setlives", Command_Setlives_f);
|
||||
COM_AddCommand("setcontinues", Command_Setcontinues_f);
|
||||
COM_AddCommand("devmode", Command_Devmode_f);
|
||||
COM_AddCommand("savecheckpoint", Command_Savecheckpoint_f);
|
||||
COM_AddCommand("scale", Command_Scale_f);
|
||||
COM_AddCommand("gravflip", Command_Gravflip_f);
|
||||
COM_AddCommand("hurtme", Command_Hurtme_f);
|
||||
COM_AddCommand("jumptoaxis", Command_JumpToAxis_f);
|
||||
COM_AddCommand("charability", Command_Charability_f);
|
||||
COM_AddCommand("charspeed", Command_Charspeed_f);
|
||||
COM_AddCommand("teleport", Command_Teleport_f);
|
||||
COM_AddCommand("rteleport", Command_RTeleport_f);
|
||||
COM_AddCommand("skynum", Command_Skynum_f);
|
||||
COM_AddCommand("weather", Command_Weather_f);
|
||||
COM_AddCommand("toggletwod", Command_Toggletwod_f);
|
||||
COM_AddCommand("noclip", Command_CheatNoClip_f, COM_LUA);
|
||||
COM_AddCommand("god", Command_CheatGod_f, COM_LUA);
|
||||
COM_AddCommand("notarget", Command_CheatNoTarget_f, COM_LUA);
|
||||
COM_AddCommand("getallemeralds", Command_Getallemeralds_f, COM_LUA);
|
||||
COM_AddCommand("resetemeralds", Command_Resetemeralds_f, COM_LUA);
|
||||
COM_AddCommand("setrings", Command_Setrings_f, COM_LUA);
|
||||
COM_AddCommand("setlives", Command_Setlives_f, COM_LUA);
|
||||
COM_AddCommand("setcontinues", Command_Setcontinues_f, COM_LUA);
|
||||
COM_AddCommand("devmode", Command_Devmode_f, COM_LUA);
|
||||
COM_AddCommand("savecheckpoint", Command_Savecheckpoint_f, COM_LUA);
|
||||
COM_AddCommand("scale", Command_Scale_f, COM_LUA);
|
||||
COM_AddCommand("gravflip", Command_Gravflip_f, COM_LUA);
|
||||
COM_AddCommand("hurtme", Command_Hurtme_f, COM_LUA);
|
||||
COM_AddCommand("jumptoaxis", Command_JumpToAxis_f, COM_LUA);
|
||||
COM_AddCommand("charability", Command_Charability_f, COM_LUA);
|
||||
COM_AddCommand("charspeed", Command_Charspeed_f, COM_LUA);
|
||||
COM_AddCommand("teleport", Command_Teleport_f, COM_LUA);
|
||||
COM_AddCommand("rteleport", Command_RTeleport_f, COM_LUA);
|
||||
COM_AddCommand("skynum", Command_Skynum_f, COM_LUA);
|
||||
COM_AddCommand("weather", Command_Weather_f, COM_LUA);
|
||||
COM_AddCommand("toggletwod", Command_Toggletwod_f, COM_LUA);
|
||||
#ifdef _DEBUG
|
||||
COM_AddCommand("causecfail", Command_CauseCfail_f);
|
||||
COM_AddCommand("causecfail", Command_CauseCfail_f, COM_LUA);
|
||||
#endif
|
||||
#ifdef LUA_ALLOW_BYTECODE
|
||||
COM_AddCommand("dumplua", Command_Dumplua_f);
|
||||
COM_AddCommand("dumplua", Command_Dumplua_f, COM_LUA);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -1880,7 +1887,7 @@ static void Command_Map_f(void)
|
|||
const char *gametypename;
|
||||
boolean newresetplayers;
|
||||
|
||||
boolean mustmodifygame;
|
||||
boolean wouldSetCheats;
|
||||
|
||||
INT32 newmapnum;
|
||||
|
||||
|
@ -1901,11 +1908,11 @@ static void Command_Map_f(void)
|
|||
option_gametype = COM_CheckPartialParm("-g");
|
||||
newresetplayers = ! COM_CheckParm("-noresetplayers");
|
||||
|
||||
mustmodifygame =
|
||||
!( netgame || multiplayer ) &&
|
||||
(!modifiedgame || savemoddata );
|
||||
wouldSetCheats =
|
||||
!( netgame || multiplayer ) &&
|
||||
!( usedCheats );
|
||||
|
||||
if (mustmodifygame && !option_force)
|
||||
if (wouldSetCheats && !option_force)
|
||||
{
|
||||
/* May want to be more descriptive? */
|
||||
CONS_Printf(M_GetText("Sorry, level change disabled in single player.\n"));
|
||||
|
@ -1959,9 +1966,9 @@ static void Command_Map_f(void)
|
|||
return;
|
||||
}
|
||||
|
||||
if (mustmodifygame && option_force)
|
||||
if (wouldSetCheats && option_force)
|
||||
{
|
||||
G_SetGameModified(false);
|
||||
G_SetUsedCheats(false);
|
||||
}
|
||||
|
||||
// new gametype value
|
||||
|
@ -2034,7 +2041,7 @@ static void Command_Map_f(void)
|
|||
// ... unless you're in a dedicated server. Yes, technically this means you can view any level by
|
||||
// running a dedicated server and joining it yourself, but that's better than making dedicated server's
|
||||
// lives hell.
|
||||
if (!dedicated && M_MapLocked(newmapnum))
|
||||
if (!dedicated && M_MapLocked(newmapnum, serverGamedata))
|
||||
{
|
||||
CONS_Alert(CONS_NOTICE, M_GetText("You need to unlock this level before you can warp to it!\n"));
|
||||
Z_Free(realmapname);
|
||||
|
@ -3943,18 +3950,12 @@ void ItemFinder_OnChange(void)
|
|||
if (!cv_itemfinder.value)
|
||||
return; // it's fine.
|
||||
|
||||
if (!M_SecretUnlocked(SECRET_ITEMFINDER))
|
||||
if (!M_SecretUnlocked(SECRET_ITEMFINDER, clientGamedata))
|
||||
{
|
||||
CONS_Printf(M_GetText("You haven't earned this yet.\n"));
|
||||
CV_StealthSetValue(&cv_itemfinder, 0);
|
||||
return;
|
||||
}
|
||||
else if (netgame || multiplayer)
|
||||
{
|
||||
CONS_Printf(M_GetText("This only works in single player.\n"));
|
||||
CV_StealthSetValue(&cv_itemfinder, 0);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/** Deals with a pointlimit change by printing the change to the console.
|
||||
|
@ -4303,7 +4304,7 @@ void D_GameTypeChanged(INT32 lastgametype)
|
|||
|
||||
static void Ringslinger_OnChange(void)
|
||||
{
|
||||
if (!M_SecretUnlocked(SECRET_PANDORA) && !netgame && cv_ringslinger.value && !cv_debug)
|
||||
if (!M_SecretUnlocked(SECRET_PANDORA, serverGamedata) && !netgame && cv_ringslinger.value && !cv_debug)
|
||||
{
|
||||
CONS_Printf(M_GetText("You haven't earned this yet.\n"));
|
||||
CV_StealthSetValue(&cv_ringslinger, 0);
|
||||
|
@ -4311,12 +4312,12 @@ static void Ringslinger_OnChange(void)
|
|||
}
|
||||
|
||||
if (cv_ringslinger.value) // Only if it's been turned on
|
||||
G_SetGameModified(multiplayer);
|
||||
G_SetUsedCheats(false);
|
||||
}
|
||||
|
||||
static void Gravity_OnChange(void)
|
||||
{
|
||||
if (!M_SecretUnlocked(SECRET_PANDORA) && !netgame && !cv_debug
|
||||
if (!M_SecretUnlocked(SECRET_PANDORA, serverGamedata) && !netgame && !cv_debug
|
||||
&& strcmp(cv_gravity.string, cv_gravity.defaultvalue))
|
||||
{
|
||||
CONS_Printf(M_GetText("You haven't earned this yet.\n"));
|
||||
|
@ -4332,7 +4333,7 @@ static void Gravity_OnChange(void)
|
|||
#endif
|
||||
|
||||
if (!CV_IsSetToDefault(&cv_gravity))
|
||||
G_SetGameModified(multiplayer);
|
||||
G_SetUsedCheats(false);
|
||||
gravity = cv_gravity.value;
|
||||
}
|
||||
|
||||
|
@ -4613,6 +4614,7 @@ void Command_ExitGame_f(void)
|
|||
botskin = 0;
|
||||
cv_debug = 0;
|
||||
emeralds = 0;
|
||||
automapactive = false;
|
||||
memset(&luabanks, 0, sizeof(luabanks));
|
||||
|
||||
if (dirmenu)
|
||||
|
@ -4648,7 +4650,7 @@ static void Fishcake_OnChange(void)
|
|||
// so don't make modifiedgame always on!
|
||||
if (cv_debug)
|
||||
{
|
||||
G_SetGameModified(multiplayer);
|
||||
G_SetUsedCheats(false);
|
||||
}
|
||||
|
||||
else if (cv_debug != cv_fishcake.value)
|
||||
|
@ -4665,11 +4667,11 @@ static void Fishcake_OnChange(void)
|
|||
static void Command_Isgamemodified_f(void)
|
||||
{
|
||||
if (savemoddata)
|
||||
CONS_Printf(M_GetText("modifiedgame is true, but you can save emblem and time data in this mod.\n"));
|
||||
CONS_Printf(M_GetText("modifiedgame is true, but you can save time data in this mod.\n"));
|
||||
else if (modifiedgame)
|
||||
CONS_Printf(M_GetText("modifiedgame is true, extras will not be unlocked\n"));
|
||||
CONS_Printf(M_GetText("modifiedgame is true, time data can't be saved\n"));
|
||||
else
|
||||
CONS_Printf(M_GetText("modifiedgame is false, you can unlock extras\n"));
|
||||
CONS_Printf(M_GetText("modifiedgame is false, you can save time data\n"));
|
||||
}
|
||||
|
||||
static void Command_Cheats_f(void)
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
@ -249,6 +249,38 @@ typedef enum
|
|||
CR_FAN
|
||||
} carrytype_t; // pw_carry
|
||||
|
||||
typedef enum
|
||||
{
|
||||
STR_NONE = 0, // All strong powers can stack onto each other
|
||||
|
||||
// Attack powers
|
||||
STR_ANIM = 0x1, // remove powers when leaving current animation
|
||||
STR_PUNCH = 0x2, // frontal attack (knuckles glide)
|
||||
STR_TAIL = 0x4, // rear attack
|
||||
STR_STOMP = 0x8, // falling onto object (fang bounce)
|
||||
STR_UPPER = 0x10, // moving upwards into object (tails fly)
|
||||
STR_GUARD = 0x20, //protect against damage
|
||||
STR_HEAVY = 0x40, // ignore vertical rebound
|
||||
STR_DASH = 0x80, // special type for machine dashmode, automatically removes your powers when leaving dashmode
|
||||
|
||||
// Environment powers
|
||||
STR_WALL = 0x100, // fof busting
|
||||
STR_FLOOR = 0x200,
|
||||
STR_CEILING = 0x400,
|
||||
STR_SPRING = 0x800, // power up hit springs
|
||||
STR_SPIKE = 0x1000, // break spikes
|
||||
|
||||
// Shortcuts
|
||||
STR_ATTACK = STR_PUNCH|STR_TAIL|STR_STOMP|STR_UPPER,
|
||||
STR_BUST = STR_WALL|STR_FLOOR|STR_CEILING,
|
||||
STR_FLY = STR_ANIM|STR_UPPER,
|
||||
STR_GLIDE = STR_ANIM|STR_PUNCH,
|
||||
STR_TWINSPIN = STR_ANIM|STR_ATTACK|STR_BUST|STR_SPRING|STR_SPIKE,
|
||||
STR_MELEE = STR_ANIM|STR_PUNCH|STR_HEAVY|STR_WALL|STR_FLOOR|STR_SPRING|STR_SPIKE,
|
||||
STR_BOUNCE = STR_ANIM|STR_STOMP|STR_FLOOR,
|
||||
STR_METAL = STR_DASH|STR_SPIKE
|
||||
} strongtype_t; // pw_strong
|
||||
|
||||
// Player powers. (don't edit this comment)
|
||||
typedef enum
|
||||
{
|
||||
|
@ -293,6 +325,8 @@ typedef enum
|
|||
|
||||
pw_ignorelatch, // Don't grab onto CR_GENERIC, add 32768 (powers[pw_ignorelatch] & 1<<15) to avoid ALL not-NiGHTS CR_ types
|
||||
|
||||
pw_strong, // Additional properties for powerful attacks
|
||||
|
||||
NUMPOWERS
|
||||
} powertype_t;
|
||||
|
||||
|
@ -407,6 +441,7 @@ typedef struct player_s
|
|||
|
||||
// playing animation.
|
||||
panim_t panim;
|
||||
UINT8 stronganim;
|
||||
|
||||
// For screen flashing (bright).
|
||||
UINT16 flashcount;
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
|
176
src/deh_lua.c
176
src/deh_lua.c
|
@ -1,7 +1,7 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
@ -10,20 +10,7 @@
|
|||
/// \file deh_lua.c
|
||||
/// \brief Lua SOC library
|
||||
|
||||
#include "g_game.h"
|
||||
#include "s_sound.h"
|
||||
#include "z_zone.h"
|
||||
#include "m_menu.h"
|
||||
#include "m_misc.h"
|
||||
#include "p_local.h"
|
||||
#include "st_stuff.h"
|
||||
#include "fastcmp.h"
|
||||
#include "lua_script.h"
|
||||
#include "lua_libs.h"
|
||||
|
||||
#include "dehacked.h"
|
||||
#include "deh_lua.h"
|
||||
#include "deh_tables.h"
|
||||
|
||||
// freeslot takes a name (string only!)
|
||||
// and allocates it to the appropriate free slot.
|
||||
|
@ -89,6 +76,8 @@ static inline int lib_freeslot(lua_State *L)
|
|||
strncpy(sprnames[j],word,4);
|
||||
//sprnames[j][4] = 0;
|
||||
used_spr[(j-SPR_FIRSTFREESLOT)/8] |= 1<<(j%8); // Okay, this sprite slot has been named now.
|
||||
// Lua needs to update the value in _G if it exists
|
||||
LUA_UpdateSprName(word, j);
|
||||
lua_pushinteger(L, j);
|
||||
r++;
|
||||
break;
|
||||
|
@ -188,6 +177,9 @@ static inline int lib_freeslot(lua_State *L)
|
|||
lua_remove(L, 1);
|
||||
continue;
|
||||
}
|
||||
|
||||
R_RefreshSprite2();
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
|
@ -216,18 +208,27 @@ static int lib_dummysuper(lua_State *L)
|
|||
return luaL_error(L, "Can't call super() outside of hardcode-replacing A_Action functions being called by state changes!"); // convoluted, I know. @_@;;
|
||||
}
|
||||
|
||||
static inline int lib_getenum(lua_State *L)
|
||||
static void CacheAndPushConstant(lua_State *L, const char *name, lua_Integer value)
|
||||
{
|
||||
const char *word, *p;
|
||||
// "cache" into _G
|
||||
lua_pushstring(L, name);
|
||||
lua_pushinteger(L, value);
|
||||
lua_rawset(L, LUA_GLOBALSINDEX);
|
||||
// push
|
||||
lua_pushinteger(L, value);
|
||||
}
|
||||
|
||||
// Search for a matching constant variable.
|
||||
// Result is stored into _G for faster subsequent use. (Except for SPR_ in the SOC parser)
|
||||
static int ScanConstants(lua_State *L, boolean mathlib, const char *word)
|
||||
{
|
||||
const char *p;
|
||||
fixed_t i;
|
||||
boolean mathlib = lua_toboolean(L, lua_upvalueindex(1));
|
||||
if (lua_type(L,2) != LUA_TSTRING)
|
||||
return 0;
|
||||
word = lua_tostring(L,2);
|
||||
|
||||
if (strlen(word) == 1) { // Assume sprite frame if length 1.
|
||||
if (*word >= 'A' && *word <= '~')
|
||||
{
|
||||
lua_pushinteger(L, *word-'A');
|
||||
CacheAndPushConstant(L, word, *word-'A');
|
||||
return 1;
|
||||
}
|
||||
if (mathlib) return luaL_error(L, "constant '%s' could not be parsed.\n", word);
|
||||
|
@ -237,7 +238,7 @@ static inline int lib_getenum(lua_State *L)
|
|||
p = word+3;
|
||||
for (i = 0; MOBJFLAG_LIST[i]; i++)
|
||||
if (fastcmp(p, MOBJFLAG_LIST[i])) {
|
||||
lua_pushinteger(L, ((lua_Integer)1<<i));
|
||||
CacheAndPushConstant(L, word, ((lua_Integer)1<<i));
|
||||
return 1;
|
||||
}
|
||||
if (mathlib) return luaL_error(L, "mobjflag '%s' could not be found.\n", word);
|
||||
|
@ -247,7 +248,7 @@ static inline int lib_getenum(lua_State *L)
|
|||
p = word+4;
|
||||
for (i = 0; MOBJFLAG2_LIST[i]; i++)
|
||||
if (fastcmp(p, MOBJFLAG2_LIST[i])) {
|
||||
lua_pushinteger(L, ((lua_Integer)1<<i));
|
||||
CacheAndPushConstant(L, word, ((lua_Integer)1<<i));
|
||||
return 1;
|
||||
}
|
||||
if (mathlib) return luaL_error(L, "mobjflag2 '%s' could not be found.\n", word);
|
||||
|
@ -257,12 +258,12 @@ static inline int lib_getenum(lua_State *L)
|
|||
p = word+4;
|
||||
for (i = 0; MOBJEFLAG_LIST[i]; i++)
|
||||
if (fastcmp(p, MOBJEFLAG_LIST[i])) {
|
||||
lua_pushinteger(L, ((lua_Integer)1<<i));
|
||||
CacheAndPushConstant(L, word, ((lua_Integer)1<<i));
|
||||
return 1;
|
||||
}
|
||||
if (fastcmp(p, "REVERSESUPER"))
|
||||
{
|
||||
lua_pushinteger(L, (lua_Integer)MFE_REVERSESUPER);
|
||||
CacheAndPushConstant(L, word, (lua_Integer)MFE_REVERSESUPER);
|
||||
return 1;
|
||||
}
|
||||
if (mathlib) return luaL_error(L, "mobjeflag '%s' could not be found.\n", word);
|
||||
|
@ -272,7 +273,7 @@ static inline int lib_getenum(lua_State *L)
|
|||
p = word+4;
|
||||
for (i = 0; i < 4; i++)
|
||||
if (MAPTHINGFLAG_LIST[i] && fastcmp(p, MAPTHINGFLAG_LIST[i])) {
|
||||
lua_pushinteger(L, ((lua_Integer)1<<i));
|
||||
CacheAndPushConstant(L, word, ((lua_Integer)1<<i));
|
||||
return 1;
|
||||
}
|
||||
if (mathlib) return luaL_error(L, "mapthingflag '%s' could not be found.\n", word);
|
||||
|
@ -282,17 +283,17 @@ static inline int lib_getenum(lua_State *L)
|
|||
p = word+3;
|
||||
for (i = 0; PLAYERFLAG_LIST[i]; i++)
|
||||
if (fastcmp(p, PLAYERFLAG_LIST[i])) {
|
||||
lua_pushinteger(L, ((lua_Integer)1<<i));
|
||||
CacheAndPushConstant(L, word, ((lua_Integer)1<<i));
|
||||
return 1;
|
||||
}
|
||||
if (fastcmp(p, "FULLSTASIS"))
|
||||
{
|
||||
lua_pushinteger(L, (lua_Integer)PF_FULLSTASIS);
|
||||
CacheAndPushConstant(L, word, (lua_Integer)PF_FULLSTASIS);
|
||||
return 1;
|
||||
}
|
||||
else if (fastcmp(p, "USEDOWN")) // Remove case when 2.3 nears release...
|
||||
{
|
||||
lua_pushinteger(L, (lua_Integer)PF_SPINDOWN);
|
||||
CacheAndPushConstant(L, word, (lua_Integer)PF_SPINDOWN);
|
||||
return 1;
|
||||
}
|
||||
if (mathlib) return luaL_error(L, "playerflag '%s' could not be found.\n", word);
|
||||
|
@ -302,7 +303,7 @@ static inline int lib_getenum(lua_State *L)
|
|||
p = word;
|
||||
for (i = 0; Gametype_ConstantNames[i]; i++)
|
||||
if (fastcmp(p, Gametype_ConstantNames[i])) {
|
||||
lua_pushinteger(L, i);
|
||||
CacheAndPushConstant(L, word, i);
|
||||
return 1;
|
||||
}
|
||||
if (mathlib) return luaL_error(L, "gametype '%s' could not be found.\n", word);
|
||||
|
@ -312,7 +313,7 @@ static inline int lib_getenum(lua_State *L)
|
|||
p = word+4;
|
||||
for (i = 0; GAMETYPERULE_LIST[i]; i++)
|
||||
if (fastcmp(p, GAMETYPERULE_LIST[i])) {
|
||||
lua_pushinteger(L, ((lua_Integer)1<<i));
|
||||
CacheAndPushConstant(L, word, ((lua_Integer)1<<i));
|
||||
return 1;
|
||||
}
|
||||
if (mathlib) return luaL_error(L, "game type rule '%s' could not be found.\n", word);
|
||||
|
@ -322,7 +323,7 @@ static inline int lib_getenum(lua_State *L)
|
|||
p = word+4;
|
||||
for (i = 0; TYPEOFLEVEL[i].name; i++)
|
||||
if (fastcmp(p, TYPEOFLEVEL[i].name)) {
|
||||
lua_pushinteger(L, TYPEOFLEVEL[i].flag);
|
||||
CacheAndPushConstant(L, word, TYPEOFLEVEL[i].flag);
|
||||
return 1;
|
||||
}
|
||||
if (mathlib) return luaL_error(L, "typeoflevel '%s' could not be found.\n", word);
|
||||
|
@ -330,9 +331,10 @@ static inline int lib_getenum(lua_State *L)
|
|||
}
|
||||
else if (fastncmp("ML_", word, 3)) {
|
||||
p = word+3;
|
||||
|
||||
for (i = 0; ML_LIST[i]; i++)
|
||||
if (fastcmp(p, ML_LIST[i])) {
|
||||
lua_pushinteger(L, ((lua_Integer)1<<i));
|
||||
CacheAndPushConstant(L, word, ((lua_Integer)1<<i));
|
||||
return 1;
|
||||
}
|
||||
// Aliases
|
||||
|
@ -415,13 +417,13 @@ static inline int lib_getenum(lua_State *L)
|
|||
if (!FREE_STATES[i])
|
||||
break;
|
||||
if (fastcmp(p, FREE_STATES[i])) {
|
||||
lua_pushinteger(L, S_FIRSTFREESLOT+i);
|
||||
CacheAndPushConstant(L, word, S_FIRSTFREESLOT+i);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
for (i = 0; i < S_FIRSTFREESLOT; i++)
|
||||
if (fastcmp(p, STATE_LIST[i]+2)) {
|
||||
lua_pushinteger(L, i);
|
||||
CacheAndPushConstant(L, word, i);
|
||||
return 1;
|
||||
}
|
||||
return luaL_error(L, "state '%s' does not exist.\n", word);
|
||||
|
@ -432,13 +434,13 @@ static inline int lib_getenum(lua_State *L)
|
|||
if (!FREE_MOBJS[i])
|
||||
break;
|
||||
if (fastcmp(p, FREE_MOBJS[i])) {
|
||||
lua_pushinteger(L, MT_FIRSTFREESLOT+i);
|
||||
CacheAndPushConstant(L, word, MT_FIRSTFREESLOT+i);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
for (i = 0; i < MT_FIRSTFREESLOT; i++)
|
||||
if (fastcmp(p, MOBJTYPE_LIST[i]+3)) {
|
||||
lua_pushinteger(L, i);
|
||||
CacheAndPushConstant(L, word, i);
|
||||
return 1;
|
||||
}
|
||||
return luaL_error(L, "mobjtype '%s' does not exist.\n", word);
|
||||
|
@ -447,7 +449,12 @@ static inline int lib_getenum(lua_State *L)
|
|||
p = word+4;
|
||||
for (i = 0; i < NUMSPRITES; i++)
|
||||
if (!sprnames[i][4] && fastncmp(p,sprnames[i],4)) {
|
||||
lua_pushinteger(L, i);
|
||||
// updating overridden sprnames is not implemented for soc parser,
|
||||
// so don't use cache
|
||||
if (mathlib)
|
||||
lua_pushinteger(L, i);
|
||||
else
|
||||
CacheAndPushConstant(L, word, i);
|
||||
return 1;
|
||||
}
|
||||
if (mathlib) return luaL_error(L, "sprite '%s' could not be found.\n", word);
|
||||
|
@ -462,12 +469,12 @@ static inline int lib_getenum(lua_State *L)
|
|||
// the spr2names entry will have "_" on the end, as in "RUN_"
|
||||
if (spr2names[i][3] == '_' && !p[3]) {
|
||||
if (fastncmp(p,spr2names[i],3)) {
|
||||
lua_pushinteger(L, i);
|
||||
CacheAndPushConstant(L, word, i);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
else if (fastncmp(p,spr2names[i],4)) {
|
||||
lua_pushinteger(L, i);
|
||||
CacheAndPushConstant(L, word, i);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
@ -478,7 +485,7 @@ static inline int lib_getenum(lua_State *L)
|
|||
p = word+4;
|
||||
for (i = 0; i < NUMSFX; i++)
|
||||
if (S_sfx[i].name && fastcmp(p, S_sfx[i].name)) {
|
||||
lua_pushinteger(L, i);
|
||||
CacheAndPushConstant(L, word, i);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
|
@ -487,7 +494,7 @@ static inline int lib_getenum(lua_State *L)
|
|||
p = word+4;
|
||||
for (i = 0; i < NUMSFX; i++)
|
||||
if (S_sfx[i].name && fasticmp(p, S_sfx[i].name)) {
|
||||
lua_pushinteger(L, i);
|
||||
CacheAndPushConstant(L, word, i);
|
||||
return 1;
|
||||
}
|
||||
return luaL_error(L, "sfx '%s' could not be found.\n", word);
|
||||
|
@ -496,7 +503,7 @@ static inline int lib_getenum(lua_State *L)
|
|||
p = word+2;
|
||||
for (i = 0; i < NUMSFX; i++)
|
||||
if (S_sfx[i].name && fasticmp(p, S_sfx[i].name)) {
|
||||
lua_pushinteger(L, i);
|
||||
CacheAndPushConstant(L, word, i);
|
||||
return 1;
|
||||
}
|
||||
if (mathlib) return luaL_error(L, "sfx '%s' could not be found.\n", word);
|
||||
|
@ -506,7 +513,7 @@ static inline int lib_getenum(lua_State *L)
|
|||
p = word+3;
|
||||
for (i = 0; i < NUMPOWERS; i++)
|
||||
if (fasticmp(p, POWERS_LIST[i])) {
|
||||
lua_pushinteger(L, i);
|
||||
CacheAndPushConstant(L, word, i);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
|
@ -515,7 +522,7 @@ static inline int lib_getenum(lua_State *L)
|
|||
p = word+3;
|
||||
for (i = 0; i < NUMPOWERS; i++)
|
||||
if (fastcmp(p, POWERS_LIST[i])) {
|
||||
lua_pushinteger(L, i);
|
||||
CacheAndPushConstant(L, word, i);
|
||||
return 1;
|
||||
}
|
||||
return luaL_error(L, "power '%s' could not be found.\n", word);
|
||||
|
@ -524,7 +531,7 @@ static inline int lib_getenum(lua_State *L)
|
|||
p = word+4;
|
||||
for (i = 0; i < NUMHUDITEMS; i++)
|
||||
if (fastcmp(p, HUDITEMS_LIST[i])) {
|
||||
lua_pushinteger(L, i);
|
||||
CacheAndPushConstant(L, word, i);
|
||||
return 1;
|
||||
}
|
||||
if (mathlib) return luaL_error(L, "huditem '%s' could not be found.\n", word);
|
||||
|
@ -536,13 +543,13 @@ static inline int lib_getenum(lua_State *L)
|
|||
if (!FREE_SKINCOLORS[i])
|
||||
break;
|
||||
if (fastcmp(p, FREE_SKINCOLORS[i])) {
|
||||
lua_pushinteger(L, SKINCOLOR_FIRSTFREESLOT+i);
|
||||
CacheAndPushConstant(L, word, SKINCOLOR_FIRSTFREESLOT+i);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
for (i = 0; i < SKINCOLOR_FIRSTFREESLOT; i++)
|
||||
if (fastcmp(p, COLOR_ENUMS[i])) {
|
||||
lua_pushinteger(L, i);
|
||||
CacheAndPushConstant(L, word, i);
|
||||
return 1;
|
||||
}
|
||||
return luaL_error(L, "skincolor '%s' could not be found.\n", word);
|
||||
|
@ -553,7 +560,7 @@ static inline int lib_getenum(lua_State *L)
|
|||
for (i = 0; NIGHTSGRADE_LIST[i]; i++)
|
||||
if (*p == NIGHTSGRADE_LIST[i])
|
||||
{
|
||||
lua_pushinteger(L, i);
|
||||
CacheAndPushConstant(L, word, i);
|
||||
return 1;
|
||||
}
|
||||
if (mathlib) return luaL_error(L, "NiGHTS grade '%s' could not be found.\n", word);
|
||||
|
@ -563,13 +570,41 @@ static inline int lib_getenum(lua_State *L)
|
|||
p = word+3;
|
||||
for (i = 0; i < NUMMENUTYPES; i++)
|
||||
if (fastcmp(p, MENUTYPES_LIST[i])) {
|
||||
lua_pushinteger(L, i);
|
||||
CacheAndPushConstant(L, word, i);
|
||||
return 1;
|
||||
}
|
||||
if (mathlib) return luaL_error(L, "menutype '%s' could not be found.\n", word);
|
||||
return 0;
|
||||
}
|
||||
else if (!mathlib && fastncmp("A_",word,2)) {
|
||||
|
||||
if (fastcmp(word, "BT_USE")) // Remove case when 2.3 nears release...
|
||||
{
|
||||
CacheAndPushConstant(L, word, (lua_Integer)BT_SPIN);
|
||||
return 1;
|
||||
}
|
||||
|
||||
for (i = 0; INT_CONST[i].n; i++)
|
||||
if (fastcmp(word,INT_CONST[i].n)) {
|
||||
CacheAndPushConstant(L, word, INT_CONST[i].v);
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int lib_getenum(lua_State *L)
|
||||
{
|
||||
const char *word;
|
||||
fixed_t i;
|
||||
boolean mathlib = lua_toboolean(L, lua_upvalueindex(1));
|
||||
if (lua_type(L,2) != LUA_TSTRING)
|
||||
return 0;
|
||||
word = lua_tostring(L,2);
|
||||
|
||||
// check actions, super and globals first, as they don't have _G caching implemented
|
||||
// so they benefit from being checked first
|
||||
|
||||
if (!mathlib && fastncmp("A_",word,2)) {
|
||||
char *caps;
|
||||
// Try to get a Lua action first.
|
||||
/// \todo Push a closure that sets superactions[] and superstack.
|
||||
|
@ -608,25 +643,34 @@ static inline int lib_getenum(lua_State *L)
|
|||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (fastcmp(word, "BT_USE")) // Remove case when 2.3 nears release...
|
||||
{
|
||||
lua_pushinteger(L, (lua_Integer)BT_SPIN);
|
||||
else if ((!mathlib && LUA_PushGlobals(L, word)) || ScanConstants(L, mathlib, word))
|
||||
return 1;
|
||||
}
|
||||
|
||||
for (i = 0; INT_CONST[i].n; i++)
|
||||
if (fastcmp(word,INT_CONST[i].n)) {
|
||||
lua_pushinteger(L, INT_CONST[i].v);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (mathlib) return luaL_error(L, "constant '%s' could not be parsed.\n", word);
|
||||
|
||||
// DYNAMIC variables too!!
|
||||
// Try not to add anything that would break netgames or timeattack replays here.
|
||||
// You know, like consoleplayer, displayplayer, secondarydisplayplayer, or gametime.
|
||||
return LUA_PushGlobals(L, word);
|
||||
return 0;
|
||||
}
|
||||
|
||||
// If a sprname has been "cached" to _G, update it to a new value.
|
||||
void LUA_UpdateSprName(const char *name, lua_Integer value)
|
||||
{
|
||||
char fullname[9] = "SPR_XXXX";
|
||||
|
||||
if (!gL)
|
||||
return;
|
||||
|
||||
strncpy(&fullname[4], name, 4);
|
||||
lua_pushstring(gL, fullname);
|
||||
lua_rawget(gL, LUA_GLOBALSINDEX);
|
||||
|
||||
if (!lua_isnil(gL, -1))
|
||||
{
|
||||
lua_pushstring(gL, name);
|
||||
lua_pushinteger(gL, value);
|
||||
lua_rawset(gL, LUA_GLOBALSINDEX);
|
||||
}
|
||||
|
||||
lua_pop(gL, 1); // pop the rawget result
|
||||
}
|
||||
|
||||
int LUA_EnumLib(lua_State *L)
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
@ -13,6 +13,21 @@
|
|||
#ifndef __DEH_LUA_H__
|
||||
#define __DEH_LUA_H__
|
||||
|
||||
#include "g_game.h"
|
||||
#include "s_sound.h"
|
||||
#include "z_zone.h"
|
||||
#include "m_menu.h"
|
||||
#include "m_misc.h"
|
||||
#include "p_local.h"
|
||||
#include "st_stuff.h"
|
||||
#include "fastcmp.h"
|
||||
#include "lua_script.h"
|
||||
#include "lua_libs.h"
|
||||
|
||||
#include "dehacked.h"
|
||||
#include "deh_tables.h"
|
||||
|
||||
void LUA_UpdateSprName(const char *name, lua_Integer value);
|
||||
boolean LUA_SetLuaAction(void *state, const char *actiontocompare);
|
||||
const char *LUA_GetActionName(void *action);
|
||||
void LUA_SetActionByName(void *state, const char *actiontocompare);
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
@ -45,6 +45,7 @@
|
|||
#include "dehacked.h"
|
||||
#include "deh_soc.h"
|
||||
#include "deh_lua.h" // included due to some LUA_SetLuaAction hack smh
|
||||
// also used for LUA_UpdateSprName
|
||||
#include "deh_tables.h"
|
||||
|
||||
// Loops through every constant and operation in word and performs its calculations, returning the final value.
|
||||
|
@ -439,6 +440,8 @@ void readfreeslots(MYFILE *f)
|
|||
strncpy(sprnames[i],word,4);
|
||||
//sprnames[i][4] = 0;
|
||||
used_spr[(i-SPR_FIRSTFREESLOT)/8] |= 1<<(i%8); // Okay, this sprite slot has been named now.
|
||||
// Lua needs to update the value in _G if it exists
|
||||
LUA_UpdateSprName(word, i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -513,6 +516,8 @@ void readfreeslots(MYFILE *f)
|
|||
} while (!myfeof(f)); // finish when the line is empty
|
||||
|
||||
Z_Free(s);
|
||||
|
||||
R_RefreshSprite2();
|
||||
}
|
||||
|
||||
void readthing(MYFILE *f, INT32 num)
|
||||
|
@ -2907,7 +2912,9 @@ static boolean GoodDataFileName(const char *s)
|
|||
p = s + strlen(s) - strlen(tail);
|
||||
if (p <= s) return false; // too short
|
||||
if (!fasticmp(p, tail)) return false; // doesn't end in .dat
|
||||
if (fasticmp(s, "gamedata.dat")) return false;
|
||||
|
||||
if (fasticmp(s, "gamedata.dat")) return false; // Don't overwrite default gamedata
|
||||
if (fasticmp(s, "main.dat")) return false; // Don't overwrite default time attack replays
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -3835,6 +3842,10 @@ void readmaincfg(MYFILE *f)
|
|||
{
|
||||
useContinues = (UINT8)(value || word2[0] == 'T' || word2[0] == 'Y');
|
||||
}
|
||||
else if (fastcmp(word, "SHAREEMBLEMS"))
|
||||
{
|
||||
shareEmblems = (UINT8)(value || word2[0] == 'T' || word2[0] == 'Y');
|
||||
}
|
||||
|
||||
else if (fastcmp(word, "GAMEDATA"))
|
||||
{
|
||||
|
@ -3845,7 +3856,7 @@ void readmaincfg(MYFILE *f)
|
|||
if (!GoodDataFileName(word2))
|
||||
I_Error("Maincfg: bad data file name '%s'\n", word2);
|
||||
|
||||
G_SaveGameData();
|
||||
G_SaveGameData(clientGamedata);
|
||||
strlcpy(gamedatafilename, word2, sizeof (gamedatafilename));
|
||||
strlwr(gamedatafilename);
|
||||
savemoddata = true;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
@ -4609,66 +4609,111 @@ const char *COLOR_ENUMS[] = {
|
|||
// Desaturated
|
||||
"AETHER", // SKINCOLOR_AETHER,
|
||||
"SLATE", // SKINCOLOR_SLATE,
|
||||
"METEORITE", // SKINCOLOR_METEORITE,
|
||||
"MERCURY", // SKINCOLOR_MERCURY,
|
||||
"BLUEBELL", // SKINCOLOR_BLUEBELL,
|
||||
"PINK", // SKINCOLOR_PINK,
|
||||
"ROSEWOOD", // SKINCOLOR_ROSEWOOD,
|
||||
"YOGURT", // SKINCOLOR_YOGURT,
|
||||
"LATTE", // SKINCOLOR_LATTE,
|
||||
"BROWN", // SKINCOLOR_BROWN,
|
||||
"BOULDER", // SKINCOLOR_BOULDER
|
||||
"BRONZE", // SKINCOLOR_BRONZE,
|
||||
"TAN", // SKINCOLOR_TAN,
|
||||
"SEPIA", // SKINCOLOR_SEPIA,
|
||||
"ECRU", // SKINCOLOR_ECRU,
|
||||
"TAN", // SKINCOLOR_TAN,
|
||||
"BEIGE", // SKINCOLOR_BEIGE,
|
||||
"ROSEBUSH", // SKINCOLOR_ROSEBUSH,
|
||||
"MOSS", // SKINCOLOR_MOSS,
|
||||
"AZURE", // SKINCOLOR_AZURE,
|
||||
"LAVENDER", // SKINCOLOR_LAVENDER,
|
||||
"EGGPLANT", // SKINCOLOR_EGGPLANT,
|
||||
"LAVENDER", // SKINCOLOR_LAVENDER,
|
||||
|
||||
// Viv's vivid colours (toast 21/07/17)
|
||||
// Tweaks & additions (Lach, sphere, Alice, MotorRoach 26/10/22)
|
||||
"RUBY", // SKINCOLOR_RUBY,
|
||||
"CHERRY", // SKINCOLOR_CHERRY,
|
||||
"SALMON", // SKINCOLOR_SALMON,
|
||||
"PEPPER", // SKINCOLOR_PEPPER,
|
||||
"RED", // SKINCOLOR_RED,
|
||||
"CRIMSON", // SKINCOLOR_CRIMSON,
|
||||
"FLAME", // SKINCOLOR_FLAME,
|
||||
"GARNET", // SKINCOLOR_GARNET,
|
||||
"KETCHUP", // SKINCOLOR_KETCHUP,
|
||||
"PEACHY", // SKINCOLOR_PEACHY,
|
||||
"QUAIL", // SKINCOLOR_QUAIL,
|
||||
"FOUNDATION", // SKINCOLOR_FOUNDATION,
|
||||
"SUNSET", // SKINCOLOR_SUNSET,
|
||||
"COPPER", // SKINCOLOR_COPPER,
|
||||
"APRICOT", // SKINCOLOR_APRICOT,
|
||||
"ORANGE", // SKINCOLOR_ORANGE,
|
||||
"PUMPKIN", // SKINCOLOR_PUMPKIN,
|
||||
"RUST", // SKINCOLOR_RUST,
|
||||
"GOLD", // SKINCOLOR_GOLD,
|
||||
"TOPAZ", // SKINCOLOR_TOPAZ,
|
||||
"SANDY", // SKINCOLOR_SANDY,
|
||||
"GOLDENROD", // SKINCOLOR_GOLDENROD,
|
||||
"YELLOW", // SKINCOLOR_YELLOW,
|
||||
"OLIVE", // SKINCOLOR_OLIVE,
|
||||
"PEAR", // SKINCOLOR_PEAR,
|
||||
"LEMON", // SKINCOLOR_LEMON,
|
||||
"LIME", // SKINCOLOR_LIME,
|
||||
"PERIDOT", // SKINCOLOR_PERIDOT,
|
||||
"APPLE", // SKINCOLOR_APPLE,
|
||||
"CHARTREUSE", // SKINCOLOR_CHARTREUSE,
|
||||
"GREEN", // SKINCOLOR_GREEN,
|
||||
"FOREST", // SKINCOLOR_FOREST,
|
||||
"EMERALD", // SKINCOLOR_EMERALD,
|
||||
"SHAMROCK", // SKINCOLOR_SHAMROCK,
|
||||
"JADE", // SKINCOLOR_JADE,
|
||||
"HEADLIGHT", // SKINCOLOR_HEADLIGHT,
|
||||
"MINT", // SKINCOLOR_MINT,
|
||||
"MASTER", // SKINCOLOR_MASTER,
|
||||
"EMERALD", // SKINCOLOR_EMERALD,
|
||||
"BOTTLE", // SKINCOLOR_BOTTLE,
|
||||
"SEAFOAM", // SKINCOLOR_SEAFOAM,
|
||||
"ISLAND", // SKINCOLOR_ISLAND,
|
||||
"AQUA", // SKINCOLOR_AQUA,
|
||||
"TEAL", // SKINCOLOR_TEAL,
|
||||
"WAVE", // SKINCOLOR_WAVE,
|
||||
"CYAN", // SKINCOLOR_CYAN,
|
||||
"TURQUOISE", // SKINCOLOR_TURQUOISE,
|
||||
"AQUAMARINE", // SKINCOLOR_AQUAMARINE,
|
||||
"SKY", // SKINCOLOR_SKY,
|
||||
"MARINE", // SKINCOLOR_MARINE,
|
||||
"CERULEAN", // SKINCOLOR_CERULEAN,
|
||||
"DREAM", // SKINCOLOR_DREAM,
|
||||
"ICY", // SKINCOLOR_ICY,
|
||||
"DAYBREAK", // SKINCOLOR_DAYBREAK,
|
||||
"SAPPHIRE", // SKINCOLOR_SAPPHIRE,
|
||||
"ARCTIC", // SKINCOLOR_ARCTIC,
|
||||
"CORNFLOWER", // SKINCOLOR_CORNFLOWER,
|
||||
"BLUE", // SKINCOLOR_BLUE,
|
||||
"COBALT", // SKINCOLOR_COBALT,
|
||||
"MIDNIGHT", // SKINCOLOR_MIDNIGHT,
|
||||
"GALAXY", // SKINCOLOR_GALAXY,
|
||||
"VAPOR", // SKINCOLOR_VAPOR,
|
||||
"DUSK", // SKINCOLOR_DUSK,
|
||||
"MAJESTY", // SKINCOLOR_MAJESTY,
|
||||
"PASTEL", // SKINCOLOR_PASTEL,
|
||||
"PURPLE", // SKINCOLOR_PURPLE,
|
||||
"BUBBLEGUM", // SKINCOLOR_BUBBLEGUM,
|
||||
"NOBLE", // SKINCOLOR_NOBLE,
|
||||
"FUCHSIA", // SKINCOLOR_FUCHSIA,
|
||||
"BUBBLEGUM", // SKINCOLOR_BUBBLEGUM,
|
||||
"CRYSTAL", // SKINCOLOR_CRYSTAL,
|
||||
"MAGENTA", // SKINCOLOR_MAGENTA,
|
||||
"NEON", // SKINCOLOR_NEON,
|
||||
"VIOLET", // SKINCOLOR_VIOLET,
|
||||
"ROYAL", // SKINCOLOR_ROYAL,
|
||||
"LILAC", // SKINCOLOR_LILAC,
|
||||
"MAUVE", // SKINCOLOR_MAUVE,
|
||||
"EVENTIDE", // SKINCOLOR_EVENTIDE,
|
||||
"PLUM", // SKINCOLOR_PLUM,
|
||||
"RASPBERRY", // SKINCOLOR_RASPBERRY,
|
||||
"TAFFY", // SKINCOLOR_TAFFY,
|
||||
"ROSY", // SKINCOLOR_ROSY,
|
||||
"FANCY", // SKINCOLOR_FANCY,
|
||||
"SANGRIA", // SKINCOLOR_SANGRIA,
|
||||
"VOLCANIC", // SKINCOLOR_VOLCANIC,
|
||||
|
||||
// Super special awesome Super flashing colors!
|
||||
"SUPERSILVER1", // SKINCOLOR_SUPERSILVER1
|
||||
|
@ -4768,7 +4813,9 @@ const char *const POWERS_LIST[] = {
|
|||
|
||||
"JUSTLAUNCHED",
|
||||
|
||||
"IGNORELATCH"
|
||||
"IGNORELATCH",
|
||||
|
||||
"STRONG"
|
||||
};
|
||||
|
||||
const char *const HUDITEMS_LIST[] = {
|
||||
|
@ -5121,6 +5168,30 @@ struct int_const_s const INT_CONST[] = {
|
|||
{"CR_DUSTDEVIL",CR_DUSTDEVIL},
|
||||
{"CR_FAN",CR_FAN},
|
||||
|
||||
// Strong powers
|
||||
{"STR_NONE",STR_NONE},
|
||||
{"STR_ANIM",STR_ANIM},
|
||||
{"STR_PUNCH",STR_PUNCH},
|
||||
{"STR_TAIL",STR_TAIL},
|
||||
{"STR_STOMP",STR_STOMP},
|
||||
{"STR_UPPER",STR_UPPER},
|
||||
{"STR_GUARD",STR_GUARD},
|
||||
{"STR_HEAVY",STR_HEAVY},
|
||||
{"STR_DASH",STR_DASH},
|
||||
{"STR_WALL",STR_WALL},
|
||||
{"STR_FLOOR",STR_FLOOR},
|
||||
{"STR_CEILING",STR_CEILING},
|
||||
{"STR_SPRING",STR_SPRING},
|
||||
{"STR_SPIKE",STR_SPIKE},
|
||||
{"STR_ATTACK",STR_ATTACK},
|
||||
{"STR_BUST",STR_BUST},
|
||||
{"STR_FLY",STR_FLY},
|
||||
{"STR_GLIDE",STR_GLIDE},
|
||||
{"STR_TWINSPIN",STR_TWINSPIN},
|
||||
{"STR_MELEE",STR_MELEE},
|
||||
{"STR_BOUNCE",STR_BOUNCE},
|
||||
{"STR_METAL",STR_METAL},
|
||||
|
||||
// Ring weapons (ringweapons_t)
|
||||
// Useful for A_GiveWeapon
|
||||
{"RW_AUTO",RW_AUTO},
|
||||
|
@ -5525,7 +5596,7 @@ struct int_const_s const INT_CONST[] = {
|
|||
{"CV_HIDEN",CV_HIDEN},
|
||||
{"CV_HIDDEN",CV_HIDEN},
|
||||
{"CV_CHEAT",CV_CHEAT},
|
||||
{"CV_NOLUA",CV_NOLUA},
|
||||
{"CV_ALLOWLUA",CV_ALLOWLUA},
|
||||
|
||||
// v_video flags
|
||||
{"V_NOSCALEPATCH",V_NOSCALEPATCH},
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
@ -575,7 +575,7 @@ static void DEH_LoadDehackedFile(MYFILE *f, boolean mainfile)
|
|||
} // end while
|
||||
|
||||
if (gamedataadded)
|
||||
G_LoadGameData();
|
||||
G_LoadGameData(clientGamedata);
|
||||
|
||||
if (gamestate == GS_TITLESCREEN)
|
||||
{
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
@ -104,6 +104,8 @@
|
|||
#include <io.h>
|
||||
#endif
|
||||
|
||||
FILE *fopenfile(const char*, const char*);
|
||||
|
||||
//#define NOMD5
|
||||
|
||||
// Uncheck this to compile debugging code
|
||||
|
@ -150,7 +152,7 @@ extern char logfilename[1024];
|
|||
|
||||
// Does this version require an added patch file?
|
||||
// Comment or uncomment this as necessary.
|
||||
// #define USE_PATCH_DTA
|
||||
#define USE_PATCH_DTA
|
||||
|
||||
// Enforce a limit of loaded WAD files.
|
||||
//#define ENFORCE_WAD_LIMIT
|
||||
|
@ -259,66 +261,111 @@ typedef enum
|
|||
// Desaturated
|
||||
SKINCOLOR_AETHER,
|
||||
SKINCOLOR_SLATE,
|
||||
SKINCOLOR_METEORITE,
|
||||
SKINCOLOR_MERCURY,
|
||||
SKINCOLOR_BLUEBELL,
|
||||
SKINCOLOR_PINK,
|
||||
SKINCOLOR_ROSEWOOD,
|
||||
SKINCOLOR_YOGURT,
|
||||
SKINCOLOR_LATTE,
|
||||
SKINCOLOR_BROWN,
|
||||
SKINCOLOR_BOULDER,
|
||||
SKINCOLOR_BRONZE,
|
||||
SKINCOLOR_SEPIA,
|
||||
SKINCOLOR_ECRU,
|
||||
SKINCOLOR_TAN,
|
||||
SKINCOLOR_BEIGE,
|
||||
SKINCOLOR_ROSEBUSH,
|
||||
SKINCOLOR_MOSS,
|
||||
SKINCOLOR_AZURE,
|
||||
SKINCOLOR_EGGPLANT,
|
||||
SKINCOLOR_LAVENDER,
|
||||
|
||||
// Viv's vivid colours (toast 21/07/17)
|
||||
// Tweaks & additions (Lach, sphere, Alice, MotorRoach 26/10/22)
|
||||
SKINCOLOR_RUBY,
|
||||
SKINCOLOR_CHERRY,
|
||||
SKINCOLOR_SALMON,
|
||||
SKINCOLOR_PEPPER,
|
||||
SKINCOLOR_RED,
|
||||
SKINCOLOR_CRIMSON,
|
||||
SKINCOLOR_FLAME,
|
||||
SKINCOLOR_GARNET,
|
||||
SKINCOLOR_KETCHUP,
|
||||
SKINCOLOR_PEACHY,
|
||||
SKINCOLOR_QUAIL,
|
||||
SKINCOLOR_FOUNDATION,
|
||||
SKINCOLOR_SUNSET,
|
||||
SKINCOLOR_COPPER,
|
||||
SKINCOLOR_APRICOT,
|
||||
SKINCOLOR_ORANGE,
|
||||
SKINCOLOR_PUMPKIN,
|
||||
SKINCOLOR_RUST,
|
||||
SKINCOLOR_GOLD,
|
||||
SKINCOLOR_TOPAZ,
|
||||
SKINCOLOR_SANDY,
|
||||
SKINCOLOR_GOLDENROD,
|
||||
SKINCOLOR_YELLOW,
|
||||
SKINCOLOR_OLIVE,
|
||||
SKINCOLOR_PEAR,
|
||||
SKINCOLOR_LEMON,
|
||||
SKINCOLOR_LIME,
|
||||
SKINCOLOR_PERIDOT,
|
||||
SKINCOLOR_APPLE,
|
||||
SKINCOLOR_CHARTREUSE,
|
||||
SKINCOLOR_GREEN,
|
||||
SKINCOLOR_FOREST,
|
||||
SKINCOLOR_EMERALD,
|
||||
SKINCOLOR_SHAMROCK,
|
||||
SKINCOLOR_JADE,
|
||||
SKINCOLOR_HEADLIGHT,
|
||||
SKINCOLOR_MINT,
|
||||
SKINCOLOR_MASTER,
|
||||
SKINCOLOR_EMERALD,
|
||||
SKINCOLOR_BOTTLE,
|
||||
SKINCOLOR_SEAFOAM,
|
||||
SKINCOLOR_ISLAND,
|
||||
SKINCOLOR_AQUA,
|
||||
SKINCOLOR_TEAL,
|
||||
SKINCOLOR_WAVE,
|
||||
SKINCOLOR_CYAN,
|
||||
SKINCOLOR_TURQUOISE,
|
||||
SKINCOLOR_AQUAMARINE,
|
||||
SKINCOLOR_SKY,
|
||||
SKINCOLOR_MARINE,
|
||||
SKINCOLOR_CERULEAN,
|
||||
SKINCOLOR_DREAM,
|
||||
SKINCOLOR_ICY,
|
||||
SKINCOLOR_DAYBREAK,
|
||||
SKINCOLOR_SAPPHIRE, // sweet mother, i cannot weave – slender aphrodite has overcome me with longing for a girl
|
||||
SKINCOLOR_ARCTIC,
|
||||
SKINCOLOR_CORNFLOWER,
|
||||
SKINCOLOR_BLUE,
|
||||
SKINCOLOR_COBALT,
|
||||
SKINCOLOR_MIDNIGHT,
|
||||
SKINCOLOR_GALAXY,
|
||||
SKINCOLOR_VAPOR,
|
||||
SKINCOLOR_DUSK,
|
||||
SKINCOLOR_MAJESTY,
|
||||
SKINCOLOR_PASTEL,
|
||||
SKINCOLOR_PURPLE,
|
||||
SKINCOLOR_NOBLE,
|
||||
SKINCOLOR_FUCHSIA,
|
||||
SKINCOLOR_BUBBLEGUM,
|
||||
SKINCOLOR_CRYSTAL,
|
||||
SKINCOLOR_MAGENTA,
|
||||
SKINCOLOR_NEON,
|
||||
SKINCOLOR_VIOLET,
|
||||
SKINCOLOR_ROYAL,
|
||||
SKINCOLOR_LILAC,
|
||||
SKINCOLOR_MAUVE,
|
||||
SKINCOLOR_EVENTIDE,
|
||||
SKINCOLOR_PLUM,
|
||||
SKINCOLOR_RASPBERRY,
|
||||
SKINCOLOR_TAFFY,
|
||||
SKINCOLOR_ROSY,
|
||||
SKINCOLOR_FANCY,
|
||||
SKINCOLOR_SANGRIA,
|
||||
SKINCOLOR_VOLCANIC,
|
||||
|
||||
FIRSTSUPERCOLOR,
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
@ -75,6 +75,7 @@ extern SINT8 startinglivesbalance[maxgameovers+1];
|
|||
extern boolean modifiedgame;
|
||||
extern UINT16 mainwads;
|
||||
extern boolean savemoddata; // This mod saves time/emblem data.
|
||||
extern boolean usedCheats;
|
||||
extern boolean disableSpeedAdjust; // Don't alter the duration of player states if true
|
||||
extern boolean imcontinuing; // Temporary flag while continuing
|
||||
extern boolean metalrecording;
|
||||
|
@ -131,8 +132,6 @@ extern INT32 postimgparam2;
|
|||
extern INT32 viewwindowx, viewwindowy;
|
||||
extern INT32 viewwidth, scaledviewwidth;
|
||||
|
||||
extern boolean gamedataloaded;
|
||||
|
||||
// Player taking events, and displaying.
|
||||
extern INT32 consoleplayer;
|
||||
extern INT32 displayplayer;
|
||||
|
@ -494,8 +493,6 @@ typedef struct
|
|||
extern tolinfo_t TYPEOFLEVEL[NUMTOLNAMES];
|
||||
extern UINT32 lastcustomtol;
|
||||
|
||||
extern tic_t totalplaytime;
|
||||
|
||||
extern boolean stagefailed;
|
||||
|
||||
// Emeralds stored as bits to throw savegame hackers off.
|
||||
|
@ -514,52 +511,6 @@ extern INT32 luabanks[NUM_LUABANKS];
|
|||
|
||||
extern INT32 nummaprings; //keep track of spawned rings/coins
|
||||
|
||||
/** Time attack information, currently a very small structure.
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
tic_t time; ///< Time in which the level was finished.
|
||||
UINT32 score; ///< Score when the level was finished.
|
||||
UINT16 rings; ///< Rings when the level was finished.
|
||||
} recorddata_t;
|
||||
|
||||
/** Setup for one NiGHTS map.
|
||||
* These are dynamically allocated because I am insane
|
||||
*/
|
||||
#define GRADE_F 0
|
||||
#define GRADE_E 1
|
||||
#define GRADE_D 2
|
||||
#define GRADE_C 3
|
||||
#define GRADE_B 4
|
||||
#define GRADE_A 5
|
||||
#define GRADE_S 6
|
||||
|
||||
typedef struct
|
||||
{
|
||||
// 8 mares, 1 overall (0)
|
||||
UINT8 nummares;
|
||||
UINT32 score[9];
|
||||
UINT8 grade[9];
|
||||
tic_t time[9];
|
||||
} nightsdata_t;
|
||||
|
||||
extern nightsdata_t *nightsrecords[NUMMAPS];
|
||||
extern recorddata_t *mainrecords[NUMMAPS];
|
||||
|
||||
// mapvisited is now a set of flags that says what we've done in the map.
|
||||
#define MV_VISITED 1
|
||||
#define MV_BEATEN 2
|
||||
#define MV_ALLEMERALDS 4
|
||||
#define MV_ULTIMATE 8
|
||||
#define MV_PERFECT 16
|
||||
#define MV_PERFECTRA 32
|
||||
#define MV_MAX 63 // used in gamedata check, update whenever MV's are added
|
||||
#define MV_MP 128
|
||||
extern UINT8 mapvisited[NUMMAPS];
|
||||
|
||||
// Temporary holding place for nights data for the current map
|
||||
extern nightsdata_t ntemprecords;
|
||||
|
||||
extern UINT32 token; ///< Number of tokens collected in a level
|
||||
extern UINT32 tokenlist; ///< List of tokens collected
|
||||
extern boolean gottoken; ///< Did you get a token? Used for end of act
|
||||
|
@ -592,9 +543,12 @@ extern UINT8 useBlackRock;
|
|||
|
||||
extern UINT8 use1upSound;
|
||||
extern UINT8 maxXtraLife; // Max extra lives from rings
|
||||
|
||||
extern UINT8 useContinues;
|
||||
#define continuesInSession (!multiplayer && (ultimatemode || (useContinues && !marathonmode) || (!modeattacking && !(cursaveslot > 0))))
|
||||
|
||||
extern UINT8 shareEmblems;
|
||||
|
||||
extern mobj_t *hunt1, *hunt2, *hunt3; // Emerald hunt locations
|
||||
|
||||
// For racing
|
||||
|
@ -615,10 +569,6 @@ extern INT32 cheats;
|
|||
|
||||
extern tic_t hidetime;
|
||||
|
||||
extern UINT32 timesBeaten; // # of times the game has been beaten.
|
||||
extern UINT32 timesBeatenWithEmeralds;
|
||||
extern UINT32 timesBeatenUltimate;
|
||||
|
||||
// ===========================
|
||||
// Internal parameters, fixed.
|
||||
// ===========================
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
@ -97,6 +97,9 @@ typedef long ssize_t;
|
|||
char *strcasestr(const char *in, const char *what);
|
||||
#define stristr strcasestr
|
||||
|
||||
int startswith (const char *base, const char *tag);
|
||||
int endswith (const char *base, const char *tag);
|
||||
|
||||
#if defined (macintosh) //|| defined (__APPLE__) //skip all boolean/Boolean crap
|
||||
#define true 1
|
||||
#define false 0
|
||||
|
|
|
@ -8,7 +8,7 @@ UINT8 graphics_started = 0;
|
|||
|
||||
UINT8 keyboard_started = 0;
|
||||
|
||||
UINT32 I_GetFreeMem(UINT32 *total)
|
||||
size_t I_GetFreeMem(size_t *total)
|
||||
{
|
||||
*total = 0;
|
||||
return 0;
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 2014-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 2014-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
|
168
src/f_finale.c
168
src/f_finale.c
|
@ -2,7 +2,7 @@
|
|||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
@ -63,7 +63,6 @@ static tic_t stoptimer;
|
|||
static boolean keypressed = false;
|
||||
|
||||
// (no longer) De-Demo'd Title Screen
|
||||
static INT32 menuanimtimer; // Title screen: background animation timing
|
||||
mobj_t *titlemapcameraref = NULL;
|
||||
|
||||
// menu presentation state
|
||||
|
@ -75,6 +74,8 @@ INT32 curbgyspeed;
|
|||
boolean curbghide;
|
||||
boolean hidetitlemap; // WARNING: set to false by M_SetupNextMenu and M_ClearMenus
|
||||
|
||||
static fixed_t curbgx = 0;
|
||||
static fixed_t curbgy = 0;
|
||||
static UINT8 curDemo = 0;
|
||||
static UINT32 demoDelayLeft;
|
||||
static UINT32 demoIdleLeft;
|
||||
|
@ -223,7 +224,6 @@ static INT32 cutscene_writeptr = 0;
|
|||
static INT32 cutscene_textcount = 0;
|
||||
static INT32 cutscene_textspeed = 0;
|
||||
static UINT8 cutscene_boostspeed = 0;
|
||||
static tic_t cutscene_lasttextwrite = 0;
|
||||
|
||||
// STJR Intro
|
||||
char stjrintro[9] = "STJRI000";
|
||||
|
@ -239,11 +239,6 @@ static UINT8 F_WriteText(void)
|
|||
{
|
||||
INT32 numtowrite = 1;
|
||||
const char *c;
|
||||
tic_t ltw = I_GetTime();
|
||||
|
||||
if (cutscene_lasttextwrite == ltw)
|
||||
return 1; // singletics prevention
|
||||
cutscene_lasttextwrite = ltw;
|
||||
|
||||
if (cutscene_boostspeed)
|
||||
{
|
||||
|
@ -337,7 +332,7 @@ static tic_t introscenetime[NUMINTROSCENES] =
|
|||
};
|
||||
|
||||
// custom intros
|
||||
void F_StartCustomCutscene(INT32 cutscenenum, boolean precutscene, boolean resetplayer);
|
||||
void F_StartCustomCutscene(INT32 cutscenenum, boolean precutscene, boolean resetplayer, boolean FLS);
|
||||
|
||||
void F_StartIntro(void)
|
||||
{
|
||||
|
@ -349,7 +344,7 @@ void F_StartIntro(void)
|
|||
if (!cutscenes[introtoplay - 1])
|
||||
D_StartTitle();
|
||||
else
|
||||
F_StartCustomCutscene(introtoplay - 1, false, false);
|
||||
F_StartCustomCutscene(introtoplay - 1, false, false, false);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1138,7 +1133,7 @@ static const char *credits[] = {
|
|||
"Dave \"DemonTomatoDave\" Bulmer",
|
||||
"Paul \"Boinciel\" Clempson",
|
||||
"\"Cyan Helkaraxe\"",
|
||||
"Shane \"CobaltBW\" Ellis",
|
||||
"Claire \"clairebun\" Ellis",
|
||||
"James \"SeventhSentinel\" Hall",
|
||||
"Kepa \"Nev3r\" Iceta",
|
||||
"Iestyn \"Monster Iestyn\" Jealous",
|
||||
|
@ -1257,7 +1252,7 @@ void F_StartCredits(void)
|
|||
|
||||
if (creditscutscene)
|
||||
{
|
||||
F_StartCustomCutscene(creditscutscene - 1, false, false);
|
||||
F_StartCustomCutscene(creditscutscene - 1, false, false, false);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1411,7 +1406,7 @@ boolean F_CreditResponder(event_t *event)
|
|||
break;
|
||||
}
|
||||
|
||||
if (!(timesBeaten) && !(netgame || multiplayer) && !cv_debug)
|
||||
if (!(serverGamedata->timesBeaten) && !(netgame || multiplayer) && !cv_debug)
|
||||
return false;
|
||||
|
||||
if (event->type != ev_keydown)
|
||||
|
@ -1573,27 +1568,19 @@ void F_GameEvaluationDrawer(void)
|
|||
#if 0 // the following looks like hot garbage the more unlockables we add, and we now have a lot of unlockables
|
||||
if (finalecount >= 5*TICRATE)
|
||||
{
|
||||
INT32 startcoord = 32;
|
||||
V_DrawString(8, 16, V_YELLOWMAP, "Unlocked:");
|
||||
|
||||
if (!(netgame) && (!modifiedgame || savemoddata))
|
||||
for (i = 0; i < MAXUNLOCKABLES; i++)
|
||||
{
|
||||
INT32 startcoord = 32;
|
||||
|
||||
for (i = 0; i < MAXUNLOCKABLES; i++)
|
||||
if (unlockables[i].conditionset && unlockables[i].conditionset < MAXCONDITIONSETS
|
||||
&& unlockables[i].type && !unlockables[i].nocecho)
|
||||
{
|
||||
if (unlockables[i].conditionset && unlockables[i].conditionset < MAXCONDITIONSETS
|
||||
&& unlockables[i].type && !unlockables[i].nocecho)
|
||||
{
|
||||
if (unlockables[i].unlocked)
|
||||
V_DrawString(8, startcoord, 0, unlockables[i].name);
|
||||
startcoord += 8;
|
||||
}
|
||||
if (clientGamedata->unlocked[i])
|
||||
V_DrawString(8, startcoord, 0, unlockables[i].name);
|
||||
startcoord += 8;
|
||||
}
|
||||
}
|
||||
else if (netgame)
|
||||
V_DrawString(8, 96, V_YELLOWMAP, "Multiplayer games\ncan't unlock\nextras!");
|
||||
else
|
||||
V_DrawString(8, 96, V_YELLOWMAP, "Modified games\ncan't unlock\nextras!");
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -1650,35 +1637,27 @@ void F_GameEvaluationTicker(void)
|
|||
|
||||
if (finalecount == 5*TICRATE)
|
||||
{
|
||||
if (netgame || multiplayer) // modify this when we finally allow unlocking stuff in 2P
|
||||
serverGamedata->timesBeaten++;
|
||||
clientGamedata->timesBeaten++;
|
||||
|
||||
if (ALL7EMERALDS(emeralds))
|
||||
{
|
||||
HU_SetCEchoFlags(V_YELLOWMAP|V_RETURN8);
|
||||
HU_SetCEchoDuration(6);
|
||||
HU_DoCEcho("\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\Multiplayer games can't unlock extras!");
|
||||
serverGamedata->timesBeatenWithEmeralds++;
|
||||
clientGamedata->timesBeatenWithEmeralds++;
|
||||
}
|
||||
|
||||
if (ultimatemode)
|
||||
{
|
||||
serverGamedata->timesBeatenUltimate++;
|
||||
clientGamedata->timesBeatenUltimate++;
|
||||
}
|
||||
|
||||
M_SilentUpdateUnlockablesAndEmblems(serverGamedata);
|
||||
|
||||
if (M_UpdateUnlockablesAndExtraEmblems(clientGamedata))
|
||||
S_StartSound(NULL, sfx_s3k68);
|
||||
}
|
||||
else if (!modifiedgame || savemoddata)
|
||||
{
|
||||
++timesBeaten;
|
||||
|
||||
if (ALL7EMERALDS(emeralds))
|
||||
++timesBeatenWithEmeralds;
|
||||
|
||||
if (ultimatemode)
|
||||
++timesBeatenUltimate;
|
||||
|
||||
if (M_UpdateUnlockablesAndExtraEmblems())
|
||||
S_StartSound(NULL, sfx_s3k68);
|
||||
|
||||
G_SaveGameData();
|
||||
}
|
||||
else
|
||||
{
|
||||
HU_SetCEchoFlags(V_YELLOWMAP|V_RETURN8);
|
||||
HU_SetCEchoDuration(6);
|
||||
HU_DoCEcho("\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\Modified games can't unlock extras!");
|
||||
S_StartSound(NULL, sfx_s3k68);
|
||||
}
|
||||
G_SaveGameData(clientGamedata);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2192,7 +2171,7 @@ void F_EndingDrawer(void)
|
|||
//colset(linkmap, 164, 165, 169); -- the ideal purple colour to represent a clicked in-game link, but not worth it just for a soundtest-controlled secret
|
||||
V_DrawCenteredString(BASEVIDWIDTH/2, 8, V_ALLOWLOWERCASE|(trans<<V_ALPHASHIFT), str);
|
||||
V_DrawCharacter(32, BASEVIDHEIGHT-16, '>'|(trans<<V_ALPHASHIFT), false);
|
||||
V_DrawString(40, ((finalecount == STOPPINGPOINT-(20+TICRATE)) ? 1 : 0)+BASEVIDHEIGHT-16, ((timesBeaten || finalecount >= STOPPINGPOINT-TICRATE) ? V_PURPLEMAP : V_BLUEMAP)|(trans<<V_ALPHASHIFT), " [S] ===>");
|
||||
V_DrawString(40, ((finalecount == STOPPINGPOINT-(20+TICRATE)) ? 1 : 0)+BASEVIDHEIGHT-16, ((serverGamedata->timesBeaten || finalecount >= STOPPINGPOINT-TICRATE) ? V_PURPLEMAP : V_BLUEMAP)|(trans<<V_ALPHASHIFT), " [S] ===>");
|
||||
}
|
||||
|
||||
if (finalecount > STOPPINGPOINT-(20+(2*TICRATE)))
|
||||
|
@ -2258,7 +2237,8 @@ void F_GameEndTicker(void)
|
|||
|
||||
void F_InitMenuPresValues(void)
|
||||
{
|
||||
menuanimtimer = 0;
|
||||
curbgx = 0;
|
||||
curbgy = 0;
|
||||
prevMenuId = 0;
|
||||
activeMenuId = MainDef.menuid;
|
||||
|
||||
|
@ -2291,17 +2271,11 @@ void F_InitMenuPresValues(void)
|
|||
//
|
||||
// F_SkyScroll
|
||||
//
|
||||
void F_SkyScroll(INT32 scrollxspeed, INT32 scrollyspeed, const char *patchname)
|
||||
void F_SkyScroll(const char *patchname)
|
||||
{
|
||||
INT32 xscrolled, x, xneg = (scrollxspeed > 0) - (scrollxspeed < 0), tilex;
|
||||
INT32 yscrolled, y, yneg = (scrollyspeed > 0) - (scrollyspeed < 0), tiley;
|
||||
boolean xispos = (scrollxspeed >= 0), yispos = (scrollyspeed >= 0);
|
||||
INT32 x, basey = 0;
|
||||
INT32 dupz = (vid.dupx < vid.dupy ? vid.dupx : vid.dupy);
|
||||
INT16 patwidth, patheight;
|
||||
INT32 pw, ph; // scaled by dupz
|
||||
patch_t *pat;
|
||||
INT32 i, j;
|
||||
fixed_t fracmenuanimtimer, xscrolltimer, yscrolltimer;
|
||||
|
||||
if (rendermode == render_none)
|
||||
return;
|
||||
|
@ -2312,43 +2286,34 @@ void F_SkyScroll(INT32 scrollxspeed, INT32 scrollyspeed, const char *patchname)
|
|||
return;
|
||||
}
|
||||
|
||||
if (!scrollxspeed && !scrollyspeed)
|
||||
pat = W_CachePatchName(patchname, PU_PATCH_LOWPRIORITY);
|
||||
|
||||
if (!curbgxspeed && !curbgyspeed)
|
||||
{
|
||||
V_DrawPatchFill(W_CachePatchName(patchname, PU_PATCH_LOWPRIORITY));
|
||||
V_DrawPatchFill(pat);
|
||||
W_UnlockCachedPatch(pat);
|
||||
return;
|
||||
}
|
||||
|
||||
pat = W_CachePatchName(patchname, PU_PATCH_LOWPRIORITY);
|
||||
// Modulo the background scrolling to prevent jumps from integer overflows
|
||||
// We already load the background patch here, so we can modulo it here
|
||||
// to avoid also having to load the patch in F_MenuPresTicker
|
||||
curbgx %= pat->width * 16;
|
||||
curbgy %= pat->height * 16;
|
||||
|
||||
patwidth = pat->width;
|
||||
patheight = pat->height;
|
||||
pw = patwidth * dupz;
|
||||
ph = patheight * dupz;
|
||||
// Ooh, fancy frame interpolation
|
||||
x = ((curbgx*dupz) + FixedInt((rendertimefrac-FRACUNIT) * curbgxspeed*dupz)) / 16;
|
||||
basey = ((curbgy*dupz) + FixedInt((rendertimefrac-FRACUNIT) * curbgyspeed*dupz)) / 16;
|
||||
|
||||
tilex = max(FixedCeil(FixedDiv(vid.width, pw)) >> FRACBITS, 1)+2; // one tile on both sides of center
|
||||
tiley = max(FixedCeil(FixedDiv(vid.height, ph)) >> FRACBITS, 1)+2;
|
||||
if (x > 0) // Make sure that we don't leave the left or top sides empty
|
||||
x -= pat->width * dupz;
|
||||
if (basey > 0)
|
||||
basey -= pat->height * dupz;
|
||||
|
||||
fracmenuanimtimer = (menuanimtimer * FRACUNIT) - (FRACUNIT - rendertimefrac);
|
||||
xscrolltimer = ((fracmenuanimtimer*scrollxspeed)/16 + patwidth*xneg*FRACUNIT) % (patwidth * FRACUNIT);
|
||||
yscrolltimer = ((fracmenuanimtimer*scrollyspeed)/16 + patheight*yneg*FRACUNIT) % (patheight * FRACUNIT);
|
||||
|
||||
// coordinate offsets
|
||||
xscrolled = FixedInt(xscrolltimer * dupz);
|
||||
yscrolled = FixedInt(yscrolltimer * dupz);
|
||||
|
||||
for (x = (xispos) ? -pw*(tilex-1)+pw : 0, i = 0;
|
||||
i < tilex;
|
||||
x += pw, i++)
|
||||
for (; x < vid.width; x += pat->width * dupz)
|
||||
{
|
||||
for (y = (yispos) ? -ph*(tiley-1)+ph : 0, j = 0;
|
||||
j < tiley;
|
||||
y += ph, j++)
|
||||
{
|
||||
V_DrawScaledPatch(
|
||||
(xispos) ? xscrolled - x : x + xscrolled,
|
||||
(yispos) ? yscrolled - y : y + yscrolled,
|
||||
V_NOSCALESTART, pat);
|
||||
}
|
||||
for (INT32 y = basey; y < vid.height; y += pat->height * dupz)
|
||||
V_DrawScaledPatch(x, y, V_NOSCALESTART, pat);
|
||||
}
|
||||
|
||||
W_UnlockCachedPatch(pat);
|
||||
|
@ -2503,6 +2468,8 @@ void F_StartTitleScreen(void)
|
|||
{
|
||||
titlemapinaction = TITLEMAP_OFF;
|
||||
gamemap = 1; // g_game.c
|
||||
if (!mapheaderinfo[gamemap-1])
|
||||
P_AllocMapHeader(gamemap-1);
|
||||
CON_ClearHUD();
|
||||
}
|
||||
|
||||
|
@ -2669,7 +2636,7 @@ void F_TitleScreenDrawer(void)
|
|||
if (curbgcolor >= 0)
|
||||
V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, curbgcolor);
|
||||
else if (!curbghide || !titlemapinaction || gamestate == GS_WAITINGPLAYERS)
|
||||
F_SkyScroll(curbgxspeed, curbgyspeed, curbgname);
|
||||
F_SkyScroll(curbgname);
|
||||
|
||||
// Don't draw outside of the title screen, or if the patch isn't there.
|
||||
if (gamestate != GS_TITLESCREEN && gamestate != GS_WAITINGPLAYERS)
|
||||
|
@ -3424,10 +3391,10 @@ luahook:
|
|||
|
||||
// separate animation timer for backgrounds, since we also count
|
||||
// during GS_TIMEATTACK
|
||||
void F_MenuPresTicker(boolean run)
|
||||
void F_MenuPresTicker(void)
|
||||
{
|
||||
if (run)
|
||||
menuanimtimer++;
|
||||
curbgx += curbgxspeed;
|
||||
curbgy += curbgyspeed;
|
||||
}
|
||||
|
||||
// (no longer) De-Demo'd Title Screen
|
||||
|
@ -3857,7 +3824,7 @@ static INT32 scenenum, cutnum;
|
|||
static INT32 picxpos, picypos, picnum, pictime, picmode, numpics, pictoloop;
|
||||
static INT32 textxpos, textypos;
|
||||
static boolean cutsceneover = false;
|
||||
static boolean runningprecutscene = false, precutresetplayer = false;
|
||||
static boolean runningprecutscene = false, precutresetplayer = false, precutFLS = false;
|
||||
|
||||
static void F_AdvanceToNextScene(void)
|
||||
{
|
||||
|
@ -3926,7 +3893,7 @@ void F_EndCutScene(void)
|
|||
if (runningprecutscene)
|
||||
{
|
||||
if (server)
|
||||
D_MapChange(gamemap, gametype, ultimatemode, precutresetplayer, 0, true, false);
|
||||
D_MapChange(gamemap, gametype, ultimatemode, precutresetplayer, 0, true, precutFLS);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -3941,7 +3908,7 @@ void F_EndCutScene(void)
|
|||
}
|
||||
}
|
||||
|
||||
void F_StartCustomCutscene(INT32 cutscenenum, boolean precutscene, boolean resetplayer)
|
||||
void F_StartCustomCutscene(INT32 cutscenenum, boolean precutscene, boolean resetplayer, boolean FLS)
|
||||
{
|
||||
if (!cutscenes[cutscenenum])
|
||||
return;
|
||||
|
@ -3960,6 +3927,7 @@ void F_StartCustomCutscene(INT32 cutscenenum, boolean precutscene, boolean reset
|
|||
cutsceneover = false;
|
||||
runningprecutscene = precutscene;
|
||||
precutresetplayer = resetplayer;
|
||||
precutFLS = FLS;
|
||||
|
||||
scenenum = picnum = 0;
|
||||
cutnum = cutscenenum;
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
@ -40,7 +40,7 @@ void F_TextPromptTicker(void);
|
|||
void F_GameEndDrawer(void);
|
||||
void F_IntroDrawer(void);
|
||||
void F_TitleScreenDrawer(void);
|
||||
void F_SkyScroll(INT32 scrollxspeed, INT32 scrollyspeed, const char *patchname);
|
||||
void F_SkyScroll(const char *patchname);
|
||||
|
||||
void F_GameEvaluationDrawer(void);
|
||||
void F_StartGameEvaluation(void);
|
||||
|
@ -52,7 +52,7 @@ void F_EndingDrawer(void);
|
|||
void F_CreditTicker(void);
|
||||
void F_CreditDrawer(void);
|
||||
|
||||
void F_StartCustomCutscene(INT32 cutscenenum, boolean precutscene, boolean resetplayer);
|
||||
void F_StartCustomCutscene(INT32 cutscenenum, boolean precutscene, boolean resetplayer, boolean FLS);
|
||||
void F_CutsceneDrawer(void);
|
||||
void F_EndCutScene(void);
|
||||
|
||||
|
@ -131,7 +131,7 @@ extern UINT16 curtttics;
|
|||
#define TITLEBACKGROUNDACTIVE (curfadevalue >= 0 || curbgname[0])
|
||||
|
||||
void F_InitMenuPresValues(void);
|
||||
void F_MenuPresTicker(boolean run);
|
||||
void F_MenuPresTicker(void);
|
||||
|
||||
//
|
||||
// WIPE
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 2013-2016 by Matthew "Kaito Sinclaire" Walsh.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
|
|
@ -39,6 +39,7 @@
|
|||
|
||||
#define SUFFIX "*"
|
||||
#define SLASH "\\"
|
||||
#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
|
||||
#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
|
||||
|
||||
#ifndef INVALID_FILE_ATTRIBUTES
|
||||
|
@ -307,6 +308,39 @@ closedir (DIR * dirp)
|
|||
}
|
||||
#endif
|
||||
|
||||
// fopen but it REALLY only works on regular files
|
||||
// Turns out, on linux, anyway, you can fopen directories
|
||||
// in read mode. (It's supposed to fail in write mode
|
||||
// though!!)
|
||||
FILE *fopenfile(const char *path, const char *mode)
|
||||
{
|
||||
FILE *h = fopen(path, mode);
|
||||
|
||||
if (h != NULL)
|
||||
{
|
||||
struct stat st;
|
||||
int eno;
|
||||
|
||||
if (fstat(fileno(h), &st) == -1)
|
||||
{
|
||||
eno = errno;
|
||||
}
|
||||
else if (!S_ISREG(st.st_mode))
|
||||
{
|
||||
eno = EACCES; // set some kinda error
|
||||
}
|
||||
else
|
||||
{
|
||||
return h; // ok
|
||||
}
|
||||
|
||||
fclose(h);
|
||||
errno = eno;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static CV_PossibleValue_t addons_cons_t[] = {{0, "Default"},
|
||||
#if 1
|
||||
{1, "HOME"}, {2, "SRB2"},
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
|
427
src/g_game.c
427
src/g_game.c
|
@ -2,7 +2,7 @@
|
|||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
@ -96,6 +96,7 @@ SINT8 startinglivesbalance[maxgameovers+1] = {3, 5, 7, 9, 12, 15, 20, 25, 30, 40
|
|||
UINT16 mainwads = 0;
|
||||
boolean modifiedgame; // Set if homebrew PWAD stuff has been added.
|
||||
boolean savemoddata = false;
|
||||
boolean usedCheats = false; // Set when a gamedata-preventing cheat command is used.
|
||||
UINT8 paused;
|
||||
UINT8 modeattacking = ATTACKING_NONE;
|
||||
boolean disableSpeedAdjust = false;
|
||||
|
@ -184,18 +185,6 @@ INT32 tokenbits; // Used for setting token bits
|
|||
// Old Special Stage
|
||||
INT32 sstimer; // Time allotted in the special stage
|
||||
|
||||
tic_t totalplaytime;
|
||||
boolean gamedataloaded = false;
|
||||
|
||||
// Time attack data for levels
|
||||
// These are dynamically allocated for space reasons now
|
||||
recorddata_t *mainrecords[NUMMAPS] = {NULL};
|
||||
nightsdata_t *nightsrecords[NUMMAPS] = {NULL};
|
||||
UINT8 mapvisited[NUMMAPS];
|
||||
|
||||
// Temporary holding place for nights data for the current map
|
||||
nightsdata_t ntemprecords;
|
||||
|
||||
UINT32 bluescore, redscore; // CTF and Team Match team scores
|
||||
|
||||
// ring count... for PERFECT!
|
||||
|
@ -226,6 +215,7 @@ UINT8 ammoremovaltics = 2*TICRATE;
|
|||
UINT8 use1upSound = 0;
|
||||
UINT8 maxXtraLife = 2; // Max extra lives from rings
|
||||
UINT8 useContinues = 0; // Set to 1 to enable continues outside of no-save scenarioes
|
||||
UINT8 shareEmblems = 0; // Set to 1 to share all picked up emblems in multiplayer
|
||||
|
||||
UINT8 introtoplay;
|
||||
UINT8 creditscutscene;
|
||||
|
@ -251,11 +241,6 @@ INT32 cheats; //for multiplayer cheat commands
|
|||
|
||||
tic_t hidetime;
|
||||
|
||||
// Grading
|
||||
UINT32 timesBeaten;
|
||||
UINT32 timesBeatenWithEmeralds;
|
||||
UINT32 timesBeatenUltimate;
|
||||
|
||||
typedef struct joystickvector2_s
|
||||
{
|
||||
INT32 xaxis;
|
||||
|
@ -364,36 +349,36 @@ consvar_t cv_autobrake2 = CVAR_INIT ("autobrake2", "On", CV_SAVE|CV_CALL, CV_OnO
|
|||
// hi here's some new controls
|
||||
static CV_PossibleValue_t zerotoone_cons_t[] = {{0, "MIN"}, {FRACUNIT, "MAX"}, {0, NULL}};
|
||||
consvar_t cv_cam_shiftfacing[2] = {
|
||||
CVAR_INIT ("cam_shiftfacingchar", "0.375", CV_FLOAT|CV_SAVE, zerotoone_cons_t, NULL),
|
||||
CVAR_INIT ("cam2_shiftfacingchar", "0.375", CV_FLOAT|CV_SAVE, zerotoone_cons_t, NULL),
|
||||
CVAR_INIT ("cam_shiftfacingchar", "0.375", CV_FLOAT|CV_SAVE|CV_ALLOWLUA, zerotoone_cons_t, NULL),
|
||||
CVAR_INIT ("cam2_shiftfacingchar", "0.375", CV_FLOAT|CV_SAVE|CV_ALLOWLUA, zerotoone_cons_t, NULL),
|
||||
};
|
||||
consvar_t cv_cam_turnfacing[2] = {
|
||||
CVAR_INIT ("cam_turnfacingchar", "0.25", CV_FLOAT|CV_SAVE, zerotoone_cons_t, NULL),
|
||||
CVAR_INIT ("cam2_turnfacingchar", "0.25", CV_FLOAT|CV_SAVE, zerotoone_cons_t, NULL),
|
||||
CVAR_INIT ("cam_turnfacingchar", "0.25", CV_FLOAT|CV_SAVE|CV_ALLOWLUA, zerotoone_cons_t, NULL),
|
||||
CVAR_INIT ("cam2_turnfacingchar", "0.25", CV_FLOAT|CV_SAVE|CV_ALLOWLUA, zerotoone_cons_t, NULL),
|
||||
};
|
||||
consvar_t cv_cam_turnfacingability[2] = {
|
||||
CVAR_INIT ("cam_turnfacingability", "0.125", CV_FLOAT|CV_SAVE, zerotoone_cons_t, NULL),
|
||||
CVAR_INIT ("cam2_turnfacingability", "0.125", CV_FLOAT|CV_SAVE, zerotoone_cons_t, NULL),
|
||||
CVAR_INIT ("cam_turnfacingability", "0.125", CV_FLOAT|CV_SAVE|CV_ALLOWLUA, zerotoone_cons_t, NULL),
|
||||
CVAR_INIT ("cam2_turnfacingability", "0.125", CV_FLOAT|CV_SAVE|CV_ALLOWLUA, zerotoone_cons_t, NULL),
|
||||
};
|
||||
consvar_t cv_cam_turnfacingspindash[2] = {
|
||||
CVAR_INIT ("cam_turnfacingspindash", "0.25", CV_FLOAT|CV_SAVE, zerotoone_cons_t, NULL),
|
||||
CVAR_INIT ("cam2_turnfacingspindash", "0.25", CV_FLOAT|CV_SAVE, zerotoone_cons_t, NULL),
|
||||
CVAR_INIT ("cam_turnfacingspindash", "0.25", CV_FLOAT|CV_SAVE|CV_ALLOWLUA, zerotoone_cons_t, NULL),
|
||||
CVAR_INIT ("cam2_turnfacingspindash", "0.25", CV_FLOAT|CV_SAVE|CV_ALLOWLUA, zerotoone_cons_t, NULL),
|
||||
};
|
||||
consvar_t cv_cam_turnfacinginput[2] = {
|
||||
CVAR_INIT ("cam_turnfacinginput", "0.375", CV_FLOAT|CV_SAVE, zerotoone_cons_t, NULL),
|
||||
CVAR_INIT ("cam2_turnfacinginput", "0.375", CV_FLOAT|CV_SAVE, zerotoone_cons_t, NULL),
|
||||
CVAR_INIT ("cam_turnfacinginput", "0.375", CV_FLOAT|CV_SAVE|CV_ALLOWLUA, zerotoone_cons_t, NULL),
|
||||
CVAR_INIT ("cam2_turnfacinginput", "0.375", CV_FLOAT|CV_SAVE|CV_ALLOWLUA, zerotoone_cons_t, NULL),
|
||||
};
|
||||
|
||||
static CV_PossibleValue_t centertoggle_cons_t[] = {{0, "Hold"}, {1, "Toggle"}, {2, "Sticky Hold"}, {0, NULL}};
|
||||
consvar_t cv_cam_centertoggle[2] = {
|
||||
CVAR_INIT ("cam_centertoggle", "Hold", CV_SAVE, centertoggle_cons_t, NULL),
|
||||
CVAR_INIT ("cam2_centertoggle", "Hold", CV_SAVE, centertoggle_cons_t, NULL),
|
||||
CVAR_INIT ("cam_centertoggle", "Hold", CV_SAVE|CV_ALLOWLUA, centertoggle_cons_t, NULL),
|
||||
CVAR_INIT ("cam2_centertoggle", "Hold", CV_SAVE|CV_ALLOWLUA, centertoggle_cons_t, NULL),
|
||||
};
|
||||
|
||||
static CV_PossibleValue_t lockedinput_cons_t[] = {{0, "Strafe"}, {1, "Turn"}, {0, NULL}};
|
||||
consvar_t cv_cam_lockedinput[2] = {
|
||||
CVAR_INIT ("cam_lockedinput", "Strafe", CV_SAVE, lockedinput_cons_t, NULL),
|
||||
CVAR_INIT ("cam2_lockedinput", "Strafe", CV_SAVE, lockedinput_cons_t, NULL),
|
||||
CVAR_INIT ("cam_lockedinput", "Strafe", CV_SAVE|CV_ALLOWLUA, lockedinput_cons_t, NULL),
|
||||
CVAR_INIT ("cam2_lockedinput", "Strafe", CV_SAVE|CV_ALLOWLUA, lockedinput_cons_t, NULL),
|
||||
};
|
||||
|
||||
static CV_PossibleValue_t lockedassist_cons_t[] = {
|
||||
|
@ -405,14 +390,14 @@ static CV_PossibleValue_t lockedassist_cons_t[] = {
|
|||
{0, NULL}
|
||||
};
|
||||
consvar_t cv_cam_lockonboss[2] = {
|
||||
CVAR_INIT ("cam_lockaimassist", "Full", CV_SAVE, lockedassist_cons_t, NULL),
|
||||
CVAR_INIT ("cam2_lockaimassist", "Full", CV_SAVE, lockedassist_cons_t, NULL),
|
||||
CVAR_INIT ("cam_lockaimassist", "Full", CV_SAVE|CV_ALLOWLUA, lockedassist_cons_t, NULL),
|
||||
CVAR_INIT ("cam2_lockaimassist", "Full", CV_SAVE|CV_ALLOWLUA, lockedassist_cons_t, NULL),
|
||||
};
|
||||
|
||||
consvar_t cv_moveaxis = CVAR_INIT ("joyaxis_move", "Y-Axis", CV_SAVE, joyaxis_cons_t, NULL);
|
||||
consvar_t cv_sideaxis = CVAR_INIT ("joyaxis_side", "X-Axis", CV_SAVE, joyaxis_cons_t, NULL);
|
||||
consvar_t cv_lookaxis = CVAR_INIT ("joyaxis_look", "Y-Rudder-", CV_SAVE, joyaxis_cons_t, NULL);
|
||||
consvar_t cv_turnaxis = CVAR_INIT ("joyaxis_turn", "X-Rudder", CV_SAVE, joyaxis_cons_t, NULL);
|
||||
consvar_t cv_lookaxis = CVAR_INIT ("joyaxis_look", "X-Rudder-", CV_SAVE, joyaxis_cons_t, NULL);
|
||||
consvar_t cv_turnaxis = CVAR_INIT ("joyaxis_turn", "Z-Axis", CV_SAVE, joyaxis_cons_t, NULL);
|
||||
consvar_t cv_jumpaxis = CVAR_INIT ("joyaxis_jump", "None", CV_SAVE, joyaxis_cons_t, NULL);
|
||||
consvar_t cv_spinaxis = CVAR_INIT ("joyaxis_spin", "None", CV_SAVE, joyaxis_cons_t, NULL);
|
||||
consvar_t cv_fireaxis = CVAR_INIT ("joyaxis_fire", "Z-Rudder", CV_SAVE, joyaxis_cons_t, NULL);
|
||||
|
@ -422,8 +407,8 @@ consvar_t cv_digitaldeadzone = CVAR_INIT ("joy_digdeadzone", "0.25", CV_FLOAT|CV
|
|||
|
||||
consvar_t cv_moveaxis2 = CVAR_INIT ("joyaxis2_move", "Y-Axis", CV_SAVE, joyaxis_cons_t, NULL);
|
||||
consvar_t cv_sideaxis2 = CVAR_INIT ("joyaxis2_side", "X-Axis", CV_SAVE, joyaxis_cons_t, NULL);
|
||||
consvar_t cv_lookaxis2 = CVAR_INIT ("joyaxis2_look", "Y-Rudder-", CV_SAVE, joyaxis_cons_t, NULL);
|
||||
consvar_t cv_turnaxis2 = CVAR_INIT ("joyaxis2_turn", "X-Rudder", CV_SAVE, joyaxis_cons_t, NULL);
|
||||
consvar_t cv_lookaxis2 = CVAR_INIT ("joyaxis2_look", "X-Rudder-", CV_SAVE, joyaxis_cons_t, NULL);
|
||||
consvar_t cv_turnaxis2 = CVAR_INIT ("joyaxis2_turn", "Z-Axis", CV_SAVE, joyaxis_cons_t, NULL);
|
||||
consvar_t cv_jumpaxis2 = CVAR_INIT ("joyaxis2_jump", "None", CV_SAVE, joyaxis_cons_t, NULL);
|
||||
consvar_t cv_spinaxis2 = CVAR_INIT ("joyaxis2_spin", "None", CV_SAVE, joyaxis_cons_t, NULL);
|
||||
consvar_t cv_fireaxis2 = CVAR_INIT ("joyaxis2_fire", "Z-Rudder", CV_SAVE, joyaxis_cons_t, NULL);
|
||||
|
@ -451,86 +436,86 @@ INT16 rw_maximums[NUM_WEAPONS] =
|
|||
};
|
||||
|
||||
// Allocation for time and nights data
|
||||
void G_AllocMainRecordData(INT16 i)
|
||||
void G_AllocMainRecordData(INT16 i, gamedata_t *data)
|
||||
{
|
||||
if (!mainrecords[i])
|
||||
mainrecords[i] = Z_Malloc(sizeof(recorddata_t), PU_STATIC, NULL);
|
||||
memset(mainrecords[i], 0, sizeof(recorddata_t));
|
||||
if (!data->mainrecords[i])
|
||||
data->mainrecords[i] = Z_Malloc(sizeof(recorddata_t), PU_STATIC, NULL);
|
||||
memset(data->mainrecords[i], 0, sizeof(recorddata_t));
|
||||
}
|
||||
|
||||
void G_AllocNightsRecordData(INT16 i)
|
||||
void G_AllocNightsRecordData(INT16 i, gamedata_t *data)
|
||||
{
|
||||
if (!nightsrecords[i])
|
||||
nightsrecords[i] = Z_Malloc(sizeof(nightsdata_t), PU_STATIC, NULL);
|
||||
memset(nightsrecords[i], 0, sizeof(nightsdata_t));
|
||||
if (!data->nightsrecords[i])
|
||||
data->nightsrecords[i] = Z_Malloc(sizeof(nightsdata_t), PU_STATIC, NULL);
|
||||
memset(data->nightsrecords[i], 0, sizeof(nightsdata_t));
|
||||
}
|
||||
|
||||
// MAKE SURE YOU SAVE DATA BEFORE CALLING THIS
|
||||
void G_ClearRecords(void)
|
||||
void G_ClearRecords(gamedata_t *data)
|
||||
{
|
||||
INT16 i;
|
||||
for (i = 0; i < NUMMAPS; ++i)
|
||||
{
|
||||
if (mainrecords[i])
|
||||
if (data->mainrecords[i])
|
||||
{
|
||||
Z_Free(mainrecords[i]);
|
||||
mainrecords[i] = NULL;
|
||||
Z_Free(data->mainrecords[i]);
|
||||
data->mainrecords[i] = NULL;
|
||||
}
|
||||
if (nightsrecords[i])
|
||||
if (data->nightsrecords[i])
|
||||
{
|
||||
Z_Free(nightsrecords[i]);
|
||||
nightsrecords[i] = NULL;
|
||||
Z_Free(data->nightsrecords[i]);
|
||||
data->nightsrecords[i] = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// For easy retrieval of records
|
||||
UINT32 G_GetBestScore(INT16 map)
|
||||
UINT32 G_GetBestScore(INT16 map, gamedata_t *data)
|
||||
{
|
||||
if (!mainrecords[map-1])
|
||||
if (!data->mainrecords[map-1])
|
||||
return 0;
|
||||
|
||||
return mainrecords[map-1]->score;
|
||||
return data->mainrecords[map-1]->score;
|
||||
}
|
||||
|
||||
tic_t G_GetBestTime(INT16 map)
|
||||
tic_t G_GetBestTime(INT16 map, gamedata_t *data)
|
||||
{
|
||||
if (!mainrecords[map-1] || mainrecords[map-1]->time <= 0)
|
||||
if (!data->mainrecords[map-1] || data->mainrecords[map-1]->time <= 0)
|
||||
return (tic_t)UINT32_MAX;
|
||||
|
||||
return mainrecords[map-1]->time;
|
||||
return data->mainrecords[map-1]->time;
|
||||
}
|
||||
|
||||
UINT16 G_GetBestRings(INT16 map)
|
||||
UINT16 G_GetBestRings(INT16 map, gamedata_t *data)
|
||||
{
|
||||
if (!mainrecords[map-1])
|
||||
if (!data->mainrecords[map-1])
|
||||
return 0;
|
||||
|
||||
return mainrecords[map-1]->rings;
|
||||
return data->mainrecords[map-1]->rings;
|
||||
}
|
||||
|
||||
UINT32 G_GetBestNightsScore(INT16 map, UINT8 mare)
|
||||
UINT32 G_GetBestNightsScore(INT16 map, UINT8 mare, gamedata_t *data)
|
||||
{
|
||||
if (!nightsrecords[map-1])
|
||||
if (!data->nightsrecords[map-1])
|
||||
return 0;
|
||||
|
||||
return nightsrecords[map-1]->score[mare];
|
||||
return data->nightsrecords[map-1]->score[mare];
|
||||
}
|
||||
|
||||
tic_t G_GetBestNightsTime(INT16 map, UINT8 mare)
|
||||
tic_t G_GetBestNightsTime(INT16 map, UINT8 mare, gamedata_t *data)
|
||||
{
|
||||
if (!nightsrecords[map-1] || nightsrecords[map-1]->time[mare] <= 0)
|
||||
if (!data->nightsrecords[map-1] || data->nightsrecords[map-1]->time[mare] <= 0)
|
||||
return (tic_t)UINT32_MAX;
|
||||
|
||||
return nightsrecords[map-1]->time[mare];
|
||||
return data->nightsrecords[map-1]->time[mare];
|
||||
}
|
||||
|
||||
UINT8 G_GetBestNightsGrade(INT16 map, UINT8 mare)
|
||||
UINT8 G_GetBestNightsGrade(INT16 map, UINT8 mare, gamedata_t *data)
|
||||
{
|
||||
if (!nightsrecords[map-1])
|
||||
if (!data->nightsrecords[map-1])
|
||||
return 0;
|
||||
|
||||
return nightsrecords[map-1]->grade[mare];
|
||||
return data->nightsrecords[map-1]->grade[mare];
|
||||
}
|
||||
|
||||
// For easy adding of NiGHTS records
|
||||
|
@ -552,7 +537,7 @@ void G_AddTempNightsRecords(UINT32 pscore, tic_t ptime, UINT8 mare)
|
|||
// Update replay files/data, etc. for Record Attack
|
||||
// See G_SetNightsRecords for NiGHTS Attack.
|
||||
//
|
||||
static void G_UpdateRecordReplays(void)
|
||||
static void G_UpdateRecordReplays(gamedata_t *data)
|
||||
{
|
||||
const size_t glen = strlen(srb2home)+1+strlen("replay")+1+strlen(timeattackfolder)+1+strlen("MAPXX")+1;
|
||||
char *gpath;
|
||||
|
@ -560,17 +545,17 @@ static void G_UpdateRecordReplays(void)
|
|||
UINT8 earnedEmblems;
|
||||
|
||||
// Record new best time
|
||||
if (!mainrecords[gamemap-1])
|
||||
G_AllocMainRecordData(gamemap-1);
|
||||
if (!data->mainrecords[gamemap-1])
|
||||
G_AllocMainRecordData(gamemap-1, data);
|
||||
|
||||
if (players[consoleplayer].score > mainrecords[gamemap-1]->score)
|
||||
mainrecords[gamemap-1]->score = players[consoleplayer].score;
|
||||
if (players[consoleplayer].score > data->mainrecords[gamemap-1]->score)
|
||||
data->mainrecords[gamemap-1]->score = players[consoleplayer].score;
|
||||
|
||||
if ((mainrecords[gamemap-1]->time == 0) || (players[consoleplayer].realtime < mainrecords[gamemap-1]->time))
|
||||
mainrecords[gamemap-1]->time = players[consoleplayer].realtime;
|
||||
if ((data->mainrecords[gamemap-1]->time == 0) || (players[consoleplayer].realtime < data->mainrecords[gamemap-1]->time))
|
||||
data->mainrecords[gamemap-1]->time = players[consoleplayer].realtime;
|
||||
|
||||
if ((UINT16)(players[consoleplayer].rings) > mainrecords[gamemap-1]->rings)
|
||||
mainrecords[gamemap-1]->rings = (UINT16)(players[consoleplayer].rings);
|
||||
if ((UINT16)(players[consoleplayer].rings) > data->mainrecords[gamemap-1]->rings)
|
||||
data->mainrecords[gamemap-1]->rings = (UINT16)(players[consoleplayer].rings);
|
||||
|
||||
// Save demo!
|
||||
bestdemo[255] = '\0';
|
||||
|
@ -626,14 +611,14 @@ static void G_UpdateRecordReplays(void)
|
|||
free(gpath);
|
||||
|
||||
// Check emblems when level data is updated
|
||||
if ((earnedEmblems = M_CheckLevelEmblems()))
|
||||
if ((earnedEmblems = M_CheckLevelEmblems(data)))
|
||||
CONS_Printf(M_GetText("\x82" "Earned %hu emblem%s for Record Attack records.\n"), (UINT16)earnedEmblems, earnedEmblems > 1 ? "s" : "");
|
||||
|
||||
// Update timeattack menu's replay availability.
|
||||
Nextmap_OnChange();
|
||||
}
|
||||
|
||||
void G_SetNightsRecords(void)
|
||||
void G_SetNightsRecords(gamedata_t *data)
|
||||
{
|
||||
INT32 i;
|
||||
UINT32 totalscore = 0;
|
||||
|
@ -674,9 +659,9 @@ void G_SetNightsRecords(void)
|
|||
{
|
||||
nightsdata_t *maprecords;
|
||||
|
||||
if (!nightsrecords[gamemap-1])
|
||||
G_AllocNightsRecordData(gamemap-1);
|
||||
maprecords = nightsrecords[gamemap-1];
|
||||
if (!data->nightsrecords[gamemap-1])
|
||||
G_AllocNightsRecordData(gamemap-1, data);
|
||||
maprecords = data->nightsrecords[gamemap-1];
|
||||
|
||||
if (maprecords->nummares != ntemprecords.nummares)
|
||||
maprecords->nummares = ntemprecords.nummares;
|
||||
|
@ -738,7 +723,7 @@ void G_SetNightsRecords(void)
|
|||
}
|
||||
free(gpath);
|
||||
|
||||
if ((earnedEmblems = M_CheckLevelEmblems()))
|
||||
if ((earnedEmblems = M_CheckLevelEmblems(data)))
|
||||
CONS_Printf(M_GetText("\x82" "Earned %hu emblem%s for NiGHTS records.\n"), (UINT16)earnedEmblems, earnedEmblems > 1 ? "s" : "");
|
||||
|
||||
// If the mare count changed, this will update the score display
|
||||
|
@ -755,7 +740,24 @@ void G_SetGameModified(boolean silent)
|
|||
savemoddata = false;
|
||||
|
||||
if (!silent)
|
||||
CONS_Alert(CONS_NOTICE, M_GetText("Game must be restarted to record statistics.\n"));
|
||||
CONS_Alert(CONS_NOTICE, M_GetText("Game must be restarted to play Record Attack.\n"));
|
||||
|
||||
// If in record attack recording, cancel it.
|
||||
if (modeattacking)
|
||||
M_EndModeAttackRun();
|
||||
else if (marathonmode)
|
||||
Command_ExitGame_f();
|
||||
}
|
||||
|
||||
void G_SetUsedCheats(boolean silent)
|
||||
{
|
||||
if (usedCheats)
|
||||
return;
|
||||
|
||||
usedCheats = true;
|
||||
|
||||
if (!silent)
|
||||
CONS_Alert(CONS_NOTICE, M_GetText("Game must be restarted to save progress.\n"));
|
||||
|
||||
// If in record attack recording, cancel it.
|
||||
if (modeattacking)
|
||||
|
@ -1383,7 +1385,6 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
|
|||
if (
|
||||
P_MobjWasRemoved(ticcmd_ztargetfocus[forplayer]) ||
|
||||
!ticcmd_ztargetfocus[forplayer]->health ||
|
||||
(ticcmd_ztargetfocus[forplayer]->flags2 & MF2_FRET) ||
|
||||
(ticcmd_ztargetfocus[forplayer]->type == MT_EGGMOBILE3 && !ticcmd_ztargetfocus[forplayer]->movecount) // Sea Egg is moving around underground and shouldn't be tracked
|
||||
)
|
||||
P_SetTarget(&ticcmd_ztargetfocus[forplayer], NULL);
|
||||
|
@ -2390,7 +2391,8 @@ void G_Ticker(boolean run)
|
|||
break;
|
||||
|
||||
case GS_TIMEATTACK:
|
||||
F_MenuPresTicker(run);
|
||||
if (run)
|
||||
F_MenuPresTicker();
|
||||
break;
|
||||
|
||||
case GS_INTRO:
|
||||
|
@ -2438,7 +2440,8 @@ void G_Ticker(boolean run)
|
|||
// then intentionally fall through
|
||||
/* FALLTHRU */
|
||||
case GS_WAITINGPLAYERS:
|
||||
F_MenuPresTicker(run);
|
||||
if (run)
|
||||
F_MenuPresTicker();
|
||||
F_TitleScreenTicker(run);
|
||||
break;
|
||||
|
||||
|
@ -2825,6 +2828,9 @@ void G_MovePlayerToSpawnOrStarpost(INT32 playernum)
|
|||
|
||||
R_ResetMobjInterpolationState(players[playernum].mo);
|
||||
|
||||
if (players[playernum].bot) // don't reset the camera for bots
|
||||
return;
|
||||
|
||||
if (playernum == consoleplayer)
|
||||
P_ResetCamera(&players[playernum], &camera);
|
||||
else if (playernum == secondarydisplayplayer)
|
||||
|
@ -3149,6 +3155,9 @@ void G_DoReborn(INT32 playernum)
|
|||
|
||||
if (resetlevel)
|
||||
{
|
||||
// Don't give completion emblems for reloading the level...
|
||||
stagefailed = true;
|
||||
|
||||
// reload the level from scratch
|
||||
if (countdowntimeup)
|
||||
{
|
||||
|
@ -3818,7 +3827,7 @@ static INT16 RandMap(UINT32 tolflags, INT16 pprevmap)
|
|||
for (ix = 0; ix < NUMMAPS; ix++)
|
||||
if (mapheaderinfo[ix] && (mapheaderinfo[ix]->typeoflevel & tolflags) == tolflags
|
||||
&& ix != pprevmap // Don't pick the same map.
|
||||
&& (dedicated || !M_MapLocked(ix+1)) // Don't pick locked maps.
|
||||
&& (dedicated || !M_MapLocked(ix+1, serverGamedata)) // Don't pick locked maps.
|
||||
)
|
||||
okmaps[numokmaps++] = ix;
|
||||
|
||||
|
@ -3835,41 +3844,52 @@ static INT16 RandMap(UINT32 tolflags, INT16 pprevmap)
|
|||
//
|
||||
// G_UpdateVisited
|
||||
//
|
||||
static void G_UpdateVisited(void)
|
||||
static void G_UpdateVisited(gamedata_t *data, boolean silent)
|
||||
{
|
||||
boolean spec = G_IsSpecialStage(gamemap);
|
||||
// Update visitation flags?
|
||||
if ((!modifiedgame || savemoddata) // Not modified
|
||||
&& !multiplayer && !demoplayback && (gametype == GT_COOP) // SP/RA/NiGHTS mode
|
||||
if (!demoplayback
|
||||
&& G_CoopGametype() // Campaign mode
|
||||
&& !stagefailed) // Did not fail the stage
|
||||
{
|
||||
UINT8 earnedEmblems;
|
||||
|
||||
// Update visitation flags
|
||||
mapvisited[gamemap-1] |= MV_BEATEN;
|
||||
data->mapvisited[gamemap-1] |= MV_BEATEN;
|
||||
|
||||
// eh, what the hell
|
||||
if (ultimatemode)
|
||||
mapvisited[gamemap-1] |= MV_ULTIMATE;
|
||||
data->mapvisited[gamemap-1] |= MV_ULTIMATE;
|
||||
|
||||
// may seem incorrect but IS possible in what the main game uses as mp special stages, and nummaprings will be -1 in NiGHTS
|
||||
if (nummaprings > 0 && players[consoleplayer].rings >= nummaprings)
|
||||
{
|
||||
mapvisited[gamemap-1] |= MV_PERFECT;
|
||||
data->mapvisited[gamemap-1] |= MV_PERFECT;
|
||||
if (modeattacking)
|
||||
mapvisited[gamemap-1] |= MV_PERFECTRA;
|
||||
data->mapvisited[gamemap-1] |= MV_PERFECTRA;
|
||||
}
|
||||
|
||||
if (!spec)
|
||||
{
|
||||
// not available to special stages because they can only really be done in one order in an unmodified game, so impossible for first six and trivial for seventh
|
||||
if (ALL7EMERALDS(emeralds))
|
||||
mapvisited[gamemap-1] |= MV_ALLEMERALDS;
|
||||
data->mapvisited[gamemap-1] |= MV_ALLEMERALDS;
|
||||
}
|
||||
|
||||
if (modeattacking == ATTACKING_RECORD)
|
||||
G_UpdateRecordReplays();
|
||||
else if (modeattacking == ATTACKING_NIGHTS)
|
||||
G_SetNightsRecords();
|
||||
if (silent)
|
||||
{
|
||||
if (modeattacking)
|
||||
M_CheckLevelEmblems(data);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (modeattacking == ATTACKING_RECORD)
|
||||
G_UpdateRecordReplays(data);
|
||||
else if (modeattacking == ATTACKING_NIGHTS)
|
||||
G_SetNightsRecords(data);
|
||||
}
|
||||
|
||||
if ((earnedEmblems = M_CompletionEmblems()))
|
||||
if ((earnedEmblems = M_CompletionEmblems(data)) && !silent)
|
||||
CONS_Printf(M_GetText("\x82" "Earned %hu emblem%s for level completion.\n"), (UINT16)earnedEmblems, earnedEmblems > 1 ? "s" : "");
|
||||
}
|
||||
}
|
||||
|
@ -3908,14 +3928,18 @@ static void G_HandleSaveLevel(void)
|
|||
remove(liveeventbackup);
|
||||
cursaveslot = 0;
|
||||
}
|
||||
else if ((!modifiedgame || savemoddata) && !(netgame || multiplayer || ultimatemode || demorecording || metalrecording || modeattacking))
|
||||
else if (!usedCheats && !(netgame || multiplayer || ultimatemode || demorecording || metalrecording || modeattacking))
|
||||
{
|
||||
G_SaveGame((UINT32)cursaveslot, spstage_start);
|
||||
}
|
||||
}
|
||||
}
|
||||
// and doing THIS here means you don't lose your progress if you close the game mid-intermission
|
||||
else if (!(ultimatemode || netgame || multiplayer || demoplayback || demorecording || metalrecording || modeattacking)
|
||||
&& (!modifiedgame || savemoddata) && cursaveslot > 0 && CanSaveLevel(lastmap+1))
|
||||
&& !usedCheats && cursaveslot > 0 && CanSaveLevel(lastmap+1))
|
||||
{
|
||||
G_SaveGame((UINT32)cursaveslot, lastmap+1); // not nextmap+1 to route around special stages
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
|
@ -4068,7 +4092,8 @@ static void G_DoCompleted(void)
|
|||
|
||||
if ((skipstats && !modeattacking) || (modeattacking && stagefailed) || (intertype == int_none))
|
||||
{
|
||||
G_UpdateVisited();
|
||||
G_UpdateVisited(serverGamedata, true);
|
||||
G_UpdateVisited(clientGamedata, false);
|
||||
G_HandleSaveLevel();
|
||||
G_AfterIntermission();
|
||||
}
|
||||
|
@ -4077,7 +4102,8 @@ static void G_DoCompleted(void)
|
|||
G_SetGamestate(GS_INTERMISSION);
|
||||
Y_StartIntermission();
|
||||
Y_LoadIntermissionData();
|
||||
G_UpdateVisited();
|
||||
G_UpdateVisited(serverGamedata, true);
|
||||
G_UpdateVisited(clientGamedata, false);
|
||||
G_HandleSaveLevel();
|
||||
}
|
||||
}
|
||||
|
@ -4105,7 +4131,7 @@ void G_AfterIntermission(void)
|
|||
&& stagefailed == false)
|
||||
{
|
||||
// Start a custom cutscene.
|
||||
F_StartCustomCutscene(mapheaderinfo[gamemap-1]->cutscenenum-1, false, false);
|
||||
F_StartCustomCutscene(mapheaderinfo[gamemap-1]->cutscenenum-1, false, false, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -4191,8 +4217,10 @@ static void G_DoContinued(void)
|
|||
tokenlist = 0;
|
||||
token = 0;
|
||||
|
||||
if (!(netgame || multiplayer || demoplayback || demorecording || metalrecording || modeattacking) && (!modifiedgame || savemoddata) && cursaveslot > 0)
|
||||
if (!(netgame || multiplayer || demoplayback || demorecording || metalrecording || modeattacking) && !usedCheats && cursaveslot > 0)
|
||||
{
|
||||
G_SaveGameOver((UINT32)cursaveslot, true);
|
||||
}
|
||||
|
||||
// Reset # of lives
|
||||
pl->lives = (ultimatemode) ? 1 : startinglivesbalance[numgameovers];
|
||||
|
@ -4257,13 +4285,17 @@ void G_LoadGameSettings(void)
|
|||
S_InitRuntimeSounds();
|
||||
}
|
||||
|
||||
#define GAMEDATA_ID 0x86E4A27C // Change every major version, as usual
|
||||
#define COMPAT_GAMEDATA_ID 0xFCAFE211 // Can be removed entirely for 2.3
|
||||
|
||||
// G_LoadGameData
|
||||
// Loads the main data file, which stores information such as emblems found, etc.
|
||||
void G_LoadGameData(void)
|
||||
void G_LoadGameData(gamedata_t *data)
|
||||
{
|
||||
size_t length;
|
||||
INT32 i, j;
|
||||
UINT8 modded = false;
|
||||
|
||||
UINT32 versionID;
|
||||
UINT8 rtemp;
|
||||
|
||||
//For records
|
||||
|
@ -4274,34 +4306,45 @@ void G_LoadGameData(void)
|
|||
UINT8 recmares;
|
||||
INT32 curmare;
|
||||
|
||||
// Stop saving, until we successfully load it again.
|
||||
data->loaded = false;
|
||||
|
||||
// Clear things so previously read gamedata doesn't transfer
|
||||
// to new gamedata
|
||||
G_ClearRecords(); // main and nights records
|
||||
M_ClearSecrets(); // emblems, unlocks, maps visited, etc
|
||||
totalplaytime = 0; // total play time (separate from all)
|
||||
G_ClearRecords(data); // main and nights records
|
||||
M_ClearSecrets(data); // emblems, unlocks, maps visited, etc
|
||||
data->totalplaytime = 0; // total play time (separate from all)
|
||||
|
||||
if (M_CheckParm("-nodata"))
|
||||
return; // Don't load.
|
||||
|
||||
// Allow saving of gamedata beyond this point
|
||||
gamedataloaded = true;
|
||||
|
||||
if (M_CheckParm("-gamedata") && M_IsNextParm())
|
||||
{
|
||||
strlcpy(gamedatafilename, M_GetNextParm(), sizeof gamedatafilename);
|
||||
// Don't load at all.
|
||||
return;
|
||||
}
|
||||
|
||||
if (M_CheckParm("-resetdata"))
|
||||
return; // Don't load (essentially, reset).
|
||||
{
|
||||
// Don't load, but do save. (essentially, reset)
|
||||
data->loaded = true;
|
||||
return;
|
||||
}
|
||||
|
||||
length = FIL_ReadFile(va(pandf, srb2home, gamedatafilename), &savebuffer);
|
||||
if (!length) // Aw, no game data. Their loss!
|
||||
if (!length)
|
||||
{
|
||||
// No gamedata. We can save a new one.
|
||||
data->loaded = true;
|
||||
return;
|
||||
}
|
||||
|
||||
save_p = savebuffer;
|
||||
|
||||
// Version check
|
||||
if (READUINT32(save_p) != 0xFCAFE211)
|
||||
versionID = READUINT32(save_p);
|
||||
if (versionID != GAMEDATA_ID
|
||||
#ifdef COMPAT_GAMEDATA_ID // backwards compat behavior
|
||||
&& versionID != COMPAT_GAMEDATA_ID
|
||||
#endif
|
||||
)
|
||||
{
|
||||
const char *gdfolder = "the SRB2 folder";
|
||||
if (strcmp(srb2home,"."))
|
||||
|
@ -4312,19 +4355,41 @@ void G_LoadGameData(void)
|
|||
I_Error("Game data is from another version of SRB2.\nDelete %s(maybe in %s) and try again.", gamedatafilename, gdfolder);
|
||||
}
|
||||
|
||||
totalplaytime = READUINT32(save_p);
|
||||
data->totalplaytime = READUINT32(save_p);
|
||||
|
||||
modded = READUINT8(save_p);
|
||||
#ifdef COMPAT_GAMEDATA_ID
|
||||
if (versionID == COMPAT_GAMEDATA_ID)
|
||||
{
|
||||
// We'll temporarily use the old condition when loading an older file.
|
||||
// The proper mod-specific hash will get saved in afterwards.
|
||||
boolean modded = READUINT8(save_p);
|
||||
|
||||
// Aha! Someone's been screwing with the save file!
|
||||
if ((modded && !savemoddata))
|
||||
goto datacorrupt;
|
||||
else if (modded != true && modded != false)
|
||||
goto datacorrupt;
|
||||
if (modded && !savemoddata)
|
||||
{
|
||||
goto datacorrupt;
|
||||
}
|
||||
else if (modded != true && modded != false)
|
||||
{
|
||||
goto datacorrupt;
|
||||
}
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
// Quick & dirty hash for what mod this save file is for.
|
||||
UINT32 modID = READUINT32(save_p);
|
||||
UINT32 expectedID = quickncasehash(timeattackfolder, sizeof timeattackfolder);
|
||||
|
||||
if (modID != expectedID)
|
||||
{
|
||||
// Aha! Someone's been screwing with the save file!
|
||||
goto datacorrupt;
|
||||
}
|
||||
}
|
||||
|
||||
// TODO put another cipher on these things? meh, I don't care...
|
||||
for (i = 0; i < NUMMAPS; i++)
|
||||
if ((mapvisited[i] = READUINT8(save_p)) > MV_MAX)
|
||||
if ((data->mapvisited[i] = READUINT8(save_p)) > MV_MAX)
|
||||
goto datacorrupt;
|
||||
|
||||
// To save space, use one bit per collected/achieved/unlocked flag
|
||||
|
@ -4332,34 +4397,34 @@ void G_LoadGameData(void)
|
|||
{
|
||||
rtemp = READUINT8(save_p);
|
||||
for (j = 0; j < 8 && j+i < MAXEMBLEMS; ++j)
|
||||
emblemlocations[j+i].collected = ((rtemp >> j) & 1);
|
||||
data->collected[j+i] = ((rtemp >> j) & 1);
|
||||
i += j;
|
||||
}
|
||||
for (i = 0; i < MAXEXTRAEMBLEMS;)
|
||||
{
|
||||
rtemp = READUINT8(save_p);
|
||||
for (j = 0; j < 8 && j+i < MAXEXTRAEMBLEMS; ++j)
|
||||
extraemblems[j+i].collected = ((rtemp >> j) & 1);
|
||||
data->extraCollected[j+i] = ((rtemp >> j) & 1);
|
||||
i += j;
|
||||
}
|
||||
for (i = 0; i < MAXUNLOCKABLES;)
|
||||
{
|
||||
rtemp = READUINT8(save_p);
|
||||
for (j = 0; j < 8 && j+i < MAXUNLOCKABLES; ++j)
|
||||
unlockables[j+i].unlocked = ((rtemp >> j) & 1);
|
||||
data->unlocked[j+i] = ((rtemp >> j) & 1);
|
||||
i += j;
|
||||
}
|
||||
for (i = 0; i < MAXCONDITIONSETS;)
|
||||
{
|
||||
rtemp = READUINT8(save_p);
|
||||
for (j = 0; j < 8 && j+i < MAXCONDITIONSETS; ++j)
|
||||
conditionSets[j+i].achieved = ((rtemp >> j) & 1);
|
||||
data->achieved[j+i] = ((rtemp >> j) & 1);
|
||||
i += j;
|
||||
}
|
||||
|
||||
timesBeaten = READUINT32(save_p);
|
||||
timesBeatenWithEmeralds = READUINT32(save_p);
|
||||
timesBeatenUltimate = READUINT32(save_p);
|
||||
data->timesBeaten = READUINT32(save_p);
|
||||
data->timesBeatenWithEmeralds = READUINT32(save_p);
|
||||
data->timesBeatenUltimate = READUINT32(save_p);
|
||||
|
||||
// Main records
|
||||
for (i = 0; i < NUMMAPS; ++i)
|
||||
|
@ -4374,10 +4439,10 @@ void G_LoadGameData(void)
|
|||
|
||||
if (recscore || rectime || recrings)
|
||||
{
|
||||
G_AllocMainRecordData((INT16)i);
|
||||
mainrecords[i]->score = recscore;
|
||||
mainrecords[i]->time = rectime;
|
||||
mainrecords[i]->rings = recrings;
|
||||
G_AllocMainRecordData((INT16)i, data);
|
||||
data->mainrecords[i]->score = recscore;
|
||||
data->mainrecords[i]->time = rectime;
|
||||
data->mainrecords[i]->rings = recrings;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4387,27 +4452,36 @@ void G_LoadGameData(void)
|
|||
if ((recmares = READUINT8(save_p)) == 0)
|
||||
continue;
|
||||
|
||||
G_AllocNightsRecordData((INT16)i);
|
||||
G_AllocNightsRecordData((INT16)i, data);
|
||||
|
||||
for (curmare = 0; curmare < (recmares+1); ++curmare)
|
||||
{
|
||||
nightsrecords[i]->score[curmare] = READUINT32(save_p);
|
||||
nightsrecords[i]->grade[curmare] = READUINT8(save_p);
|
||||
nightsrecords[i]->time[curmare] = (tic_t)READUINT32(save_p);
|
||||
data->nightsrecords[i]->score[curmare] = READUINT32(save_p);
|
||||
data->nightsrecords[i]->grade[curmare] = READUINT8(save_p);
|
||||
data->nightsrecords[i]->time[curmare] = (tic_t)READUINT32(save_p);
|
||||
|
||||
if (nightsrecords[i]->grade[curmare] > GRADE_S)
|
||||
if (data->nightsrecords[i]->grade[curmare] > GRADE_S)
|
||||
{
|
||||
goto datacorrupt;
|
||||
}
|
||||
}
|
||||
|
||||
nightsrecords[i]->nummares = recmares;
|
||||
data->nightsrecords[i]->nummares = recmares;
|
||||
}
|
||||
|
||||
// done
|
||||
Z_Free(savebuffer);
|
||||
save_p = NULL;
|
||||
|
||||
// Don't consider loaded until it's a success!
|
||||
// It used to do this much earlier, but this would cause the gamedata to
|
||||
// save over itself when it I_Errors from the corruption landing point below,
|
||||
// which can accidentally delete players' legitimate data if the code ever has any tiny mistakes!
|
||||
data->loaded = true;
|
||||
|
||||
// Silent update unlockables in case they're out of sync with conditions
|
||||
M_SilentUpdateUnlockablesAndEmblems();
|
||||
M_SilentUpdateUnlockablesAndEmblems(data);
|
||||
M_SilentUpdateSkinAvailabilites();
|
||||
|
||||
return;
|
||||
|
||||
|
@ -4427,7 +4501,7 @@ void G_LoadGameData(void)
|
|||
|
||||
// G_SaveGameData
|
||||
// Saves the main data file, which stores information such as emblems found, etc.
|
||||
void G_SaveGameData(void)
|
||||
void G_SaveGameData(gamedata_t *data)
|
||||
{
|
||||
size_t length;
|
||||
INT32 i, j;
|
||||
|
@ -4435,7 +4509,7 @@ void G_SaveGameData(void)
|
|||
|
||||
INT32 curmare;
|
||||
|
||||
if (!gamedataloaded)
|
||||
if (!data->loaded)
|
||||
return; // If never loaded (-nodata), don't save
|
||||
|
||||
save_p = savebuffer = (UINT8 *)malloc(GAMEDATASIZE);
|
||||
|
@ -4445,7 +4519,7 @@ void G_SaveGameData(void)
|
|||
return;
|
||||
}
|
||||
|
||||
if (modifiedgame && !savemoddata)
|
||||
if (usedCheats)
|
||||
{
|
||||
free(savebuffer);
|
||||
save_p = savebuffer = NULL;
|
||||
|
@ -4453,23 +4527,22 @@ void G_SaveGameData(void)
|
|||
}
|
||||
|
||||
// Version test
|
||||
WRITEUINT32(save_p, 0xFCAFE211);
|
||||
WRITEUINT32(save_p, GAMEDATA_ID);
|
||||
|
||||
WRITEUINT32(save_p, totalplaytime);
|
||||
WRITEUINT32(save_p, data->totalplaytime);
|
||||
|
||||
btemp = (UINT8)(savemoddata || modifiedgame);
|
||||
WRITEUINT8(save_p, btemp);
|
||||
WRITEUINT32(save_p, quickncasehash(timeattackfolder, sizeof timeattackfolder));
|
||||
|
||||
// TODO put another cipher on these things? meh, I don't care...
|
||||
for (i = 0; i < NUMMAPS; i++)
|
||||
WRITEUINT8(save_p, (mapvisited[i] & MV_MAX));
|
||||
WRITEUINT8(save_p, (data->mapvisited[i] & MV_MAX));
|
||||
|
||||
// To save space, use one bit per collected/achieved/unlocked flag
|
||||
for (i = 0; i < MAXEMBLEMS;)
|
||||
{
|
||||
btemp = 0;
|
||||
for (j = 0; j < 8 && j+i < MAXEMBLEMS; ++j)
|
||||
btemp |= (emblemlocations[j+i].collected << j);
|
||||
btemp |= (data->collected[j+i] << j);
|
||||
WRITEUINT8(save_p, btemp);
|
||||
i += j;
|
||||
}
|
||||
|
@ -4477,7 +4550,7 @@ void G_SaveGameData(void)
|
|||
{
|
||||
btemp = 0;
|
||||
for (j = 0; j < 8 && j+i < MAXEXTRAEMBLEMS; ++j)
|
||||
btemp |= (extraemblems[j+i].collected << j);
|
||||
btemp |= (data->extraCollected[j+i] << j);
|
||||
WRITEUINT8(save_p, btemp);
|
||||
i += j;
|
||||
}
|
||||
|
@ -4485,7 +4558,7 @@ void G_SaveGameData(void)
|
|||
{
|
||||
btemp = 0;
|
||||
for (j = 0; j < 8 && j+i < MAXUNLOCKABLES; ++j)
|
||||
btemp |= (unlockables[j+i].unlocked << j);
|
||||
btemp |= (data->unlocked[j+i] << j);
|
||||
WRITEUINT8(save_p, btemp);
|
||||
i += j;
|
||||
}
|
||||
|
@ -4493,23 +4566,23 @@ void G_SaveGameData(void)
|
|||
{
|
||||
btemp = 0;
|
||||
for (j = 0; j < 8 && j+i < MAXCONDITIONSETS; ++j)
|
||||
btemp |= (conditionSets[j+i].achieved << j);
|
||||
btemp |= (data->achieved[j+i] << j);
|
||||
WRITEUINT8(save_p, btemp);
|
||||
i += j;
|
||||
}
|
||||
|
||||
WRITEUINT32(save_p, timesBeaten);
|
||||
WRITEUINT32(save_p, timesBeatenWithEmeralds);
|
||||
WRITEUINT32(save_p, timesBeatenUltimate);
|
||||
WRITEUINT32(save_p, data->timesBeaten);
|
||||
WRITEUINT32(save_p, data->timesBeatenWithEmeralds);
|
||||
WRITEUINT32(save_p, data->timesBeatenUltimate);
|
||||
|
||||
// Main records
|
||||
for (i = 0; i < NUMMAPS; i++)
|
||||
{
|
||||
if (mainrecords[i])
|
||||
if (data->mainrecords[i])
|
||||
{
|
||||
WRITEUINT32(save_p, mainrecords[i]->score);
|
||||
WRITEUINT32(save_p, mainrecords[i]->time);
|
||||
WRITEUINT16(save_p, mainrecords[i]->rings);
|
||||
WRITEUINT32(save_p, data->mainrecords[i]->score);
|
||||
WRITEUINT32(save_p, data->mainrecords[i]->time);
|
||||
WRITEUINT16(save_p, data->mainrecords[i]->rings);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -4523,19 +4596,19 @@ void G_SaveGameData(void)
|
|||
// NiGHTS records
|
||||
for (i = 0; i < NUMMAPS; i++)
|
||||
{
|
||||
if (!nightsrecords[i] || !nightsrecords[i]->nummares)
|
||||
if (!data->nightsrecords[i] || !data->nightsrecords[i]->nummares)
|
||||
{
|
||||
WRITEUINT8(save_p, 0);
|
||||
continue;
|
||||
}
|
||||
|
||||
WRITEUINT8(save_p, nightsrecords[i]->nummares);
|
||||
WRITEUINT8(save_p, data->nightsrecords[i]->nummares);
|
||||
|
||||
for (curmare = 0; curmare < (nightsrecords[i]->nummares + 1); ++curmare)
|
||||
for (curmare = 0; curmare < (data->nightsrecords[i]->nummares + 1); ++curmare)
|
||||
{
|
||||
WRITEUINT32(save_p, nightsrecords[i]->score[curmare]);
|
||||
WRITEUINT8(save_p, nightsrecords[i]->grade[curmare]);
|
||||
WRITEUINT32(save_p, nightsrecords[i]->time[curmare]);
|
||||
WRITEUINT32(save_p, data->nightsrecords[i]->score[curmare]);
|
||||
WRITEUINT8(save_p, data->nightsrecords[i]->grade[curmare]);
|
||||
WRITEUINT32(save_p, data->nightsrecords[i]->time[curmare]);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4955,7 +5028,7 @@ void G_InitNew(UINT8 pultmode, const char *mapname, boolean resetplayer, boolean
|
|||
imcontinuing = false;
|
||||
|
||||
if ((gametyperules & GTR_CUTSCENES) && !skipprecutscene && mapheaderinfo[gamemap-1]->precutscenenum && !modeattacking && !(marathonmode & MA_NOCUTSCENES)) // Start a custom cutscene.
|
||||
F_StartCustomCutscene(mapheaderinfo[gamemap-1]->precutscenenum-1, true, resetplayer);
|
||||
F_StartCustomCutscene(mapheaderinfo[gamemap-1]->precutscenenum-1, true, resetplayer, FLS);
|
||||
else
|
||||
G_DoLoadLevel(resetplayer);
|
||||
|
||||
|
|
28
src/g_game.h
28
src/g_game.h
|
@ -2,7 +2,7 @@
|
|||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
@ -19,6 +19,7 @@
|
|||
#include "d_event.h"
|
||||
#include "g_demo.h"
|
||||
#include "m_cheat.h" // objectplacing
|
||||
#include "m_cond.h"
|
||||
|
||||
extern char gamedatafilename[64];
|
||||
extern char timeattackfolder[64];
|
||||
|
@ -183,7 +184,7 @@ boolean G_IsTitleCardAvailable(void);
|
|||
// Can be called by the startup code or M_Responder, calls P_SetupLevel.
|
||||
void G_LoadGame(UINT32 slot, INT16 mapoverride);
|
||||
|
||||
void G_SaveGameData(void);
|
||||
void G_SaveGameData(gamedata_t *data);
|
||||
|
||||
void G_SaveGame(UINT32 slot, INT16 mapnum);
|
||||
|
||||
|
@ -239,27 +240,28 @@ void G_SetModeAttackRetryFlag(void);
|
|||
void G_ClearModeAttackRetryFlag(void);
|
||||
boolean G_GetModeAttackRetryFlag(void);
|
||||
|
||||
void G_LoadGameData(void);
|
||||
void G_LoadGameData(gamedata_t *data);
|
||||
void G_LoadGameSettings(void);
|
||||
|
||||
void G_SetGameModified(boolean silent);
|
||||
void G_SetUsedCheats(boolean silent);
|
||||
|
||||
void G_SetGamestate(gamestate_t newstate);
|
||||
|
||||
// Gamedata record shit
|
||||
void G_AllocMainRecordData(INT16 i);
|
||||
void G_AllocNightsRecordData(INT16 i);
|
||||
void G_ClearRecords(void);
|
||||
void G_AllocMainRecordData(INT16 i, gamedata_t *data);
|
||||
void G_AllocNightsRecordData(INT16 i, gamedata_t *data);
|
||||
void G_ClearRecords(gamedata_t *data);
|
||||
|
||||
UINT32 G_GetBestScore(INT16 map);
|
||||
tic_t G_GetBestTime(INT16 map);
|
||||
UINT16 G_GetBestRings(INT16 map);
|
||||
UINT32 G_GetBestNightsScore(INT16 map, UINT8 mare);
|
||||
tic_t G_GetBestNightsTime(INT16 map, UINT8 mare);
|
||||
UINT8 G_GetBestNightsGrade(INT16 map, UINT8 mare);
|
||||
UINT32 G_GetBestScore(INT16 map, gamedata_t *data);
|
||||
tic_t G_GetBestTime(INT16 map, gamedata_t *data);
|
||||
UINT16 G_GetBestRings(INT16 map, gamedata_t *data);
|
||||
UINT32 G_GetBestNightsScore(INT16 map, UINT8 mare, gamedata_t *data);
|
||||
tic_t G_GetBestNightsTime(INT16 map, UINT8 mare, gamedata_t *data);
|
||||
UINT8 G_GetBestNightsGrade(INT16 map, UINT8 mare, gamedata_t *data);
|
||||
|
||||
void G_AddTempNightsRecords(UINT32 pscore, tic_t ptime, UINT8 mare);
|
||||
void G_SetNightsRecords(void);
|
||||
void G_SetNightsRecords(gamedata_t *data);
|
||||
|
||||
FUNCMATH INT32 G_TicsToHours(tic_t tics);
|
||||
FUNCMATH INT32 G_TicsToMinutes(tic_t tics, boolean full);
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
@ -993,7 +993,7 @@ static void setcontrol(INT32 (*gc)[2])
|
|||
{
|
||||
INT32 numctrl;
|
||||
const char *namectrl;
|
||||
INT32 keynum, keynum1, keynum2;
|
||||
INT32 keynum, keynum1, keynum2 = 0;
|
||||
INT32 player = ((void*)gc == (void*)&gamecontrolbis ? 1 : 0);
|
||||
boolean nestedoverride = false;
|
||||
|
||||
|
@ -1009,7 +1009,8 @@ static void setcontrol(INT32 (*gc)[2])
|
|||
return;
|
||||
}
|
||||
keynum1 = G_KeyNameToNum(COM_Argv(2));
|
||||
keynum2 = G_KeyNameToNum(COM_Argv(3));
|
||||
if (COM_Argc() > 3)
|
||||
keynum2 = G_KeyNameToNum(COM_Argv(3));
|
||||
keynum = G_FilterKeyByVersion(numctrl, 0, player, &keynum1, &keynum2, &nestedoverride);
|
||||
|
||||
if (keynum >= 0)
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 2020-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 2020-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 2020-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 2020-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
@ -136,6 +136,7 @@ typedef struct
|
|||
// Predefined shader types
|
||||
enum
|
||||
{
|
||||
SHADER_NONE = -1,
|
||||
SHADER_DEFAULT = 0,
|
||||
|
||||
SHADER_FLOOR,
|
||||
|
@ -237,7 +238,8 @@ enum EPolyFlags
|
|||
PF_RemoveYWrap = 0x00010000, // Forces clamp texture on Y
|
||||
PF_ForceWrapX = 0x00020000, // Forces repeat texture on X
|
||||
PF_ForceWrapY = 0x00040000, // Forces repeat texture on Y
|
||||
PF_Ripple = 0x00100000 // Water ripple effect. The current backend doesn't use it for anything.
|
||||
PF_Ripple = 0x00100000, // Water ripple effect. The current backend doesn't use it for anything.
|
||||
PF_WireFrame = 0x00200000, // Draws vertices as lines instead of triangles
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
@ -81,6 +81,7 @@ typedef struct gl_vissprite_s
|
|||
|
||||
boolean flip, vflip;
|
||||
boolean precip; // Tails 08-25-2002
|
||||
boolean bbox;
|
||||
boolean rotated;
|
||||
UINT8 translucency; //alpha level 0-255
|
||||
|
||||
|
@ -88,7 +89,7 @@ typedef struct gl_vissprite_s
|
|||
|
||||
//Hurdler: 25/04/2000: now support colormap in hardware mode
|
||||
UINT8 *colormap;
|
||||
INT32 dispoffset; // copy of info->dispoffset, affects ordering but not drawing
|
||||
INT32 dispoffset; // copy of mobj->dispoffset, affects ordering but not drawing
|
||||
|
||||
patch_t *gpatch;
|
||||
mobj_t *mobj; // NOTE: This is a precipmobj_t if precip is true !!! Watch out.
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
@ -66,6 +66,7 @@ static void HWR_ProjectSprite(mobj_t *thing);
|
|||
#ifdef HWPRECIP
|
||||
static void HWR_ProjectPrecipitationSprite(precipmobj_t *thing);
|
||||
#endif
|
||||
static void HWR_ProjectBoundingBox(mobj_t *thing);
|
||||
|
||||
void HWR_AddTransparentFloor(levelflat_t *levelflat, extrasubsector_t *xsub, boolean isceiling, fixed_t fixedheight, INT32 lightlevel, INT32 alpha, sector_t *FOFSector, FBITFIELD blend, boolean fogplane, extracolormap_t *planecolormap);
|
||||
void HWR_AddTransparentPolyobjectFloor(levelflat_t *levelflat, polyobj_t *polysector, boolean isceiling, fixed_t fixedheight,
|
||||
|
@ -1153,7 +1154,7 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
|
|||
else
|
||||
texturevpeg = gl_backsector->ceilingheight + textureheight[gl_toptexture] - gl_frontsector->ceilingheight;
|
||||
|
||||
texturevpeg += gl_sidedef->rowoffset;
|
||||
texturevpeg += gl_sidedef->rowoffset + gl_sidedef->offsety_top;
|
||||
|
||||
// This is so that it doesn't overflow and screw up the wall, it doesn't need to go higher than the texture's height anyway
|
||||
texturevpeg %= textureheight[gl_toptexture];
|
||||
|
@ -1162,8 +1163,8 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
|
|||
|
||||
wallVerts[3].t = wallVerts[2].t = texturevpeg * grTex->scaleY;
|
||||
wallVerts[0].t = wallVerts[1].t = (texturevpeg + gl_frontsector->ceilingheight - gl_backsector->ceilingheight) * grTex->scaleY;
|
||||
wallVerts[0].s = wallVerts[3].s = cliplow * grTex->scaleX;
|
||||
wallVerts[2].s = wallVerts[1].s = cliphigh * grTex->scaleX;
|
||||
wallVerts[0].s = wallVerts[3].s = (cliplow + gl_sidedef->offsetx_top) * grTex->scaleX;
|
||||
wallVerts[2].s = wallVerts[1].s = (cliphigh + gl_sidedef->offsetx_top) * grTex->scaleX;
|
||||
|
||||
// Adjust t value for sloped walls
|
||||
if (!(gl_linedef->flags & ML_SKEWTD))
|
||||
|
@ -1213,7 +1214,7 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
|
|||
else
|
||||
texturevpeg = gl_frontsector->floorheight - gl_backsector->floorheight;
|
||||
|
||||
texturevpeg += gl_sidedef->rowoffset;
|
||||
texturevpeg += gl_sidedef->rowoffset + gl_sidedef->offsety_bot;
|
||||
|
||||
// This is so that it doesn't overflow and screw up the wall, it doesn't need to go higher than the texture's height anyway
|
||||
texturevpeg %= textureheight[gl_bottomtexture];
|
||||
|
@ -1222,8 +1223,8 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
|
|||
|
||||
wallVerts[3].t = wallVerts[2].t = texturevpeg * grTex->scaleY;
|
||||
wallVerts[0].t = wallVerts[1].t = (texturevpeg + gl_backsector->floorheight - gl_frontsector->floorheight) * grTex->scaleY;
|
||||
wallVerts[0].s = wallVerts[3].s = cliplow * grTex->scaleX;
|
||||
wallVerts[2].s = wallVerts[1].s = cliphigh * grTex->scaleX;
|
||||
wallVerts[0].s = wallVerts[3].s = (cliplow + gl_sidedef->offsetx_bot) * grTex->scaleX;
|
||||
wallVerts[2].s = wallVerts[1].s = (cliphigh + gl_sidedef->offsetx_bot) * grTex->scaleX;
|
||||
|
||||
// Adjust t value for sloped walls
|
||||
if (!(gl_linedef->flags & ML_SKEWTD))
|
||||
|
@ -1333,13 +1334,13 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
|
|||
// Peg it to the floor
|
||||
if (gl_linedef->flags & ML_MIDPEG)
|
||||
{
|
||||
polybottom = max(front->floorheight, back->floorheight) + gl_sidedef->rowoffset;
|
||||
polybottom = max(front->floorheight, back->floorheight) + gl_sidedef->rowoffset + gl_sidedef->offsety_mid;
|
||||
polytop = polybottom + midtexheight;
|
||||
}
|
||||
// Peg it to the ceiling
|
||||
else
|
||||
{
|
||||
polytop = min(front->ceilingheight, back->ceilingheight) + gl_sidedef->rowoffset;
|
||||
polytop = min(front->ceilingheight, back->ceilingheight) + gl_sidedef->rowoffset + gl_sidedef->offsety_mid;
|
||||
polybottom = polytop - midtexheight;
|
||||
}
|
||||
|
||||
|
@ -1350,9 +1351,9 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
|
|||
// Skew the texture, but peg it to the floor
|
||||
else if (gl_linedef->flags & ML_MIDPEG)
|
||||
{
|
||||
polybottom = popenbottom + gl_sidedef->rowoffset;
|
||||
polybottom = popenbottom + gl_sidedef->rowoffset + gl_sidedef->offsety_mid;
|
||||
polytop = polybottom + midtexheight;
|
||||
polybottomslope = popenbottomslope + gl_sidedef->rowoffset;
|
||||
polybottomslope = popenbottomslope + gl_sidedef->rowoffset + gl_sidedef->offsety_mid;
|
||||
polytopslope = polybottomslope + midtexheight;
|
||||
}
|
||||
// Skew it according to the ceiling's slope
|
||||
|
@ -1407,12 +1408,12 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
|
|||
// Left side
|
||||
wallVerts[3].t = texturevpeg * grTex->scaleY;
|
||||
wallVerts[0].t = (h - l + texturevpeg) * grTex->scaleY;
|
||||
wallVerts[0].s = wallVerts[3].s = cliplow * grTex->scaleX;
|
||||
wallVerts[0].s = wallVerts[3].s = (cliplow + gl_sidedef->offsetx_mid) * grTex->scaleX;
|
||||
|
||||
// Right side
|
||||
wallVerts[2].t = texturevpegslope * grTex->scaleY;
|
||||
wallVerts[1].t = (hS - lS + texturevpegslope) * grTex->scaleY;
|
||||
wallVerts[2].s = wallVerts[1].s = cliphigh * grTex->scaleX;
|
||||
wallVerts[2].s = wallVerts[1].s = (cliphigh + gl_sidedef->offsetx_mid) * grTex->scaleX;
|
||||
|
||||
// set top/bottom coords
|
||||
// Take the texture peg into account, rather than changing the offsets past
|
||||
|
@ -1474,19 +1475,19 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
|
|||
|
||||
// PEGGING
|
||||
if ((gl_linedef->flags & (ML_DONTPEGBOTTOM|ML_NOSKEW)) == (ML_DONTPEGBOTTOM|ML_NOSKEW))
|
||||
texturevpeg = gl_frontsector->floorheight + textureheight[gl_sidedef->midtexture] - gl_frontsector->ceilingheight + gl_sidedef->rowoffset;
|
||||
texturevpeg = gl_frontsector->floorheight + textureheight[gl_sidedef->midtexture] - gl_frontsector->ceilingheight + gl_sidedef->rowoffset + gl_sidedef->offsety_mid;
|
||||
else if (gl_linedef->flags & ML_DONTPEGBOTTOM)
|
||||
texturevpeg = worldbottom + textureheight[gl_sidedef->midtexture] - worldtop + gl_sidedef->rowoffset;
|
||||
texturevpeg = worldbottom + textureheight[gl_sidedef->midtexture] - worldtop + gl_sidedef->rowoffset + gl_sidedef->offsety_mid;
|
||||
else
|
||||
// top of texture at top
|
||||
texturevpeg = gl_sidedef->rowoffset;
|
||||
texturevpeg = gl_sidedef->rowoffset + gl_sidedef->offsety_mid;
|
||||
|
||||
grTex = HWR_GetTexture(gl_midtexture);
|
||||
|
||||
wallVerts[3].t = wallVerts[2].t = texturevpeg * grTex->scaleY;
|
||||
wallVerts[0].t = wallVerts[1].t = (texturevpeg + gl_frontsector->ceilingheight - gl_frontsector->floorheight) * grTex->scaleY;
|
||||
wallVerts[0].s = wallVerts[3].s = cliplow * grTex->scaleX;
|
||||
wallVerts[2].s = wallVerts[1].s = cliphigh * grTex->scaleX;
|
||||
wallVerts[0].s = wallVerts[3].s = (cliplow + gl_sidedef->offsetx_mid) * grTex->scaleX;
|
||||
wallVerts[2].s = wallVerts[1].s = (cliphigh + gl_sidedef->offsetx_mid) * grTex->scaleX;
|
||||
|
||||
// Texture correction for slopes
|
||||
if (gl_linedef->flags & ML_NOSKEW) {
|
||||
|
@ -1634,13 +1635,13 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
|
|||
// -- Monster Iestyn 26/06/18
|
||||
if (newline)
|
||||
{
|
||||
texturevpeg = sides[newline->sidenum[0]].rowoffset;
|
||||
texturevpeg = sides[newline->sidenum[0]].rowoffset + sides[newline->sidenum[0]].offsety_mid;
|
||||
attachtobottom = !!(newline->flags & ML_DONTPEGBOTTOM);
|
||||
slopeskew = !!(newline->flags & ML_SKEWTD);
|
||||
}
|
||||
else
|
||||
{
|
||||
texturevpeg = sides[rover->master->sidenum[0]].rowoffset;
|
||||
texturevpeg = sides[rover->master->sidenum[0]].rowoffset + sides[rover->master->sidenum[0]].offsety_mid;
|
||||
attachtobottom = !!(gl_linedef->flags & ML_DONTPEGBOTTOM);
|
||||
slopeskew = !!(rover->master->flags & ML_SKEWTD);
|
||||
}
|
||||
|
@ -1672,8 +1673,8 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
|
|||
}
|
||||
}
|
||||
|
||||
wallVerts[0].s = wallVerts[3].s = cliplow * grTex->scaleX;
|
||||
wallVerts[2].s = wallVerts[1].s = cliphigh * grTex->scaleX;
|
||||
wallVerts[0].s = wallVerts[3].s = (cliplow + gl_sidedef->offsetx_mid) * grTex->scaleX;
|
||||
wallVerts[2].s = wallVerts[1].s = (cliphigh + gl_sidedef->offsetx_mid) * grTex->scaleX;
|
||||
}
|
||||
if (rover->fofflags & FOF_FOG)
|
||||
{
|
||||
|
@ -1785,17 +1786,17 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
|
|||
|
||||
if (newline)
|
||||
{
|
||||
wallVerts[3].t = wallVerts[2].t = (*rover->topheight - h + sides[newline->sidenum[0]].rowoffset) * grTex->scaleY;
|
||||
wallVerts[0].t = wallVerts[1].t = (h - l + (*rover->topheight - h + sides[newline->sidenum[0]].rowoffset)) * grTex->scaleY;
|
||||
wallVerts[3].t = wallVerts[2].t = (*rover->topheight - h + sides[newline->sidenum[0]].rowoffset + sides[newline->sidenum[0]].offsety_mid) * grTex->scaleY;
|
||||
wallVerts[0].t = wallVerts[1].t = (h - l + (*rover->topheight - h + sides[newline->sidenum[0]].rowoffset) + sides[newline->sidenum[0]].offsety_mid) * grTex->scaleY;
|
||||
}
|
||||
else
|
||||
{
|
||||
wallVerts[3].t = wallVerts[2].t = (*rover->topheight - h + sides[rover->master->sidenum[0]].rowoffset) * grTex->scaleY;
|
||||
wallVerts[0].t = wallVerts[1].t = (h - l + (*rover->topheight - h + sides[rover->master->sidenum[0]].rowoffset)) * grTex->scaleY;
|
||||
wallVerts[3].t = wallVerts[2].t = (*rover->topheight - h + sides[rover->master->sidenum[0]].rowoffset + sides[rover->master->sidenum[0]].offsety_mid) * grTex->scaleY;
|
||||
wallVerts[0].t = wallVerts[1].t = (h - l + (*rover->topheight - h + sides[rover->master->sidenum[0]].rowoffset + sides[rover->master->sidenum[0]].offsety_mid)) * grTex->scaleY;
|
||||
}
|
||||
|
||||
wallVerts[0].s = wallVerts[3].s = cliplow * grTex->scaleX;
|
||||
wallVerts[2].s = wallVerts[1].s = cliphigh * grTex->scaleX;
|
||||
wallVerts[0].s = wallVerts[3].s = (cliplow + gl_sidedef->offsetx_mid) * grTex->scaleX;
|
||||
wallVerts[2].s = wallVerts[1].s = (cliphigh + gl_sidedef->offsetx_mid) * grTex->scaleX;
|
||||
}
|
||||
|
||||
if (rover->fofflags & FOF_FOG)
|
||||
|
@ -3606,6 +3607,8 @@ static void HWR_DrawDropShadow(mobj_t *thing, fixed_t scale)
|
|||
|
||||
scalemul = FixedMul(FRACUNIT - floordiff/640, scale);
|
||||
scalemul = FixedMul(scalemul, (thing->radius*2) / gpatch->height);
|
||||
if ((thing->scale != thing->old_scale) && (thing->scale >= FRACUNIT/1024)) // Interpolate shadows when scaling mobjs
|
||||
scalemul = FixedMul(scalemul, FixedDiv(interp.scale, thing->scale));
|
||||
|
||||
fscale = FIXED_TO_FLOAT(scalemul);
|
||||
fx = FIXED_TO_FLOAT(interp.x);
|
||||
|
@ -4036,6 +4039,54 @@ static void HWR_SplitSprite(gl_vissprite_t *spr)
|
|||
HWR_LinkDrawHackAdd(wallVerts, spr);
|
||||
}
|
||||
|
||||
static void HWR_DrawBoundingBox(gl_vissprite_t *vis)
|
||||
{
|
||||
FOutVector v[24];
|
||||
FSurfaceInfo Surf = {0};
|
||||
|
||||
//
|
||||
// create a cube (side view)
|
||||
//
|
||||
// 5--4 3
|
||||
// |
|
||||
// |
|
||||
// 0--1 2
|
||||
//
|
||||
// repeat this 4 times (overhead)
|
||||
//
|
||||
//
|
||||
// 17 20 21 11
|
||||
// 16 15 14 10
|
||||
// 27 22 *--* 07 12
|
||||
// | |
|
||||
// 26 23 *--* 06 13
|
||||
// 24 00 01 02
|
||||
// 25 05 04 03
|
||||
//
|
||||
|
||||
v[000].x = v[005].x = v[015].x = v[016].x = v[017].x = v[020].x =
|
||||
v[022].x = v[023].x = v[024].x = v[025].x = v[026].x = v[027].x = vis->x1; // west
|
||||
|
||||
v[001].x = v[002].x = v[003].x = v[004].x = v[006].x = v[007].x =
|
||||
v[010].x = v[011].x = v[012].x = v[013].x = v[014].x = v[021].x = vis->x2; // east
|
||||
|
||||
v[000].z = v[001].z = v[002].z = v[003].z = v[004].z = v[005].z =
|
||||
v[006].z = v[013].z = v[023].z = v[024].z = v[025].z = v[026].z = vis->z1; // south
|
||||
|
||||
v[007].z = v[010].z = v[011].z = v[012].z = v[014].z = v[015].z =
|
||||
v[016].z = v[017].z = v[020].z = v[021].z = v[022].z = v[027].z = vis->z2; // north
|
||||
|
||||
v[000].y = v[001].y = v[002].y = v[006].y = v[007].y = v[010].y =
|
||||
v[014].y = v[015].y = v[016].y = v[022].y = v[023].y = v[024].y = vis->gz; // bottom
|
||||
|
||||
v[003].y = v[004].y = v[005].y = v[011].y = v[012].y = v[013].y =
|
||||
v[017].y = v[020].y = v[021].y = v[025].y = v[026].y = v[027].y = vis->gzt; // top
|
||||
|
||||
Surf.PolyColor = V_GetColor(R_GetBoundingBoxColor(vis->mobj));
|
||||
|
||||
HWR_ProcessPolygon(&Surf, v, 24, (cv_renderhitboxgldepth.value ? 0 : PF_NoDepthTest)|PF_Modulated|PF_NoTexture|PF_WireFrame, SHADER_NONE, false);
|
||||
}
|
||||
|
||||
// -----------------+
|
||||
// HWR_DrawSprite : Draw flat sprites
|
||||
// : (monsters, bonuses, weapons, lights, ...)
|
||||
|
@ -4102,7 +4153,7 @@ static void HWR_DrawSprite(gl_vissprite_t *spr)
|
|||
scale *= spr->shadowscale;
|
||||
|
||||
if (spr->rotateflags & SRF_3D || renderflags & RF_NOSPLATBILLBOARD)
|
||||
angle = spr->angle;
|
||||
angle = spr->mobj->angle;
|
||||
else
|
||||
angle = viewangle;
|
||||
|
||||
|
@ -4157,8 +4208,8 @@ static void HWR_DrawSprite(gl_vissprite_t *spr)
|
|||
// Translate
|
||||
for (i = 0; i < 4; i++)
|
||||
{
|
||||
wallVerts[i].x = rotated[i].x + spr->x1;
|
||||
wallVerts[i].z = rotated[i].y + spr->z1;
|
||||
wallVerts[i].x = rotated[i].x + FIXED_TO_FLOAT(spr->mobj->x);
|
||||
wallVerts[i].z = rotated[i].y + FIXED_TO_FLOAT(spr->mobj->y);
|
||||
}
|
||||
|
||||
if (renderflags & (RF_SLOPESPLAT | RF_OBJECTSLOPESPLAT))
|
||||
|
@ -4480,9 +4531,16 @@ static int CompareVisSprites(const void *p1, const void *p2)
|
|||
int transparency1;
|
||||
int transparency2;
|
||||
|
||||
int linkdraw1;
|
||||
int linkdraw2;
|
||||
|
||||
// draw bbox after everything else
|
||||
if (spr1->bbox || spr2->bbox)
|
||||
return (spr1->bbox - spr2->bbox);
|
||||
|
||||
// check for precip first, because then sprX->mobj is actually a precipmobj_t and does not have flags2 or tracer
|
||||
int linkdraw1 = !spr1->precip && (spr1->mobj->flags2 & MF2_LINKDRAW) && spr1->mobj->tracer;
|
||||
int linkdraw2 = !spr2->precip && (spr2->mobj->flags2 & MF2_LINKDRAW) && spr2->mobj->tracer;
|
||||
linkdraw1 = !spr1->precip && (spr1->mobj->flags2 & MF2_LINKDRAW) && spr1->mobj->tracer;
|
||||
linkdraw2 = !spr2->precip && (spr2->mobj->flags2 & MF2_LINKDRAW) && spr2->mobj->tracer;
|
||||
|
||||
// ^ is the XOR operation
|
||||
// if comparing a linkdraw and non-linkdraw sprite or 2 linkdraw sprites with different tracers, then use
|
||||
|
@ -4852,6 +4910,9 @@ static void HWR_DrawSprites(void)
|
|||
for (i = 0; i < gl_visspritecount; i++)
|
||||
{
|
||||
gl_vissprite_t *spr = gl_vsprorder[i];
|
||||
if (spr->bbox)
|
||||
HWR_DrawBoundingBox(spr);
|
||||
else
|
||||
#ifdef HWPRECIP
|
||||
if (spr->precip)
|
||||
HWR_DrawPrecipitationSprite(spr);
|
||||
|
@ -4951,8 +5012,15 @@ static void HWR_AddSprites(sector_t *sec)
|
|||
hoop_limit_dist = (fixed_t)(cv_drawdist_nights.value) << FRACBITS;
|
||||
for (thing = sec->thinglist; thing; thing = thing->snext)
|
||||
{
|
||||
if (R_ThingVisibleWithinDist(thing, limit_dist, hoop_limit_dist))
|
||||
HWR_ProjectSprite(thing);
|
||||
if (R_ThingWithinDist(thing, limit_dist, hoop_limit_dist))
|
||||
{
|
||||
if (R_ThingVisible(thing))
|
||||
{
|
||||
HWR_ProjectSprite(thing);
|
||||
}
|
||||
|
||||
HWR_ProjectBoundingBox(thing);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef HWPRECIP
|
||||
|
@ -5031,7 +5099,7 @@ static void HWR_ProjectSprite(mobj_t *thing)
|
|||
return;
|
||||
}
|
||||
|
||||
dispoffset = thing->info->dispoffset;
|
||||
dispoffset = thing->dispoffset;
|
||||
|
||||
|
||||
if (R_UsingFrameInterpolation() && !paused)
|
||||
|
@ -5470,6 +5538,7 @@ static void HWR_ProjectSprite(mobj_t *thing)
|
|||
vis->vflip = vflip;
|
||||
|
||||
vis->precip = false;
|
||||
vis->bbox = false;
|
||||
|
||||
vis->angle = interp.angle;
|
||||
}
|
||||
|
@ -5592,6 +5661,7 @@ static void HWR_ProjectPrecipitationSprite(precipmobj_t *thing)
|
|||
vis->gz = vis->gzt - FIXED_TO_FLOAT(spritecachedinfo[lumpoff].height);
|
||||
|
||||
vis->precip = true;
|
||||
vis->bbox = false;
|
||||
|
||||
// okay... this is a hack, but weather isn't networked, so it should be ok
|
||||
if (!(thing->precipflags & PCF_THUNK))
|
||||
|
@ -5605,6 +5675,61 @@ static void HWR_ProjectPrecipitationSprite(precipmobj_t *thing)
|
|||
}
|
||||
#endif
|
||||
|
||||
static void HWR_ProjectBoundingBox(mobj_t *thing)
|
||||
{
|
||||
gl_vissprite_t *vis;
|
||||
float tr_x, tr_y;
|
||||
float tz;
|
||||
float rad;
|
||||
|
||||
if (!thing)
|
||||
return;
|
||||
|
||||
if (!R_ThingBoundingBoxVisible(thing))
|
||||
return;
|
||||
|
||||
// uncapped/interpolation
|
||||
boolean interpolate = cv_renderhitboxinterpolation.value;
|
||||
interpmobjstate_t interp = {0};
|
||||
|
||||
if (R_UsingFrameInterpolation() && !paused && interpolate)
|
||||
{
|
||||
R_InterpolateMobjState(thing, rendertimefrac, &interp);
|
||||
}
|
||||
else
|
||||
{
|
||||
R_InterpolateMobjState(thing, FRACUNIT, &interp);
|
||||
}
|
||||
|
||||
// transform the origin point
|
||||
tr_x = FIXED_TO_FLOAT(interp.x) - gl_viewx;
|
||||
tr_y = FIXED_TO_FLOAT(interp.y) - gl_viewy;
|
||||
|
||||
// rotation around vertical axis
|
||||
tz = (tr_x * gl_viewcos) + (tr_y * gl_viewsin);
|
||||
|
||||
// thing is behind view plane?
|
||||
if (tz < ZCLIP_PLANE)
|
||||
return;
|
||||
|
||||
tr_x += gl_viewx;
|
||||
tr_y += gl_viewy;
|
||||
|
||||
rad = FIXED_TO_FLOAT(thing->radius);
|
||||
|
||||
vis = HWR_NewVisSprite();
|
||||
vis->x1 = tr_x - rad;
|
||||
vis->x2 = tr_x + rad;
|
||||
vis->z1 = tr_y - rad;
|
||||
vis->z2 = tr_y + rad;
|
||||
vis->gz = FIXED_TO_FLOAT(interp.z);
|
||||
vis->gzt = vis->gz + FIXED_TO_FLOAT(thing->height);
|
||||
vis->mobj = thing;
|
||||
|
||||
vis->precip = false;
|
||||
vis->bbox = true;
|
||||
}
|
||||
|
||||
// ==========================================================================
|
||||
// Sky dome rendering, ported from PrBoom+
|
||||
// ==========================================================================
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
@ -1660,7 +1660,7 @@ boolean HWR_DrawModel(gl_vissprite_t *spr)
|
|||
#endif
|
||||
|
||||
// SRB2CBTODO: MD2 scaling support
|
||||
finalscale *= FIXED_TO_FLOAT(spr->mobj->scale);
|
||||
finalscale *= FIXED_TO_FLOAT(interp.scale);
|
||||
|
||||
p.flip = atransform.flip;
|
||||
#ifdef USE_FTRANSFORM_MIRROR
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1998-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1998-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
@ -1030,6 +1030,12 @@ EXPORT void HWRAPI(LoadCustomShader) (int number, char *code, size_t size, boole
|
|||
EXPORT void HWRAPI(SetShader) (int type)
|
||||
{
|
||||
#ifdef GL_SHADERS
|
||||
if (type == SHADER_NONE)
|
||||
{
|
||||
UnSetShader();
|
||||
return;
|
||||
}
|
||||
|
||||
if (gl_allowshaders != HWD_SHADEROPTION_OFF)
|
||||
{
|
||||
gl_shader_t *shader = gl_shaderstate.current;
|
||||
|
@ -2290,7 +2296,7 @@ EXPORT void HWRAPI(DrawPolygon) (FSurfaceInfo *pSurf, FOutVector *pOutVerts, FUI
|
|||
|
||||
pglVertexPointer(3, GL_FLOAT, sizeof(FOutVector), &pOutVerts[0].x);
|
||||
pglTexCoordPointer(2, GL_FLOAT, sizeof(FOutVector), &pOutVerts[0].s);
|
||||
pglDrawArrays(GL_TRIANGLE_FAN, 0, iNumPts);
|
||||
pglDrawArrays(PolyFlags & PF_WireFrame ? GL_LINES : GL_TRIANGLE_FAN, 0, iNumPts);
|
||||
|
||||
if (PolyFlags & PF_RemoveYWrap)
|
||||
pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 2020-2022 by James R.
|
||||
// Copyright (C) 2020-2023 by James R.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
@ -216,7 +216,11 @@ HMS_connect (const char *format, ...)
|
|||
|
||||
curl_easy_setopt(curl, CURLOPT_URL, url);
|
||||
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
|
||||
curl_easy_setopt(curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
|
||||
|
||||
#ifndef NO_IPV6
|
||||
if (M_CheckParm("-noipv6"))
|
||||
#endif
|
||||
curl_easy_setopt(curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
|
||||
|
||||
curl_easy_setopt(curl, CURLOPT_TIMEOUT, cv_masterserver_timeout.value);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, HMS_on_read);
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
@ -328,10 +328,10 @@ void HU_LoadGraphics(void)
|
|||
void HU_Init(void)
|
||||
{
|
||||
#ifndef NONET
|
||||
COM_AddCommand("say", Command_Say_f);
|
||||
COM_AddCommand("sayto", Command_Sayto_f);
|
||||
COM_AddCommand("sayteam", Command_Sayteam_f);
|
||||
COM_AddCommand("csay", Command_CSay_f);
|
||||
COM_AddCommand("say", Command_Say_f, COM_LUA);
|
||||
COM_AddCommand("sayto", Command_Sayto_f, COM_LUA);
|
||||
COM_AddCommand("sayteam", Command_Sayteam_f, COM_LUA);
|
||||
COM_AddCommand("csay", Command_CSay_f, COM_LUA);
|
||||
RegisterNetXCmd(XD_SAY, Got_Saycmd);
|
||||
#endif
|
||||
|
||||
|
@ -2862,18 +2862,6 @@ static void HU_DrawRankings(void)
|
|||
V_DrawCenteredString(256, 16, 0, va("%d", cv_pointlimit.value));
|
||||
}
|
||||
}
|
||||
else if (gametyperankings[gametype] == GT_COOP)
|
||||
{
|
||||
INT32 totalscore = 0;
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
{
|
||||
if (playeringame[i])
|
||||
totalscore += players[i].score;
|
||||
}
|
||||
|
||||
V_DrawCenteredString(256, 8, 0, "TOTAL SCORE");
|
||||
V_DrawCenteredString(256, 16, 0, va("%u", totalscore));
|
||||
}
|
||||
else
|
||||
{
|
||||
if (circuitmap)
|
||||
|
@ -2994,9 +2982,9 @@ static void HU_DrawCoopOverlay(void)
|
|||
V_DrawSmallScaledPatch(148, 172, 0, tokenicon);
|
||||
}
|
||||
|
||||
if (LUA_HudEnabled(hud_tabemblems) && (!modifiedgame || savemoddata))
|
||||
if (LUA_HudEnabled(hud_tabemblems))
|
||||
{
|
||||
V_DrawString(160, 144, 0, va("- %d/%d", M_CountEmblems(), numemblems+numextraemblems));
|
||||
V_DrawString(160, 144, 0, va("- %d/%d", M_CountEmblems(clientGamedata), numemblems+numextraemblems));
|
||||
V_DrawScaledPatch(128, 144 - emblemicon->height/4, 0, emblemicon);
|
||||
}
|
||||
|
||||
|
@ -3029,6 +3017,15 @@ static void HU_DrawNetplayCoopOverlay(void)
|
|||
V_DrawSmallScaledPatch(148, 6, 0, tokenicon);
|
||||
}
|
||||
|
||||
if (G_CoopGametype() && LUA_HudEnabled(hud_tabemblems))
|
||||
{
|
||||
V_DrawCenteredString(256, 14, 0, "/");
|
||||
V_DrawString(256 + 4, 14, 0, va("%d", numemblems + numextraemblems));
|
||||
V_DrawRightAlignedString(256 - 4, 14, 0, va("%d", M_CountEmblems(clientGamedata)));
|
||||
|
||||
V_DrawSmallScaledPatch(256 - (emblemicon->width / 4), 6, 0, emblemicon);
|
||||
}
|
||||
|
||||
if (!LUA_HudEnabled(hud_coopemeralds))
|
||||
return;
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 2011-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 2011-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 2011-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 2011-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
|
13
src/i_net.h
13
src/i_net.h
|
@ -2,7 +2,7 @@
|
|||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
@ -109,6 +109,17 @@ extern boolean (*I_NetCanSend)(void);
|
|||
*/
|
||||
extern void (*I_NetFreeNodenum)(INT32 nodenum);
|
||||
|
||||
/**
|
||||
\brief split a string into address and port
|
||||
|
||||
\param address string to split
|
||||
|
||||
\param port double pointer to hold port component (optional)
|
||||
|
||||
\return address component
|
||||
*/
|
||||
extern char *I_NetSplitAddress(char *address, char **port);
|
||||
|
||||
/** \brief open a connection with specified address
|
||||
|
||||
\param address address to connect to
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
@ -40,7 +40,7 @@ extern UINT8 keyboard_started;
|
|||
|
||||
\return free memory in the system
|
||||
*/
|
||||
UINT32 I_GetFreeMem(UINT32 *total);
|
||||
size_t I_GetFreeMem(size_t *total);
|
||||
|
||||
/** \brief Returns precise time value for performance measurement. The precise
|
||||
time should be a monotonically increasing counter, and will wrap.
|
||||
|
|
73
src/i_tcp.c
73
src/i_tcp.c
|
@ -1,7 +1,7 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
@ -340,8 +340,14 @@ static inline void I_UPnP_rem(const char *port, const char * servicetype)
|
|||
|
||||
static const char *SOCK_AddrToStr(mysockaddr_t *sk)
|
||||
{
|
||||
static char s[64]; // 255.255.255.255:65535 or IPv6:65535
|
||||
static char s[64]; // 255.255.255.255:65535 or
|
||||
// [ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff]:65535
|
||||
#ifdef HAVE_NTOP
|
||||
#ifdef HAVE_IPV6
|
||||
int v6 = (sk->any.sa_family == AF_INET6);
|
||||
#else
|
||||
int v6 = 0;
|
||||
#endif
|
||||
void *addr;
|
||||
|
||||
if(sk->any.sa_family == AF_INET)
|
||||
|
@ -355,14 +361,21 @@ static const char *SOCK_AddrToStr(mysockaddr_t *sk)
|
|||
|
||||
if(addr == NULL)
|
||||
sprintf(s, "No address");
|
||||
else if(inet_ntop(sk->any.sa_family, addr, s, sizeof (s)) == NULL)
|
||||
else if(inet_ntop(sk->any.sa_family, addr, &s[v6], sizeof (s) - v6) == NULL)
|
||||
sprintf(s, "Unknown family type, error #%u", errno);
|
||||
#ifdef HAVE_IPV6
|
||||
else if(sk->any.sa_family == AF_INET6 && sk->ip6.sin6_port != 0)
|
||||
strcat(s, va(":%d", ntohs(sk->ip6.sin6_port)));
|
||||
else if(sk->any.sa_family == AF_INET6)
|
||||
{
|
||||
s[0] = '[';
|
||||
strcat(s, "]");
|
||||
|
||||
if (sk->ip6.sin6_port != 0)
|
||||
strcat(s, va(":%d", ntohs(sk->ip6.sin6_port)));
|
||||
}
|
||||
#endif
|
||||
else if(sk->any.sa_family == AF_INET && sk->ip4.sin_port != 0)
|
||||
strcat(s, va(":%d", ntohs(sk->ip4.sin_port)));
|
||||
|
||||
#else
|
||||
if (sk->any.sa_family == AF_INET)
|
||||
{
|
||||
|
@ -427,7 +440,7 @@ static boolean SOCK_cmpaddr(mysockaddr_t *a, mysockaddr_t *b, UINT8 mask)
|
|||
&& (b->ip4.sin_port == 0 || (a->ip4.sin_port == b->ip4.sin_port));
|
||||
#ifdef HAVE_IPV6
|
||||
else if (b->any.sa_family == AF_INET6)
|
||||
return memcmp(&a->ip6.sin6_addr, &b->ip6.sin6_addr, sizeof(b->ip6.sin6_addr))
|
||||
return !memcmp(&a->ip6.sin6_addr, &b->ip6.sin6_addr, sizeof(b->ip6.sin6_addr))
|
||||
&& (b->ip6.sin6_port == 0 || (a->ip6.sin6_port == b->ip6.sin6_port));
|
||||
#endif
|
||||
else
|
||||
|
@ -735,8 +748,7 @@ static SOCKET_TYPE UDP_Bind(int family, struct sockaddr *addr, socklen_t addrlen
|
|||
unsigned long trueval = true;
|
||||
#endif
|
||||
mysockaddr_t straddr;
|
||||
struct sockaddr_in sin;
|
||||
socklen_t len = sizeof(sin);
|
||||
socklen_t len = sizeof(straddr);
|
||||
|
||||
if (s == (SOCKET_TYPE)ERRSOCKET)
|
||||
return (SOCKET_TYPE)ERRSOCKET;
|
||||
|
@ -754,14 +766,12 @@ static SOCKET_TYPE UDP_Bind(int family, struct sockaddr *addr, socklen_t addrlen
|
|||
}
|
||||
#endif
|
||||
|
||||
straddr.any = *addr;
|
||||
memcpy(&straddr, addr, addrlen);
|
||||
I_OutputMsg("Binding to %s\n", SOCK_AddrToStr(&straddr));
|
||||
|
||||
if (family == AF_INET)
|
||||
{
|
||||
mysockaddr_t tmpaddr;
|
||||
tmpaddr.any = *addr ;
|
||||
if (tmpaddr.ip4.sin_addr.s_addr == htonl(INADDR_ANY))
|
||||
if (straddr.ip4.sin_addr.s_addr == htonl(INADDR_ANY))
|
||||
{
|
||||
opt = true;
|
||||
opts = (socklen_t)sizeof(opt);
|
||||
|
@ -778,7 +788,7 @@ static SOCKET_TYPE UDP_Bind(int family, struct sockaddr *addr, socklen_t addrlen
|
|||
#ifdef HAVE_IPV6
|
||||
else if (family == AF_INET6)
|
||||
{
|
||||
if (memcmp(addr, &in6addr_any, sizeof(in6addr_any)) == 0) //IN6_ARE_ADDR_EQUAL
|
||||
if (memcmp(&straddr.ip6.sin6_addr, &in6addr_any, sizeof(in6addr_any)) == 0) //IN6_ARE_ADDR_EQUAL
|
||||
{
|
||||
opt = true;
|
||||
opts = (socklen_t)sizeof(opt);
|
||||
|
@ -788,7 +798,7 @@ static SOCKET_TYPE UDP_Bind(int family, struct sockaddr *addr, socklen_t addrlen
|
|||
// make it IPv6 ony
|
||||
opt = true;
|
||||
opts = (socklen_t)sizeof(opt);
|
||||
if (setsockopt(s, SOL_SOCKET, IPV6_V6ONLY, (char *)&opt, opts))
|
||||
if (setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY, (char *)&opt, opts))
|
||||
{
|
||||
CONS_Alert(CONS_WARNING, M_GetText("Could not limit IPv6 bind\n")); // I do not care anymore
|
||||
}
|
||||
|
@ -830,10 +840,17 @@ static SOCKET_TYPE UDP_Bind(int family, struct sockaddr *addr, socklen_t addrlen
|
|||
CONS_Printf(M_GetText("Network system buffer set to: %dKb\n"), opt>>10);
|
||||
}
|
||||
|
||||
if (getsockname(s, (struct sockaddr *)&sin, &len) == -1)
|
||||
if (getsockname(s, &straddr.any, &len) == -1)
|
||||
CONS_Alert(CONS_WARNING, M_GetText("Failed to get port number\n"));
|
||||
else
|
||||
current_port = (UINT16)ntohs(sin.sin_port);
|
||||
{
|
||||
if (family == AF_INET)
|
||||
current_port = (UINT16)ntohs(straddr.ip4.sin_port);
|
||||
#ifdef HAVE_IPV6
|
||||
else if (family == AF_INET6)
|
||||
current_port = (UINT16)ntohs(straddr.ip6.sin6_port);
|
||||
#endif
|
||||
}
|
||||
|
||||
return s;
|
||||
}
|
||||
|
@ -844,7 +861,7 @@ static boolean UDP_Socket(void)
|
|||
struct my_addrinfo *ai, *runp, hints;
|
||||
int gaie;
|
||||
#ifdef HAVE_IPV6
|
||||
const INT32 b_ipv6 = M_CheckParm("-ipv6");
|
||||
const INT32 b_ipv6 = !M_CheckParm("-noipv6");
|
||||
#endif
|
||||
const char *serv;
|
||||
|
||||
|
@ -1156,6 +1173,7 @@ static SINT8 SOCK_NetMakeNodewPort(const char *address, const char *port)
|
|||
SINT8 newnode = -1;
|
||||
struct my_addrinfo *ai = NULL, *runp, hints;
|
||||
int gaie;
|
||||
size_t i;
|
||||
|
||||
if (!port || !port[0])
|
||||
port = DEFAULTPORT;
|
||||
|
@ -1183,13 +1201,24 @@ static SINT8 SOCK_NetMakeNodewPort(const char *address, const char *port)
|
|||
|
||||
while (runp != NULL)
|
||||
{
|
||||
// find ip of the server
|
||||
if (sendto(mysockets[0], NULL, 0, 0, runp->ai_addr, runp->ai_addrlen) == 0)
|
||||
// test ip address of server
|
||||
for (i = 0; i < mysocketses; ++i)
|
||||
{
|
||||
memcpy(&clientaddress[newnode], runp->ai_addr, runp->ai_addrlen);
|
||||
break;
|
||||
/* sendto tests that there is a network to this
|
||||
address */
|
||||
if (runp->ai_addr->sa_family == myfamily[i] &&
|
||||
sendto(mysockets[i], NULL, 0, 0,
|
||||
runp->ai_addr, runp->ai_addrlen) == 0)
|
||||
{
|
||||
memcpy(&clientaddress[newnode], runp->ai_addr, runp->ai_addrlen);
|
||||
break;
|
||||
}
|
||||
}
|
||||
runp = runp->ai_next;
|
||||
|
||||
if (i < mysocketses)
|
||||
runp = runp->ai_next;
|
||||
else
|
||||
break;
|
||||
}
|
||||
I_freeaddrinfo(ai);
|
||||
return newnode;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 2020-2022 by James R.
|
||||
// Copyright (C) 2020-2023 by James R.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
|
18
src/i_time.c
18
src/i_time.c
|
@ -2,7 +2,7 @@
|
|||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
@ -43,18 +43,20 @@ tic_t I_GetTime(void)
|
|||
|
||||
void I_InitializeTime(void)
|
||||
{
|
||||
g_time.time = 0;
|
||||
g_time.timefrac = 0;
|
||||
|
||||
enterprecise = 0;
|
||||
oldenterprecise = 0;
|
||||
tictimer = 0.0;
|
||||
|
||||
CV_RegisterVar(&cv_timescale);
|
||||
|
||||
// I_StartupTimer is preserved for potential subsystems that need to setup
|
||||
// timing information for I_GetPreciseTime and sleeping
|
||||
I_StartupTimer();
|
||||
|
||||
g_time.time = 0;
|
||||
g_time.timefrac = 0;
|
||||
|
||||
enterprecise = I_GetPreciseTime();
|
||||
oldenterprecise = enterprecise;
|
||||
entertic = 0;
|
||||
oldentertics = 0;
|
||||
tictimer = 0.0;
|
||||
}
|
||||
|
||||
void I_UpdateTime(fixed_t timescale)
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
|
95
src/info.c
95
src/info.c
|
@ -2,7 +2,7 @@
|
|||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
@ -21584,68 +21584,113 @@ skincolor_t skincolors[MAXSKINCOLORS] = {
|
|||
{"Black", {0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1b, 0x1b, 0x1c, 0x1d, 0x1d, 0x1e, 0x1e, 0x1f, 0x1f}, SKINCOLOR_WHITE, 7, V_GRAYMAP, true}, // SKINCOLOR_BLACK
|
||||
|
||||
// Desaturated
|
||||
{"Aether", {0x00, 0x00, 0x01, 0x02, 0x02, 0x03, 0x91, 0x91, 0x91, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xaf}, SKINCOLOR_GREY, 15, 0, true}, // SKINCOLOR_AETHER
|
||||
{"Slate", {0x00, 0x02, 0x04, 0x06, 0x08, 0x0a, 0xaa, 0xaa, 0xaa, 0xab, 0xac, 0xac, 0xad, 0xad, 0xae, 0xaf}, SKINCOLOR_SILVER, 12, 0, true}, // SKINCOLOR_SLATE
|
||||
{"Bluebell", {0x90, 0x91, 0x92, 0x93, 0x94, 0x94, 0x95, 0xac, 0xac, 0xad, 0xad, 0xa8, 0xa8, 0xa9, 0xfd, 0xfe}, SKINCOLOR_COPPER, 4, V_BLUEMAP, true}, // SKINCOLOR_BLUEBELL
|
||||
{"Pink", {0xd0, 0xd0, 0xd1, 0xd1, 0xd2, 0xd2, 0xd3, 0xd3, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0x2b, 0x2c, 0x2e}, SKINCOLOR_AZURE, 9, V_REDMAP, true}, // SKINCOLOR_PINK
|
||||
{"Yogurt", {0xd0, 0x30, 0xd8, 0xd9, 0xda, 0xdb, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe3, 0xe6, 0xe8, 0xe9}, SKINCOLOR_RUST, 7, V_BROWNMAP, true}, // SKINCOLOR_YOGURT
|
||||
{"Brown", {0xdf, 0xe0, 0xe1, 0xe2, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef}, SKINCOLOR_TAN, 2, V_BROWNMAP, true}, // SKINCOLOR_BROWN
|
||||
{"Bronze", {0xde, 0xe0, 0xe1, 0xe4, 0xe7, 0xe9, 0xeb, 0xec, 0xed, 0xed, 0xed, 0x19, 0x19, 0x1b, 0x1d, 0x1e}, SKINCOLOR_KETCHUP, 0, V_BROWNMAP, true}, // SKINCOLOR_BRONZE
|
||||
{"Tan", {0x51, 0x51, 0x54, 0x54, 0x55, 0x55, 0x56, 0x56, 0x56, 0x57, 0xf5, 0xf5, 0xf9, 0xf9, 0xed, 0xed}, SKINCOLOR_BROWN, 12, V_BROWNMAP, true}, // SKINCOLOR_TAN
|
||||
{"Beige", {0x54, 0x55, 0x56, 0x56, 0xf2, 0xf3, 0xf3, 0xf4, 0xf5, 0xf6, 0xf8, 0xf9, 0xfa, 0xfb, 0xed, 0xed}, SKINCOLOR_MOSS, 5, V_BROWNMAP, true}, // SKINCOLOR_BEIGE
|
||||
{"Moss", {0x58, 0x58, 0x59, 0x59, 0x5a, 0x5a, 0x5b, 0x5b, 0x5b, 0x5c, 0x5d, 0x5d, 0x5e, 0x5e, 0x5f, 0x5f}, SKINCOLOR_BEIGE, 13, V_GREENMAP, true}, // SKINCOLOR_MOSS
|
||||
{"Azure", {0x90, 0x90, 0x91, 0x91, 0xaa, 0xaa, 0xab, 0xab, 0xab, 0xac, 0xad, 0xad, 0xae, 0xae, 0xaf, 0xaf}, SKINCOLOR_PINK, 5, V_AZUREMAP, true}, // SKINCOLOR_AZURE
|
||||
{"Lavender", {0xc0, 0xc0, 0xc1, 0xc1, 0xc2, 0xc2, 0xc3, 0xc3, 0xc3, 0xc4, 0xc5, 0xc5, 0xc6, 0xc6, 0xc7, 0xc7}, SKINCOLOR_GOLD, 4, V_PURPLEMAP, true}, // SKINCOLOR_LAVENDER
|
||||
{"Aether", {0x00, 0x00, 0x01, 0x02, 0x02, 0x03, 0x91, 0x91, 0x91, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xaf}, SKINCOLOR_GREY, 15, 0, true}, // SKINCOLOR_AETHER
|
||||
{"Slate", {0x00, 0x02, 0x04, 0x06, 0x08, 0x0a, 0xaa, 0xaa, 0xaa, 0xab, 0xac, 0xac, 0xad, 0xad, 0xae, 0xaf}, SKINCOLOR_SILVER, 12, 0, true}, // SKINCOLOR_SLATE
|
||||
{"Meteorite", { 0, 4, 8, 9, 11, 12, 14, 15, 171, 172, 173, 174, 175, 27, 29, 31}, SKINCOLOR_TOPAZ, 15, V_GRAYMAP, true}, // SKINCOLOR_METEORITE
|
||||
{"Mercury", { 0, 3, 4, 7, 11, 12, 14, 15, 171, 172, 173, 155, 157, 159, 253, 254}, SKINCOLOR_ECRU, 15, V_AZUREMAP, true}, // SKINCOLOR_MERCURY
|
||||
{"Bluebell", {0x90, 0x91, 0x92, 0x93, 0x94, 0x94, 0x95, 0xac, 0xac, 0xad, 0xad, 0xa8, 0xa8, 0xa9, 0xfd, 0xfe}, SKINCOLOR_COPPER, 4, V_BLUEMAP, true}, // SKINCOLOR_BLUEBELL
|
||||
{"Pink", {0xd0, 0xd0, 0xd1, 0xd1, 0xd2, 0xd2, 0xd3, 0xd3, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0x2b, 0x2c, 0x2e}, SKINCOLOR_AZURE, 9, V_REDMAP, true}, // SKINCOLOR_PINK
|
||||
{"Rosewood", { 209, 210, 211, 212, 213, 214, 228, 230, 232, 234, 235, 237, 26, 27, 28, 29}, SKINCOLOR_SEPIA, 5, V_BROWNMAP, true}, // SKINCOLOR_ROSEWOOD
|
||||
{"Yogurt", {0xd0, 0x30, 0xd8, 0xd9, 0xda, 0xdb, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe3, 0xe6, 0xe8, 0xe9}, SKINCOLOR_RUST, 7, V_BROWNMAP, true}, // SKINCOLOR_YOGURT
|
||||
{"Latte", { 48, 217, 219, 221, 223, 224, 226, 228, 68, 69, 70, 70, 44, 45, 46, 47}, SKINCOLOR_BOTTLE, 12, V_BROWNMAP, true}, // SKINCOLOR_LATTE
|
||||
{"Brown", {0xdf, 0xe0, 0xe1, 0xe2, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef}, SKINCOLOR_TAN, 2, V_BROWNMAP, true}, // SKINCOLOR_BROWN
|
||||
{"Boulder", {0xde, 0xe0, 0xe1, 0xe4, 0xe7, 0xe9, 0xeb, 0xec, 0xed, 0xed, 0xed, 0x19, 0x19, 0x1b, 0x1d, 0x1e}, SKINCOLOR_KETCHUP, 0, V_BROWNMAP, true}, // SKINCOLOR_BOULDER
|
||||
{"Bronze", { 82, 84, 50, 51, 223, 228, 230, 232, 234, 236, 237, 238, 239, 239, 30, 31}, SKINCOLOR_VOLCANIC, 9, V_BROWNMAP, true}, // SKINCOLOR_BRONZE
|
||||
{"Sepia", { 88, 84, 85, 86, 224, 226, 228, 230, 232, 235, 236, 237, 238, 239, 28, 28}, SKINCOLOR_ROSEWOOD, 5, V_BROWNMAP, true}, // SKINCOLOR_SEPIA
|
||||
{"Ecru", { 80, 83, 84, 85, 86, 242, 243, 245, 230, 232, 234, 236, 238, 239, 47, 47}, SKINCOLOR_MERCURY, 15, V_BROWNMAP, true}, // SKINCOLOR_ECRU
|
||||
{"Tan", {0x51, 0x51, 0x54, 0x54, 0x55, 0x55, 0x56, 0x56, 0x56, 0x57, 0xf5, 0xf5, 0xf9, 0xf9, 0xed, 0xed}, SKINCOLOR_BROWN, 12, V_BROWNMAP, true}, // SKINCOLOR_TAN
|
||||
{"Beige", {0x54, 0x55, 0x56, 0x56, 0xf2, 0xf3, 0xf3, 0xf4, 0xf5, 0xf6, 0xf8, 0xf9, 0xfa, 0xfb, 0xed, 0xed}, SKINCOLOR_MOSS, 5, V_BROWNMAP, true}, // SKINCOLOR_BEIGE
|
||||
{"Rosebush", { 208, 216, 209, 85, 90, 91, 91, 92, 191, 93, 94, 107, 109, 110, 111, 111}, SKINCOLOR_EGGPLANT, 5, V_GREENMAP, true}, // SKINCOLOR_ROSEBUSH
|
||||
{"Moss", {0x58, 0x58, 0x59, 0x59, 0x5a, 0x5a, 0x5b, 0x5b, 0x5b, 0x5c, 0x5d, 0x5d, 0x5e, 0x5e, 0x5f, 0x5f}, SKINCOLOR_BEIGE, 13, V_GREENMAP, true}, // SKINCOLOR_MOSS
|
||||
{"Azure", {0x90, 0x90, 0x91, 0x91, 0xaa, 0xaa, 0xab, 0xab, 0xab, 0xac, 0xad, 0xad, 0xae, 0xae, 0xaf, 0xaf}, SKINCOLOR_PINK, 5, V_AZUREMAP, true}, // SKINCOLOR_AZURE
|
||||
{"Eggplant", { 4, 8, 11, 11, 16, 195, 195, 195, 196, 186, 187, 187, 254, 254, 30, 31}, SKINCOLOR_ROSEBUSH, 5, V_PURPLEMAP, true}, // SKINCOLOR_EGGPLANT
|
||||
{"Lavender", {0xc0, 0xc0, 0xc1, 0xc1, 0xc2, 0xc2, 0xc3, 0xc3, 0xc3, 0xc4, 0xc5, 0xc5, 0xc6, 0xc6, 0xc7, 0xc7}, SKINCOLOR_HEADLIGHT, 8, V_PURPLEMAP, true}, // SKINCOLOR_LAVENDER
|
||||
|
||||
// Viv's vivid colours (toast 21/07/17)
|
||||
// Tweaks & additions (Lach, sphere, Alice, MotorRoach 26/10/22)
|
||||
{"Ruby", {0xb0, 0xb0, 0xc9, 0xca, 0xcc, 0x26, 0x27, 0x28, 0x29, 0x2a, 0xb9, 0xb9, 0xba, 0xba, 0xbb, 0xfd}, SKINCOLOR_EMERALD, 10, V_REDMAP, true}, // SKINCOLOR_RUBY
|
||||
{"Cherry", { 202, 203, 204, 205, 206, 40, 41, 42, 43, 44, 186, 187, 28, 29, 30, 31}, SKINCOLOR_MIDNIGHT, 10, V_REDMAP, true}, // SKINCOLOR_CHERRY
|
||||
{"Salmon", {0xd0, 0xd0, 0xd1, 0xd2, 0x20, 0x21, 0x24, 0x25, 0x26, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e}, SKINCOLOR_FOREST, 6, V_REDMAP, true}, // SKINCOLOR_SALMON
|
||||
{"Red", {0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x47, 0x2e, 0x2f}, SKINCOLOR_GREEN, 10, V_REDMAP, true}, // SKINCOLOR_RED
|
||||
{"Pepper", { 210, 32, 33, 34, 35, 35, 36, 37, 38, 39, 41, 43, 45, 45, 46, 47}, SKINCOLOR_GREEN, 10, V_REDMAP, true}, // SKINCOLOR_PEPPER
|
||||
{"Red", {0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x47, 0x2e, 0x2f}, SKINCOLOR_MASTER, 8, V_REDMAP, true}, // SKINCOLOR_RED
|
||||
{"Crimson", {0x27, 0x27, 0x28, 0x28, 0x29, 0x2a, 0x2b, 0x2b, 0x2c, 0x2d, 0x2e, 0x2e, 0x2e, 0x2f, 0x2f, 0x1f}, SKINCOLOR_ICY, 10, V_REDMAP, true}, // SKINCOLOR_CRIMSON
|
||||
{"Flame", {0x31, 0x32, 0x33, 0x36, 0x22, 0x22, 0x25, 0x25, 0x25, 0xcd, 0xcf, 0xcf, 0xc5, 0xc5, 0xc7, 0xc7}, SKINCOLOR_PURPLE, 8, V_REDMAP, true}, // SKINCOLOR_FLAME
|
||||
{"Ketchup", {0x48, 0x49, 0x40, 0x33, 0x34, 0x36, 0x22, 0x24, 0x26, 0x28, 0x2a, 0x2b, 0x2c, 0x47, 0x2e, 0x2f}, SKINCOLOR_BRONZE, 8, V_REDMAP, true}, // SKINCOLOR_KETCHUP
|
||||
{"Garnet", { 0, 83, 50, 53, 34, 35, 37, 38, 39, 40, 42, 44, 45, 46, 47, 47}, SKINCOLOR_AQUAMARINE, 6, V_REDMAP, true}, // SKINCOLOR_GARNET
|
||||
{"Ketchup", {0x48, 0x49, 0x40, 0x33, 0x34, 0x36, 0x22, 0x24, 0x26, 0x28, 0x2a, 0x2b, 0x2c, 0x47, 0x2e, 0x2f}, SKINCOLOR_BOULDER, 8, V_REDMAP, true}, // SKINCOLOR_KETCHUP
|
||||
{"Peachy", {0xd0, 0x30, 0x31, 0x31, 0x32, 0x32, 0xdc, 0xdc, 0xdc, 0xd3, 0xd4, 0xd4, 0xcc, 0xcd, 0xce, 0xcf}, SKINCOLOR_TEAL, 7, V_ROSYMAP, true}, // SKINCOLOR_PEACHY
|
||||
{"Quail", {0xd8, 0xd9, 0xdb, 0xdc, 0xde, 0xdf, 0xd5, 0xd5, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0x1d, 0x1f}, SKINCOLOR_WAVE, 5, V_BROWNMAP, true}, // SKINCOLOR_QUAIL
|
||||
{"Foundation", { 80, 81, 82, 84, 219, 221, 221, 212, 213, 214, 215, 195, 196, 186, 187, 30}, SKINCOLOR_DREAM, 6, V_ORANGEMAP, true}, // SKINCOLOR_FOUNDATION
|
||||
{"Sunset", {0x51, 0x52, 0x40, 0x40, 0x34, 0x36, 0xd5, 0xd5, 0xd6, 0xd7, 0xcf, 0xcf, 0xc6, 0xc6, 0xc7, 0xfe}, SKINCOLOR_SAPPHIRE, 5, V_ORANGEMAP, true}, // SKINCOLOR_SUNSET
|
||||
{"Copper", {0x58, 0x54, 0x40, 0x34, 0x35, 0x38, 0x3a, 0x3c, 0x3d, 0x2a, 0x2b, 0x2c, 0x2c, 0xba, 0xba, 0xbb}, SKINCOLOR_BLUEBELL, 5, V_ORANGEMAP, true}, // SKINCOLOR_COPPER
|
||||
{"Apricot", {0x00, 0xd8, 0xd9, 0xda, 0xdb, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e}, SKINCOLOR_CYAN, 4, V_ORANGEMAP, true}, // SKINCOLOR_APRICOT
|
||||
{"Orange", {0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x2c}, SKINCOLOR_BLUE, 4, V_ORANGEMAP, true}, // SKINCOLOR_ORANGE
|
||||
{"Orange", { 49, 50, 51, 52, 53, 54, 55, 57, 58, 59, 60, 42, 44, 45, 46, 46}, SKINCOLOR_BLUE, 4, V_ORANGEMAP, true}, // SKINCOLOR_ORANGE
|
||||
{"Pumpkin", { 51, 52, 53, 54, 56, 58, 59, 59, 61, 61, 63, 45, 46, 47, 47, 31}, SKINCOLOR_ARCTIC, 12, V_ORANGEMAP, true}, // SKINCOLOR_PUMPKIN
|
||||
{"Rust", {0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3c, 0x3d, 0x3d, 0x3d, 0x3f, 0x2c, 0x2d, 0x47, 0x2e, 0x2f, 0x2f}, SKINCOLOR_YOGURT, 8, V_ORANGEMAP, true}, // SKINCOLOR_RUST
|
||||
{"Gold", {0x51, 0x51, 0x54, 0x54, 0x41, 0x42, 0x43, 0x43, 0x44, 0x45, 0x46, 0x3f, 0x2d, 0x2e, 0x2f, 0x2f}, SKINCOLOR_LAVENDER, 10, V_YELLOWMAP, true}, // SKINCOLOR_GOLD
|
||||
{"Gold", {0x51, 0x51, 0x54, 0x54, 0x41, 0x42, 0x43, 0x43, 0x44, 0x45, 0x46, 0x3f, 0x2d, 0x2e, 0x2f, 0x2f}, SKINCOLOR_MAUVE, 8, V_YELLOWMAP, true}, // SKINCOLOR_GOLD
|
||||
{"Topaz", { 0, 81, 83, 73, 74, 74, 65, 52, 53, 54, 56, 58, 60, 42, 43, 45}, SKINCOLOR_METEORITE, 10, V_YELLOWMAP, true}, // SKINCOLOR_TOPAZ
|
||||
{"Sandy", {0x53, 0x40, 0x41, 0x42, 0x43, 0xe6, 0xe9, 0xe9, 0xea, 0xec, 0xec, 0xc6, 0xc6, 0xc7, 0xc7, 0xfe}, SKINCOLOR_SKY, 8, V_YELLOWMAP, true}, // SKINCOLOR_SANDY
|
||||
{"Goldenrod", { 0, 80, 81, 81, 83, 73, 73, 64, 65, 66, 67, 68, 69, 62, 44, 45}, SKINCOLOR_MAJESTY, 8, V_YELLOWMAP, true}, // SKINCOLOR_GOLDENROD
|
||||
{"Yellow", {0x52, 0x53, 0x49, 0x49, 0x4a, 0x4a, 0x4b, 0x4b, 0x4b, 0x4c, 0x4d, 0x4d, 0x4e, 0x4e, 0x4f, 0xed}, SKINCOLOR_CORNFLOWER, 8, V_YELLOWMAP, true}, // SKINCOLOR_YELLOW
|
||||
{"Olive", {0x4b, 0x4b, 0x4c, 0x4c, 0x4d, 0x4e, 0xe7, 0xe7, 0xe9, 0xc5, 0xc5, 0xc6, 0xc6, 0xc7, 0xc7, 0xfd}, SKINCOLOR_DUSK, 3, V_YELLOWMAP, true}, // SKINCOLOR_OLIVE
|
||||
{"Pear", { 88, 89, 188, 189, 189, 76, 76, 67, 67, 68, 69, 70, 45, 46, 47, 47}, SKINCOLOR_MARINE, 9, V_PERIDOTMAP, true}, // SKINCOLOR_PEAR
|
||||
{"Lemon", { 0, 80, 81, 83, 73, 73, 74, 74, 76, 76, 191, 191, 79, 79, 110, 111}, SKINCOLOR_FUCHSIA, 8, V_YELLOWMAP, true}, // SKINCOLOR_LEMON
|
||||
{"Lime", {0x50, 0x51, 0x52, 0x53, 0x48, 0xbc, 0xbd, 0xbe, 0xbe, 0xbf, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f}, SKINCOLOR_MAGENTA, 9, V_PERIDOTMAP, true}, // SKINCOLOR_LIME
|
||||
{"Peridot", {0x58, 0x58, 0xbc, 0xbc, 0xbd, 0xbd, 0xbe, 0xbe, 0xbe, 0xbf, 0x5e, 0x5e, 0x5f, 0x5f, 0x77, 0x77}, SKINCOLOR_COBALT, 2, V_PERIDOTMAP, true}, // SKINCOLOR_PERIDOT
|
||||
{"Apple", {0x49, 0x49, 0xbc, 0xbd, 0xbe, 0xbe, 0xbe, 0x67, 0x69, 0x6a, 0x6b, 0x6b, 0x6c, 0x6d, 0x6d, 0x6d}, SKINCOLOR_RASPBERRY, 13, V_PERIDOTMAP, true}, // SKINCOLOR_APPLE
|
||||
{"Green", {0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f}, SKINCOLOR_RED, 6, V_GREENMAP, true}, // SKINCOLOR_GREEN
|
||||
{"Chartreuse", { 80, 82, 72, 73, 188, 188, 113, 114, 114, 125, 126, 137, 138, 139, 253, 254}, SKINCOLOR_NOBLE, 9, V_PERIDOTMAP, true}, // SKINCOLOR_CHARTREUSE
|
||||
{"Green", {0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f}, SKINCOLOR_PEPPER, 8, V_GREENMAP, true}, // SKINCOLOR_GREEN
|
||||
{"Forest", {0x65, 0x66, 0x67, 0x68, 0x69, 0x69, 0x6a, 0x6b, 0x6b, 0x6c, 0x6d, 0x6d, 0x6e, 0x6e, 0x6e, 0x6f}, SKINCOLOR_SALMON, 9, V_GREENMAP, true}, // SKINCOLOR_FOREST
|
||||
{"Emerald", {0x70, 0x70, 0x71, 0x71, 0x72, 0x72, 0x73, 0x73, 0x73, 0x74, 0x75, 0x75, 0x76, 0x76, 0x77, 0x77}, SKINCOLOR_RUBY, 4, V_GREENMAP, true}, // SKINCOLOR_EMERALD
|
||||
{"Shamrock", {0x70, 0x70, 0x71, 0x71, 0x72, 0x72, 0x73, 0x73, 0x73, 0x74, 0x75, 0x75, 0x76, 0x76, 0x77, 0x77}, SKINCOLOR_CRYSTAL, 10, V_GREENMAP, true}, // SKINCOLOR_SHAMROCK
|
||||
{"Jade", { 128, 120, 121, 122, 122, 113, 114, 114, 115, 116, 117, 118, 119, 110, 111, 30}, SKINCOLOR_ROSY, 7, V_GREENMAP, true}, // SKINCOLOR_JADE
|
||||
{"Headlight", { 0, 80, 81, 82, 73, 84, 64, 65, 91, 91, 124, 125, 126, 137, 138, 139}, SKINCOLOR_LAVENDER, 10, V_YELLOWMAP, true}, // SKINCOLOR_HEADLIGHT
|
||||
{"Mint", {0x00, 0x00, 0x58, 0x58, 0x59, 0x62, 0x62, 0x62, 0x64, 0x67, 0x7e, 0x7e, 0x8f, 0x8f, 0x8a, 0x8a}, SKINCOLOR_VIOLET, 5, V_GREENMAP, true}, // SKINCOLOR_MINT
|
||||
{"Seafoam", {0x01, 0x58, 0x59, 0x5a, 0x7d, 0x7d, 0x7e, 0x7e, 0x7e, 0x8f, 0x8f, 0x8a, 0x8a, 0x8a, 0xfd, 0xfd}, SKINCOLOR_PLUM, 6, V_AQUAMAP, true}, // SKINCOLOR_SEAFOAM
|
||||
{"Aqua", {0x78, 0x79, 0x7a, 0x7a, 0x7b, 0x7b, 0x7c, 0x7c, 0x7c, 0x7d, 0x7e, 0x7e, 0x7f, 0x7f, 0x76, 0x77}, SKINCOLOR_ROSY, 7, V_AQUAMAP, true}, // SKINCOLOR_AQUA
|
||||
{"Master", { 0, 80, 88, 96, 112, 113, 99, 100, 124, 125, 126, 117, 107, 118, 119, 111}, SKINCOLOR_RED, 6, V_GREENMAP, true}, // SKINCOLOR_MASTER
|
||||
{"Emerald", { 80, 96, 112, 113, 114, 114, 125, 125, 126, 126, 137, 137, 138, 138, 139, 139}, SKINCOLOR_RUBY, 9, V_GREENMAP, true}, // SKINCOLOR_EMERALD
|
||||
{"Bottle", { 0, 1, 3, 4, 5, 140, 141, 141, 124, 125, 126, 127, 118, 119, 111, 111}, SKINCOLOR_LATTE, 14, V_AQUAMAP, true}, // SKINCOLOR_BOTTLE
|
||||
{"Seafoam", {0x01, 0x58, 0x59, 0x5a, 0x7c, 0x7d, 0x7d, 0x7e, 0x7e, 0x8f, 0x8f, 0x8a, 0x8a, 0x8b, 0xfd, 0xfd}, SKINCOLOR_PLUM, 6, V_AQUAMAP, true}, // SKINCOLOR_SEAFOAM
|
||||
{"Island", { 96, 97, 113, 113, 114, 124, 142, 136, 136, 150, 151, 153, 168, 168, 169, 169}, SKINCOLOR_GALAXY, 7, V_AQUAMAP, true}, // SKINCOLOR_ISLAND
|
||||
{"Aqua", {0x78, 0x79, 0x7a, 0x7a, 0x7b, 0x7b, 0x7c, 0x7c, 0x7c, 0x7d, 0x7e, 0x7e, 0x7f, 0x7f, 0x76, 0x77}, SKINCOLOR_TAFFY, 10, V_AQUAMAP, true}, // SKINCOLOR_AQUA
|
||||
{"Teal", {0x78, 0x78, 0x8c, 0x8c, 0x8d, 0x8d, 0x8d, 0x8e, 0x8e, 0x8f, 0x8f, 0x8f, 0x8a, 0x8a, 0x8a, 0x8a}, SKINCOLOR_PEACHY, 7, V_SKYMAP, true}, // SKINCOLOR_TEAL
|
||||
{"Wave", {0x00, 0x78, 0x78, 0x79, 0x8d, 0x87, 0x88, 0x89, 0x89, 0xae, 0xa8, 0xa8, 0xa9, 0xa9, 0xfd, 0xfd}, SKINCOLOR_QUAIL, 5, V_SKYMAP, true}, // SKINCOLOR_WAVE
|
||||
{"Cyan", {0x80, 0x81, 0xff, 0xff, 0x83, 0x83, 0x8d, 0x8d, 0x8d, 0x8e, 0x7e, 0x7f, 0x76, 0x76, 0x77, 0x6e}, SKINCOLOR_APRICOT, 6, V_SKYMAP, true}, // SKINCOLOR_CYAN
|
||||
{"Turquoise", { 0, 120, 121, 122, 123, 141, 141, 135, 136, 136, 150, 153, 155, 157, 159, 253}, SKINCOLOR_SANGRIA, 12, V_SKYMAP, true}, // SKINCOLOR_TURQUOISE
|
||||
{"Aquamarine", { 0, 120, 121, 131, 132, 133, 134, 134, 135, 135, 149, 149, 172, 173, 174, 175}, SKINCOLOR_GARNET, 8, V_SKYMAP, true}, // SKINCOLOR_AQUAMARINE
|
||||
{"Sky", {0x80, 0x80, 0x81, 0x82, 0x83, 0x83, 0x84, 0x85, 0x85, 0x86, 0x87, 0x88, 0x89, 0x89, 0x8a, 0x8b}, SKINCOLOR_SANDY, 1, V_SKYMAP, true}, // SKINCOLOR_SKY
|
||||
{"Marine", { 144, 146, 147, 147, 148, 135, 136, 136, 137, 137, 127, 118, 119, 111, 111, 111}, SKINCOLOR_PEAR, 13, V_SKYMAP, true}, // SKINCOLOR_MARINE
|
||||
{"Cerulean", {0x85, 0x86, 0x87, 0x88, 0x88, 0x89, 0x89, 0x89, 0x8a, 0x8a, 0xfd, 0xfd, 0xfd, 0x1f, 0x1f, 0x1f}, SKINCOLOR_NEON, 4, V_SKYMAP, true}, // SKINCOLOR_CERULEAN
|
||||
{"Dream", { 80, 208, 200, 200, 146, 146, 133, 134, 135, 136, 137, 138, 139, 139, 254, 254}, SKINCOLOR_FOUNDATION, 9, V_SKYMAP, true}, // SKINCOLOR_DREAM
|
||||
{"Icy", {0x00, 0x00, 0x00, 0x00, 0x80, 0x81, 0x83, 0x83, 0x86, 0x87, 0x95, 0x95, 0xad, 0xad, 0xae, 0xaf}, SKINCOLOR_CRIMSON, 0, V_SKYMAP, true}, // SKINCOLOR_ICY
|
||||
{"Sapphire", {0x80, 0x83, 0x86, 0x87, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xfd, 0xfe}, SKINCOLOR_SUNSET, 5, V_SKYMAP, true}, // SKINCOLOR_SAPPHIRE
|
||||
{"Daybreak", { 80, 81, 82, 72, 64, 9, 11, 171, 149, 150, 151, 153, 156, 157, 159, 253}, SKINCOLOR_EVENTIDE, 12, V_BLUEMAP, true}, // SKINCOLOR_DAYBREAK
|
||||
{"Sapphire", {0x80, 0x82, 0x86, 0x87, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xfd, 0xfe}, SKINCOLOR_SUNSET, 5, V_SKYMAP, true}, // SKINCOLOR_SAPPHIRE
|
||||
{"Arctic", { 0, 1, 3, 4, 146, 146, 147, 148, 148, 149, 150, 153, 156, 159, 253, 254}, SKINCOLOR_PUMPKIN, 6, V_BLUEMAP, true}, // SKINCOLOR_ARCTIC
|
||||
{"Cornflower", {0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x9a, 0x9c, 0x9d, 0x9d, 0x9e, 0x9e, 0x9e}, SKINCOLOR_YELLOW, 4, V_BLUEMAP, true}, // SKINCOLOR_CORNFLOWER
|
||||
{"Blue", {0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xfd, 0xfe}, SKINCOLOR_ORANGE, 5, V_BLUEMAP, true}, // SKINCOLOR_BLUE
|
||||
{"Cobalt", {0x93, 0x94, 0x95, 0x96, 0x98, 0x9a, 0x9b, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xfd, 0xfd, 0xfe, 0xfe}, SKINCOLOR_PERIDOT, 5, V_BLUEMAP, true}, // SKINCOLOR_COBALT
|
||||
{"Cobalt", { 145, 147, 149, 150, 151, 153, 154, 155, 156, 157, 158, 159, 253, 253, 254, 254}, SKINCOLOR_PERIDOT, 5, V_BLUEMAP, true}, // SKINCOLOR_COBALT
|
||||
{"Midnight", { 171, 171, 172, 173, 173, 174, 155, 156, 157, 159, 253, 253, 254, 254, 31, 31}, SKINCOLOR_CHERRY, 10, V_GRAYMAP, true}, // SKINCOLOR_MIDNIGHT
|
||||
{"Galaxy", { 160, 161, 162, 163, 164, 165, 166, 166, 154, 155, 156, 157, 159, 253, 254, 31}, SKINCOLOR_ISLAND, 7, V_PURPLEMAP, true}, // SKINCOLOR_GALAXY
|
||||
{"Vapor", {0x80, 0x81, 0x83, 0x86, 0x94, 0x94, 0xa3, 0xa3, 0xa4, 0xa6, 0xa6, 0xa6, 0xa8, 0xa8, 0xa9, 0xa9}, SKINCOLOR_LILAC, 4, V_SKYMAP, true}, // SKINCOLOR_VAPOR
|
||||
{"Dusk", {0x92, 0x93, 0x94, 0x94, 0xac, 0xad, 0xad, 0xad, 0xae, 0xae, 0xaf, 0xaf, 0xa9, 0xa9, 0xfd, 0xfd}, SKINCOLOR_OLIVE, 0, V_BLUEMAP, true}, // SKINCOLOR_DUSK
|
||||
{"Majesty", { 0, 1, 176, 160, 160, 161, 162, 162, 163, 172, 173, 174, 174, 175, 139, 139}, SKINCOLOR_GOLDENROD, 9, V_PURPLEMAP, true}, // SKINCOLOR_MAJESTY
|
||||
{"Pastel", {0x90, 0x90, 0xa0, 0xa0, 0xa1, 0xa1, 0xa2, 0xa2, 0xa2, 0xa3, 0xa4, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8}, SKINCOLOR_BUBBLEGUM, 9, V_PURPLEMAP, true}, // SKINCOLOR_PASTEL
|
||||
{"Purple", {0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa4, 0xa5, 0xa5, 0xa5, 0xa6, 0xa7, 0xa7, 0xa8, 0xa8, 0xa9, 0xa9}, SKINCOLOR_FLAME, 7, V_PURPLEMAP, true}, // SKINCOLOR_PURPLE
|
||||
{"Bubblegum", {0x00, 0xd0, 0xd0, 0xc8, 0xc8, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8}, SKINCOLOR_PASTEL, 8, V_MAGENTAMAP, true}, // SKINCOLOR_BUBBLEGUM
|
||||
{"Noble", { 144, 146, 147, 148, 149, 164, 164, 165, 166, 185, 186, 186, 187, 187, 28, 29}, SKINCOLOR_CHARTREUSE, 12, V_PURPLEMAP, true}, // SKINCOLOR_NOBLE
|
||||
{"Fuchsia", { 200, 201, 203, 204, 204, 183, 184, 184, 165, 166, 167, 168, 169, 159, 253, 254}, SKINCOLOR_LEMON, 10, V_PURPLEMAP, true}, // SKINCOLOR_FUCHSIA
|
||||
{"Bubblegum", { 0, 208, 208, 176, 177, 178, 179, 180, 181, 182, 164, 166, 167, 168, 169, 253}, SKINCOLOR_PASTEL, 8, V_MAGENTAMAP, true}, // SKINCOLOR_BUBBLEGUM
|
||||
{"Crystal", { 252, 177, 179, 180, 181, 181, 182, 182, 183, 164, 166, 167, 167, 168, 169, 159}, SKINCOLOR_EMERALD, 8, V_MAGENTAMAP, true}, // SKINCOLOR_CRYSTAL
|
||||
{"Magenta", {0xb3, 0xb3, 0xb4, 0xb5, 0xb6, 0xb6, 0xb7, 0xb7, 0xb7, 0xb8, 0xb9, 0xb9, 0xba, 0xba, 0xbb, 0xbb}, SKINCOLOR_LIME, 6, V_MAGENTAMAP, true}, // SKINCOLOR_MAGENTA
|
||||
{"Neon", {0xb3, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xb9, 0xba, 0xba, 0xbb, 0xbb, 0xc7, 0xc7, 0x1d, 0x1d, 0x1e}, SKINCOLOR_CERULEAN, 2, V_MAGENTAMAP, true}, // SKINCOLOR_NEON
|
||||
{"Violet", {0xd0, 0xd1, 0xd2, 0xca, 0xcc, 0xb8, 0xb9, 0xb9, 0xba, 0xa8, 0xa8, 0xa9, 0xa9, 0xfd, 0xfe, 0xfe}, SKINCOLOR_MINT, 6, V_MAGENTAMAP, true}, // SKINCOLOR_VIOLET
|
||||
{"Royal", { 208, 209, 192, 192, 192, 193, 193, 194, 194, 172, 173, 174, 175, 175, 139, 139}, SKINCOLOR_FANCY, 9, V_PURPLEMAP, true}, // SKINCOLOR_ROYAL
|
||||
{"Lilac", {0x00, 0xd0, 0xd1, 0xd2, 0xd3, 0xc1, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc5, 0xc6, 0xc6, 0xfe, 0x1f}, SKINCOLOR_VAPOR, 4, V_ROSYMAP, true}, // SKINCOLOR_LILAC
|
||||
{"Mauve", { 176, 177, 178, 192, 193, 194, 195, 195, 196, 185, 185, 186, 186, 187, 187, 253}, SKINCOLOR_GOLD, 4, V_PURPLEMAP, true}, // SKINCOLOR_MAUVE
|
||||
{"Eventide", { 51, 52, 53, 33, 34, 204, 183, 183, 184, 184, 166, 167, 168, 169, 253, 254}, SKINCOLOR_DAYBREAK, 13, V_MAGENTAMAP, true}, // SKINCOLOR_EVENTIDE
|
||||
{"Plum", {0xc8, 0xd3, 0xd5, 0xd6, 0xd7, 0xce, 0xcf, 0xb9, 0xb9, 0xba, 0xba, 0xa9, 0xa9, 0xa9, 0xfd, 0xfe}, SKINCOLOR_MINT, 7, V_ROSYMAP, true}, // SKINCOLOR_PLUM
|
||||
{"Raspberry", {0xc8, 0xc9, 0xca, 0xcb, 0xcb, 0xcc, 0xcd, 0xcd, 0xce, 0xb9, 0xb9, 0xba, 0xba, 0xbb, 0xfe, 0xfe}, SKINCOLOR_APPLE, 13, V_ROSYMAP, true}, // SKINCOLOR_RASPBERRY
|
||||
{"Rosy", {0xfc, 0xc8, 0xc8, 0xc9, 0xc9, 0xca, 0xca, 0xcb, 0xcb, 0xcc, 0xcc, 0xcd, 0xcd, 0xce, 0xce, 0xcf}, SKINCOLOR_AQUA, 1, V_ROSYMAP, true}, // SKINCOLOR_ROSY
|
||||
{"Taffy", { 1, 176, 176, 177, 178, 179, 202, 203, 204, 204, 205, 206, 207, 44, 45, 46}, SKINCOLOR_AQUA, 1, V_ROSYMAP, true}, // SKINCOLOR_TAFFY
|
||||
{"Rosy", {0xfc, 0xc8, 0xc8, 0xc9, 0xc9, 0xca, 0xca, 0xcb, 0xcb, 0xcc, 0xcc, 0xcd, 0xcd, 0xce, 0xce, 0xcf}, SKINCOLOR_JADE, 8, V_ROSYMAP, true}, // SKINCOLOR_ROSY
|
||||
{"Fancy", { 0, 208, 49, 210, 210, 202, 202, 203, 204, 204, 205, 206, 207, 207, 186, 186}, SKINCOLOR_ROYAL, 9, V_ROSYMAP, true}, // SKINCOLOR_FANCY
|
||||
{"Sangria", { 210, 32, 33, 34, 34, 215, 215, 207, 207, 185, 186, 186, 186, 169, 169, 253}, SKINCOLOR_TURQUOISE, 12, V_ROSYMAP, true}, // SKINCOLOR_SANGRIA
|
||||
{"Volcanic", { 35, 38, 41, 42, 44, 46, 46, 169, 169, 159, 253, 254, 30, 30, 31, 31}, SKINCOLOR_BRONZE, 9, V_REDMAP, true}, // SKINCOLOR_VOLCANIC
|
||||
|
||||
// super
|
||||
{"Super Silver 1", {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x03}, SKINCOLOR_BLACK, 15, 0, false}, // SKINCOLOR_SUPERSILVER1
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 2012-2016 by John "JTE" Muniz.
|
||||
// Copyright (C) 2012-2022 by Sonic Team Junior.
|
||||
// Copyright (C) 2012-2023 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
@ -874,6 +874,7 @@ static int lib_pGetClosestAxis(lua_State *L)
|
|||
|
||||
static int lib_pSpawnParaloop(lua_State *L)
|
||||
{
|
||||
mobj_t *ptmthing = tmthing;
|
||||
fixed_t x = luaL_checkfixed(L, 1);
|
||||
fixed_t y = luaL_checkfixed(L, 2);
|
||||
fixed_t z = luaL_checkfixed(L, 3);
|
||||
|
@ -890,6 +891,7 @@ static int lib_pSpawnParaloop(lua_State *L)
|
|||
if (nstate >= NUMSTATES)
|
||||
return luaL_error(L, "state %d out of range (0 - %d)", nstate, NUMSTATES-1);
|
||||
P_SpawnParaloop(x, y, z, radius, number, type, nstate, rotangle, spawncenter);
|
||||
P_SetTarget(&tmthing, ptmthing);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -3541,7 +3543,6 @@ static int lib_gAddPlayer(lua_State *L)
|
|||
return 1;
|
||||
}
|
||||
|
||||
|
||||
newplayernum = i;
|
||||
|
||||
CL_ClearPlayer(newplayernum);
|
||||
|
@ -3553,9 +3554,6 @@ static int lib_gAddPlayer(lua_State *L)
|
|||
newplayer->jointime = 0;
|
||||
newplayer->quittime = 0;
|
||||
|
||||
// Set the bot name (defaults to Bot #)
|
||||
strcpy(player_names[newplayernum], va("Bot %d", botcount));
|
||||
|
||||
// Read the skin argument (defaults to Sonic)
|
||||
if (!lua_isnoneornil(L, 1))
|
||||
{
|
||||
|
@ -3567,7 +3565,10 @@ static int lib_gAddPlayer(lua_State *L)
|
|||
if (!lua_isnoneornil(L, 2))
|
||||
newplayer->skincolor = R_GetColorByName(luaL_checkstring(L, 2));
|
||||
else
|
||||
newplayer->skincolor = skins[newplayer->skin].prefcolor;
|
||||
newplayer->skincolor = skins[skinnum].prefcolor;
|
||||
|
||||
// Set the bot default name as the skin
|
||||
strcpy(player_names[newplayernum], skins[skinnum].realname);
|
||||
|
||||
// Read the bot name, if given
|
||||
if (!lua_isnoneornil(L, 3))
|
||||
|
@ -3583,14 +3584,19 @@ static int lib_gAddPlayer(lua_State *L)
|
|||
// Set the skin (can't do this until AFTER bot type is set!)
|
||||
SetPlayerSkinByNum(newplayernum, skinnum);
|
||||
|
||||
|
||||
if (netgame)
|
||||
{
|
||||
char joinmsg[256];
|
||||
|
||||
// Truncate bot name
|
||||
player_names[newplayernum][sizeof(*player_names) - 8] = '\0'; // The length of colored [BOT] + 1
|
||||
|
||||
strcpy(joinmsg, M_GetText("\x82*Bot %s has joined the game (player %d)"));
|
||||
strcpy(joinmsg, va(joinmsg, player_names[newplayernum], newplayernum));
|
||||
HU_AddChatText(joinmsg, false);
|
||||
|
||||
// Append blue [BOT] tag at the end
|
||||
strlcat(player_names[newplayernum], "\x84[BOT]\x80", sizeof(*player_names));
|
||||
}
|
||||
|
||||
LUA_PushUserdata(L, newplayer, META_PLAYER);
|
||||
|
@ -3624,6 +3630,16 @@ static int lib_gRemovePlayer(lua_State *L)
|
|||
}
|
||||
|
||||
|
||||
static int lib_gSetUsedCheats(lua_State *L)
|
||||
{
|
||||
// Let large-scale level packs using Lua be able to add cheat commands.
|
||||
boolean silent = lua_optboolean(L, 1);
|
||||
//NOHUD
|
||||
//INLEVEL
|
||||
G_SetUsedCheats(silent);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int Lcheckmapnumber (lua_State *L, int idx, const char *fun)
|
||||
{
|
||||
if (ISINLEVEL)
|
||||
|
@ -4226,6 +4242,7 @@ static luaL_Reg lib[] = {
|
|||
{"G_AddGametype", lib_gAddGametype},
|
||||
{"G_AddPlayer", lib_gAddPlayer},
|
||||
{"G_RemovePlayer", lib_gRemovePlayer},
|
||||
{"G_SetUsedCheats", lib_gSetUsedCheats},
|
||||
{"G_BuildMapName",lib_gBuildMapName},
|
||||
{"G_BuildMapTitle",lib_gBuildMapTitle},
|
||||
{"G_FindMap",lib_gFindMap},
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue