From 93cdac681bb1c8c2ce566f030d94a139fb8bd65a Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Sat, 8 Oct 2022 05:39:56 -0400 Subject: [PATCH] Keep track of script activators Can supply the activating object, line, line side, polyobject, and (added for SRB2) sector. --- libs/ACSVM/include/CAPI/Thread.cpp | 8 ++ libs/ACSVM/include/CAPI/Thread.h | 2 + libs/ACSVM/lib/libacsvm-capi.dll.a | Bin 316006 -> 316702 bytes src/g_game.c | 3 + src/k_acs-func.c | 107 +++++++++++++++++++- src/k_acs.c | 155 ++++++++++++++++++++++++++++- src/k_acs.h | 53 ++++++++++ src/p_setup.c | 5 + 8 files changed, 327 insertions(+), 6 deletions(-) diff --git a/libs/ACSVM/include/CAPI/Thread.cpp b/libs/ACSVM/include/CAPI/Thread.cpp index 53a742e7a..7047128ac 100644 --- a/libs/ACSVM/include/CAPI/Thread.cpp +++ b/libs/ACSVM/include/CAPI/Thread.cpp @@ -155,6 +155,14 @@ ACSVM_Thread *ACSVM_AllocThread(ACSVM_Environment *env, return new(std::nothrow) ACSVM_Thread(env, *funcs, data); } +// +// ACSVM_AllocThreadInfo +// +ACSVM_ThreadInfo *ACSVM_AllocThreadInfo(void *data) +{ + return new(std::nothrow) ACSVM_ThreadInfo(data); +} + // // ACSVM_ThreadFromVoid // diff --git a/libs/ACSVM/include/CAPI/Thread.h b/libs/ACSVM/include/CAPI/Thread.h index 066f0cf7f..192aacc80 100644 --- a/libs/ACSVM/include/CAPI/Thread.h +++ b/libs/ACSVM/include/CAPI/Thread.h @@ -133,6 +133,8 @@ public: ACSVM_Thread *ACSVM_AllocThread(ACSVM_Environment *env, ACSVM_ThreadFuncs const *funcs, void *data); +ACSVM_ThreadInfo *ACSVM_AllocThreadInfo(void *data); + ACSVM_Thread *ACSVM_ThreadFromVoid(void *thread); void ACSVM_Thread_Exec(ACSVM_Thread *thread); diff --git a/libs/ACSVM/lib/libacsvm-capi.dll.a b/libs/ACSVM/lib/libacsvm-capi.dll.a index 00609ebda32b3304a4a7e9182a91dcb19afd7378..e76867d99ecc92087d8835494fc2f7839430d041 100644 GIT binary patch delta 9077 zcmYM&2Yk;**Z}Z*o;yio{4->WB($~+O2iJeN9-*TqqYcYloC{96Zw%-RZ_? ztjt^6g=ps6 z{4=Xkk^mOt$ub4RZL_LUbgX(KE8(>OR*Oc!>h8B1tQ5c+-mx0T3t-JCkF{K8C1(p@ z?PyS}<36iPv;fv^3dy98o@K0*BLY~T=2pKy1+W3s2pe3@8hSwh8_~@gbxi;p8)$vh zQUIGsZL!P%Yg()T_URRC=6=fOk2!0s`7;Huh2yP7^#!opN7iTb9$WUn%A@6Bt7!V! z+C=N?xdPY*3W{x_X{d`scJ9oqSwYdOxk=kch;;n1j1+d?eY5jjo7H~^ge+&@7?&es3PZq!)4YB?i zCV)Llw_Z{idrj{Xgq>Eg>H?Yj1IsgCAoJN{`Q-{^B{C<_2MJEK!cZV9xyFj@FOZe4 zV!iW3AS?IOs`yMGtMbT-yCINOJ7d+@C6Fbqx9YkCvIYTGW}|q4tVxp9e275SilSr5 z^R4#O0PA$X>UvBd>+z?RvP~dMTV(YcFOUtO!LUJdt)X26vh={WGBM++cm%xjO`@0ClnCpSXn`y%+?qxCY;I#~{!W2xVS?ps7sztUSxc4(WS@JoOo3nIT6vVg zR#K)>jE2Q%s8 zNT_vewm^2`iS^SUf$U5N>+E*|*?HOv?AILYQh-2qCCj>YLm>N&0%W(`tUHAQ*3?7a_?K8(dgLcG&5{@1uKsNWGkOp zU-cD|t=(s>j}VgOe{5~KDJ0vPXcep$l4QyqDBjvhQM2!MS-V4pWP8V2Kb#ek9f-FM z%@vXzq0zA8RF|DRV-u-}$gzdsR@ z-RWWdxkE^Hk9IlxJKcI%BqV#%+IqT8NcNoGVK2v9|4~3hiRvViJ}}2puZ3dny{zJe zLNV{Amg_sAn18%gVzp2#*ky%I5Q>%buu5eK#iA+A%FMRjeI*ntpDt7;e^e~8sx%gg z#qP4IRuGE4M**@LREZ^09afv_v3gX8HP~V`3Kxnso^Lfnp;(KtR;&9$vE=?DlRs2D znhw@6+3LJsDAp~>>X9cD>-ECw-9sqWXT8;rW{nM)W(}go+0YDY_)Vc$MmKBJC85}u z)J*;mYTO-*j+J5`U$HV<(iD-YC#>m>gko8TtXWlrVskcG^Q#HPvUgZctWaz*O+C}p zDO*Z;Y*{8{E+fk+0QO~VYt>w#*jE$?TSsfo*3$@C{#k1?%@Es4v%|K#Sv%5&VmnV+ z-$x3?cGHZoy$7uN``;Cc9T;yNqR!Y+3WObBX`S*EiWO32c4j{-xZoWzOSMQJFhbA$ zL5012D!9J*AQZ1zHNpO{aZWD@h3ZcGy%7#9iG*6t)+G_n5nXcIlG-sUE2{{GbkH#P@bl~SeC;lgof>p=+pp$jHl(TQ7(i@t}jZVAMiB#fp>bg7%qJQcO zjye_OY&z}jtUdla{omyj`jpejO=MWXFQ+SmGp(?cf)U4S)w4SC=OwELEB4B&`G}JUhw&q8VEBB zPG75oPT@88f)c;IhmQAeu7Xa#S3&r+VCroum~z`yaO{s*bo+!G>Zp^7!?A)Rcl!cN zE2wQEZF%Nx#=46y99RRIRM+bnfP7b1ciY*@Xut4~~piFiMi~<}1&cnb^ zC%R~lDGGxOz;tl@f{8Uo+#nB~hp@-wMZ+L~ zp{95lsD;|243+r=yE{F9->WZ`f#N2rETjMq2Hn0qgqqxPG(i1vIU3HH3eX5)puQRd z<#qfgpiEL_SdKcdGE{KlLOhHs7RIB#5(92#ZalrKv*M}RrD{+c^{Hy$?)(!HXIj^Q zEY!g@Xq>kap`!6jgqetaKyR%BtR=0ZJc9(tQ`Ni^o22~Bl<$HQ!hHqP_=QW_w+rpnax7CsTI{971dkPK$C` zX7(pgL1Ht|u9?tC7tNx;GRjZTq4Oc!44Vm+KyS-}Am>&2I75Ybh)uxRU7?}bJr`CW zHU_;f8=9Kc3t%1UUJJm}`L$x4`7{USp>CZ6e!5pKysKYmIB!bj!q-`l-sB3)IK}Xcy>mb04TF)CTZ9VPAo%zrWp_cLA3_Vf%Z3cIJeg~9y zGUJMw6aoWunO8$Oo;5;E*iW#Tj>ai!&--Uu_xyX1Z+4u4M}SqpX`j&6JUqPtDTit4q9}E6|~-S;kbj3Tdd-RfuqQ*Yq_7 z*I@+enb#r82~P|(oo~`$u`D5SHq`J!({vkPf^$Y6B5j_dvpl(fO}9= zFMkNWX2}CsgSx{5NN_gP2{CgX!#AkwKc-}hx*=xXQ%)v51rKLn-Iiw2bJ&Br(Q|0& zJ_T9}j*!;DJ@0 zAxUL4jctRO?2Un_r+8siUFeIx=8OxMpw4koIzIqQm`(nehkA%VrL%)5ofF9ES`faQr{1!ViitlEI~*9{TlY_=v4|Y0R(6$gVoLOD0EOKMqv$8qYORf zmcbg%rmmqTs4UV*kGzWsJ1XD_)W^zWf-YGFgG@+eq=h_DiPEWY7(h26(ndNIgYTQ? z@wkx|Egln`sOG-rulMjP1W&Ut0q@bxoIoKSZa%==t%WrElWU=;^L2~HCcYlh3f!oR zE%cU#=rZ+^@G$CI4KT#n(keke?ulD<(hI0;VjAOZ(CU3`8G30JJx0#Mbkw2qsQ2SNiaYT=yv@c1NO$hs1sH6i zb8rx9&m7teUo7I>nTsgbPh&6CFLJ3)<(~d#)@Rt6ZlTYxgp=Hp_Te)6#~gj-b1MC= zXMmZx9J?U=Zm#Cxx0IcSVfxf+Ofa`sy`B117;bj1!7ViHYtUVX_K7gLhiGhi{2>h7aTHTg-#x-n^>sHN9mlq) zQ;%bqxqcGq-ac}YC%A7dd&9<_#%G}G7Scr#ewM;X`k5kt(`LahI1=^zU(m~VU7%{Y z7cf9)UqnAMvxwUtP=qe0LVrJ_E>p*NQs{=)FwkUN#ipoxTt$C#_&T;iJT4sn4?>*> z{i99mo4khuZeqCp?>3e;LAP-M>Y`idqbJ^_uJ`@H2WRyk7~w<>h&1c&^6Tk$(OcJf zfTc|Dzi~L?A))s^qRM|ir0LWr9#Z93|5EArCpdv_q$gO(MEpyS_@mHMUr<-kiSmqo z@QQ9F{Q`%A&V7!dPP;+MM83jysPPqs>g+eD%()O7=>w879QQ$2{2uL7xb%g{(o_h-IY9x97K?+T$; zqK1_;ve{>>7J@Y0k@2mzNUW+53Ftsz3n-|rD?xz(9z+l ztp3GI2Af~wqr z4QM*rjx1)*H>4!2(IZ>Q5+SZpF!rR+6?!vgF@g8+F=D8q}m_(#u>)mKmV$w4s;(_h;8-O?e)a@^Ma%Ebiow zavA#lMPJL3+sQ!3HQHNK2SsL6M;_Al4pcFAw3nt{iZtbUnAk3IEZ}nC^d22-c6F7_ zX+w9FfhM$vY)y00gC58C;>Z5IXcFSmWSnv9E$Lg#fm9lSUq2aZZuQ~x>OQiB({4t09suqQoJzCpQn1^v!MMFp74| zSY^UTa0obp>ijv@TmL&+-f;dJ>tixT$w8p|j-=OO#(5darv@&Jrq|NPd7I&5Ihj0` zLfrR}EN-rim+cU;P1T7!+3^!8YsMr=zosTnqA?d`@*JPZlmSkg@$RP8G=8btG)k@* zU(9TtE}PNcwdpdzc+8M=yFJa40XkzgRm_;h=`ORRuM_!EadU1C$GT?@4XEmT9!2DQ z3UA&=?q)@{q&sYSHtlIQhnN3;4(+oMi}|H)i|O%K&5!#vby9yR@4hNasgrqMP@o%^ zaowC{RODL0MX#1qQOZgxn)D?X_5G3>_-z$8aAFm`)qD-FPr@2{T(eHLM7?Mo4dw5N zZpLE+2l!w;mGs>x>AG#VkCeudqcm50CwrQ9CpfZdCn))5vadOMO42>K=9G*w z%}&b?=)3-D8t#uj^8w5Mnf6@0^K=kup5p}%Jts>#NmJa+<_kQI`4_1B(ieGRyf4yA znU`ffgaKyvRgP%aRq3Jsxk0f+-r!|aH|XuDH@RroP3f<%-KG`3ev9|Qkz3N=H28yu z6#ECAfaQPjJkI`$2KxM-Y(cl?J*trMkorh{Ks!x0dO(3~eoRYr{1FGb=@G4b;y>I? z^gq{UvrQ7ucg1U{1Z151@y0a*j4EE zN`;$gQc*_(r1Ev{f8t^OC`N_Q*;MsVqiKhGs6f5IPq{e@rWZ3mdMcWn)t;)9sp-Ry z;Xc&BI$uTKJm&jSZs`EZg?8qnKsA`I=s*>q)54Uyc^Rx|?rsDtx_`4=W=xnGNT(`H zMVnV875xppR8mDanOW{;Qlz3q>Jh0T%(G}kt9dD!9w)q`XeCqMQ6WzH3^#MHtfHwX zEURd$Dk_?)3N!+2Mqj*Ugqfq26m8{Al_>7|vC7*d#wa?Ip)tze={?iSybMAxT%f`F>&?z zrO^76yF7_=rza_Y^QMvNN2jup^3YwIs$esv3Afz035C9Vw!3-KjFab@slc2$-eyQk zj;&=&6{6d=Rc_{LYt@|&Z)=*#&TV;q6WdbjhuZV}=C`NZ2Aw#!OeY%L=UtVLFhJ54pF-Ik{4rs}Ksrs_+v?HsMVa|b9t^R&OB z?`CKE(}0E#5yx4_q2`%rZNy=Altbs8-2FX^^Z6oAQ)P>ye@^lh&h^~ z%Au}!K*j16S?Z;^yI<7@opngX=-yZGrRi``RR?qbh^hc)(_z&Bbm!wLPG2ifFHG<; ll|*0ZPSU$?>rOtwbzOy&?zx`Yx_L@f0!*xF{0eD%{0}ANUC96d delta 8972 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 xfmo != NULL && P_MobjWasRemoved(info->mo) == false) + && (info->mo->player != NULL)) + { + return P_IsDisplayPlayer(info->mo->player); + } + + return false; +} + /*-------------------------------------------------- bool ACS_CF_Random(ACSVM_Thread *thread, ACSVM_Word const *argV, ACSVM_Word argC) @@ -315,10 +344,29 @@ bool ACS_CF_ChangeCeiling(ACSVM_Thread *thread, ACSVM_Word const *argV, ACSVM_Wo return false; } +/*-------------------------------------------------- + bool ACS_CF_LineSide(ACSVM_Thread *thread, ACSVM_Word const *argV, ACSVM_Word argC) + + Pushes which side of the linedef was + activated. +--------------------------------------------------*/ +bool ACS_CF_LineSide(ACSVM_Thread *thread, ACSVM_Word const *argV, ACSVM_Word argC) +{ + acs_threadinfo_t *info = (acs_threadinfo_t *)ACSVM_Thread_GetInfo(thread); + + (void)argV; + (void)argC; + + ACSVM_Thread_DataStk_Push(thread, info->side); + return false; +} + /*-------------------------------------------------- bool ACS_CF_EndPrint(ACSVM_Thread *thread, ACSVM_Word const *argV, ACSVM_Word argC) - ACS wrapper for CONS_Printf. + One of the ACS wrappers for CEcho. This + version only prints if the activator is a + display player. --------------------------------------------------*/ bool ACS_CF_EndPrint(ACSVM_Thread *thread, ACSVM_Word const *argV, ACSVM_Word argC) { @@ -328,7 +376,13 @@ bool ACS_CF_EndPrint(ACSVM_Thread *thread, ACSVM_Word const *argV, ACSVM_Word ar (void)argC; buf = ACSVM_Thread_GetPrintBuf(thread); - CONS_Printf("%s\n", ACSVM_PrintBuf_GetData(buf)); + + if (ACS_ActivatorIsLocal(thread) == true) + { + HU_SetCEchoDuration(5); + HU_DoCEcho(ACSVM_PrintBuf_GetData(buf)); + } + ACSVM_PrintBuf_Drop(buf); return false; @@ -411,3 +465,52 @@ bool ACS_CF_Timer(ACSVM_Thread *thread, ACSVM_Word const *argV, ACSVM_Word argC) ACSVM_Thread_DataStk_Push(thread, leveltime); return false; } + +/*-------------------------------------------------- + bool ACS_CF_EndPrintBold(ACSVM_Thread *thread, ACSVM_Word const *argV, ACSVM_Word argC) + + One of the ACS wrappers for CEcho. This + version prints for all players. +--------------------------------------------------*/ +bool ACS_CF_EndPrintBold(ACSVM_Thread *thread, ACSVM_Word const *argV, ACSVM_Word argC) +{ + ACSVM_PrintBuf *buf = NULL; + + (void)argV; + (void)argC; + + buf = ACSVM_Thread_GetPrintBuf(thread); + + HU_SetCEchoDuration(5); + HU_DoCEcho(ACSVM_PrintBuf_GetData(buf)); + + ACSVM_PrintBuf_Drop(buf); + + return false; +} + +/*-------------------------------------------------- + bool ACS_CF_EndLog(ACSVM_Thread *thread, ACSVM_Word const *argV, ACSVM_Word argC) + + One of the ACS wrappers for CONS_Printf. + This version only prints if the activator + is a display player. +--------------------------------------------------*/ +bool ACS_CF_EndLog(ACSVM_Thread *thread, ACSVM_Word const *argV, ACSVM_Word argC) +{ + ACSVM_PrintBuf *buf = NULL; + + (void)argV; + (void)argC; + + buf = ACSVM_Thread_GetPrintBuf(thread); + + if (ACS_ActivatorIsLocal(thread) == true) + { + CONS_Printf("%s\n", ACSVM_PrintBuf_GetData(buf)); + } + + ACSVM_PrintBuf_Drop(buf); + + return false; +} diff --git a/src/k_acs.c b/src/k_acs.c index e06ddf824..656d70cbd 100644 --- a/src/k_acs.c +++ b/src/k_acs.c @@ -23,6 +23,10 @@ #include "r_state.h" #include "p_polyobj.h" #include "taglist.h" +#include "d_player.h" +#include "g_game.h" +#include "p_tick.h" +#include "p_local.h" #include "CAPI/BinaryIO.h" #include "CAPI/Environment.h" @@ -227,7 +231,7 @@ static void ACS_EnvConstruct(ACSVM_Environment *env) ACS_AddCodeDataCallFunc(env, 67, "", 2, ACS_CF_ChangeCeiling); ACS_AddCodeDataCallFunc(env, 68, "WWS", 0, ACS_CF_ChangeCeiling); // 69 to 79: Implemented by ACSVM - + ACS_AddCodeDataCallFunc(env, 80, "", 0, ACS_CF_LineSide); // 81 to 82: Implemented by ACSVM // 84 to 85: Implemented by ACSVM @@ -237,6 +241,8 @@ static void ACS_EnvConstruct(ACSVM_Environment *env) ACS_AddCodeDataCallFunc(env, 91, "", 0, ACS_CF_GameType); ACS_AddCodeDataCallFunc(env, 92, "", 0, ACS_CF_GameSpeed); ACS_AddCodeDataCallFunc(env, 93, "", 0, ACS_CF_Timer); + + ACS_AddCodeDataCallFunc(env, 101, "", 0, ACS_CF_EndPrintBold); // 136 to 137: Implemented by ACSVM // 157: Implemented by ACSVM @@ -256,7 +262,7 @@ static void ACS_EnvConstruct(ACSVM_Environment *env) // 256 to 257: Implemented by ACSVM // 263: Implemented by ACSVM - ACS_AddCodeDataCallFunc(env, 270, "", 0, ACS_CF_EndPrint); + ACS_AddCodeDataCallFunc(env, 270, "", 0, ACS_CF_EndLog); // 273 to 275: Implemented by ACSVM // 291 to 325: Implemented by ACSVM @@ -404,6 +410,85 @@ static bool ACS_EnvCheckTag(ACSVM_Environment const *env, ACSVM_Word type, ACSVM return true; } +/*-------------------------------------------------- + static void ACS_ThrDestruct(ACSVM_Thread *thread) + + ACSVM Thread hook. Runs as the thread + is in the process of being destroyed. + + Input Arguments:- + thread - The ACS thread data to destroy. + + Return:- + N/A +--------------------------------------------------*/ +static void ACS_ThrDestruct(ACSVM_Thread *thread) +{ + acs_threadinfo_t *info = ACSVM_Thread_GetInfo(thread); + + if (info != NULL) + { + Z_Free(info); + } +} + +/*-------------------------------------------------- + static void ACS_ThrStart(ACSVM_Thread *thread, void *data) + + ACSVM Thread hook. Runs immediately after + an ACS thread has been started. + + Input Arguments:- + thread - The ACS thread data. + data - ACS thread info, as a raw pointer. + + Return:- + The newly created ACS thread. +--------------------------------------------------*/ +static void ACS_ThrStart(ACSVM_Thread *thread, void *data) +{ + acs_threadinfo_t *activator = NULL; + + ACSVM_Thread_SetResult(thread, 1); + + if (data == NULL) + { + // Create an empty one, to reduce NULL checks. + // Might not be necessary. + activator = Z_Calloc(sizeof(acs_threadinfo_t), PU_STATIC, NULL); + } + else + { + activator = (acs_threadinfo_t *)data; + } + + ACSVM_Thread_SetInfo(thread, activator); +} + +/*-------------------------------------------------- + static ACSVM_Thread *ACS_EnvAllocThread(ACSVM_Environment *env) + + ACSVM Environment hook. Runs when an ACS + thread is being created. This is where + our own thread hooks are supposed to + be loaded. + + Input Arguments:- + env - The ACS environment data. + + Return:- + The newly created ACS thread. +--------------------------------------------------*/ +static ACSVM_Thread *ACS_EnvAllocThread(ACSVM_Environment *env) +{ + ACSVM_ThreadFuncs funcs = {0}; + + funcs.dtor = ACS_ThrDestruct; + funcs.start = ACS_ThrStart; + + return ACSVM_AllocThread(env, &funcs, NULL); +} + /*-------------------------------------------------- void ACS_Init(void) @@ -421,6 +506,7 @@ void ACS_Init(void) funcs.ctor = ACS_EnvConstruct; funcs.loadModule = ACS_EnvLoadModule; funcs.checkTag = ACS_EnvCheckTag; + funcs.allocThread = ACS_EnvAllocThread; ACSenv = ACSVM_AllocEnvironment(&funcs, NULL); @@ -520,7 +606,7 @@ void ACS_LoadLevelScripts(size_t mapID) // Start up new map scope. ACS_ResetMap(hub); - map = ACSVM_HubScope_GetMapScope(hub, 0); + map = ACSVM_HubScope_GetMapScope(hub, 0); // This is where you'd put in mapID if you add hub support. ACSVM_MapScope_SetActive(map, true); // Allocate module list. @@ -552,9 +638,70 @@ void ACS_LoadLevelScripts(size_t mapID) // Register the modules with map scope. ACSVM_MapScope_AddModules(map, modules, modules_len); } +} + +/*-------------------------------------------------- + void ACS_RunPlayerEnterScript(player_t *player) + + See header file for description. +--------------------------------------------------*/ +void ACS_RunPlayerEnterScript(player_t *player) +{ + ACSVM_GlobalScope *global = NULL; + ACSVM_HubScope *hub = NULL; + ACSVM_MapScope *map = NULL; + + acs_threadinfo_t *activator = NULL; + + global = ACSVM_Environment_GetGlobalScope(ACSenv, 0); + hub = ACSVM_GlobalScope_GetHubScope(global, 0); + map = ACSVM_HubScope_GetMapScope(hub, 0); + + activator = Z_Calloc(sizeof(acs_threadinfo_t), PU_STATIC, NULL); + + P_SetTarget(&activator->mo, player->mo); + + ACSVM_MapScope_ScriptStartTypeForced(map, ACS_ST_ENTER, NULL, 0, ACSVM_AllocThreadInfo(activator), NULL); +} + +/*-------------------------------------------------- + void ACS_RunLevelStartScripts(void) + + See header file for description. +--------------------------------------------------*/ +void ACS_RunLevelStartScripts(void) +{ + ACSVM_GlobalScope *global = NULL; + ACSVM_HubScope *hub = NULL; + ACSVM_MapScope *map = NULL; + + UINT8 i; + + global = ACSVM_Environment_GetGlobalScope(ACSenv, 0); + hub = ACSVM_GlobalScope_GetHubScope(global, 0); + map = ACSVM_HubScope_GetMapScope(hub, 0); // Start OPEN scripts. - ACSVM_MapScope_ScriptStartType(map, 1, NULL, 0, NULL, NULL); + ACSVM_MapScope_ScriptStartType(map, ACS_ST_OPEN, NULL, 0, NULL, NULL); + + // Start ENTER scripts. + for (i = 0; i < MAXPLAYERS; i++) + { + player_t *player = NULL; + + if (playeringame[i] == false) + { + continue; + } + + player = &players[i]; + if (player->spectator == true) + { + continue; + } + + ACS_RunPlayerEnterScript(player); + } } /*-------------------------------------------------- diff --git a/src/k_acs.h b/src/k_acs.h index 1e88d9fb1..3cd187028 100644 --- a/src/k_acs.h +++ b/src/k_acs.h @@ -16,6 +16,10 @@ #include "doomtype.h" #include "doomdef.h" +#include "p_mobj.h" +#include "r_defs.h" +#include "p_polyobj.h" +#include "d_player.h" #include "CAPI/BinaryIO.h" #include "CAPI/Environment.h" @@ -25,6 +29,9 @@ #include "CAPI/String.h" #include "CAPI/Thread.h" +// +// Special global script types. +// typedef enum { ACS_ST_OPEN = 1, // OPEN: Runs once when the level starts. @@ -33,12 +40,27 @@ typedef enum ACS_ST_ENTER = 4, // ENTER: Runs when a player enters the game; both on start of the level, and when un-spectating. } acs_scriptType_e; +// +// Script "waiting on tag" types. +// typedef enum { ACS_TAGTYPE_POLYOBJ, ACS_TAGTYPE_SECTOR, } acs_tagType_e; +// +// Thread activator info +// +typedef struct +{ + mobj_t *mo; // Object that activated this thread. + line_t *line; // Linedef that activated this thread. + UINT8 side; // Front / back side of said linedef. + sector_t *sector; // Sector that activated this thread. + polyobj_t *po; // Polyobject that activated this thread. +} acs_threadinfo_t; + /*-------------------------------------------------- ACSVM_Environment *ACS_GetEnvironment(void); @@ -96,6 +118,33 @@ void ACS_Shutdown(void); void ACS_LoadLevelScripts(size_t mapID); +/*-------------------------------------------------- + void ACS_RunPlayerEnterScript(player_t *player); + + Runs the map's special script for a player + entering the game. + + Input Arguments:- + player: The player to run the script for. + + Return:- + None +--------------------------------------------------*/ + +void ACS_RunPlayerEnterScript(player_t *player); + + +/*-------------------------------------------------- + void ACS_RunLevelStartScripts(void); + + Runs the map's special scripts for opening + the level, and for all players to enter + the game. +--------------------------------------------------*/ + +void ACS_RunLevelStartScripts(void); + + /*-------------------------------------------------- void ACS_Tick(void); @@ -105,6 +154,7 @@ void ACS_LoadLevelScripts(size_t mapID); void ACS_Tick(void); + /*-------------------------------------------------- bool ACS_CF_???(ACSVM_Thread *thread, ACSVM_Word const *argV, ACSVM_Word argC); @@ -132,11 +182,14 @@ bool ACS_CF_TagWait(ACSVM_Thread *thread, ACSVM_Word const *argV, ACSVM_Word arg bool ACS_CF_PolyWait(ACSVM_Thread *thread, ACSVM_Word const *argV, ACSVM_Word argC); bool ACS_CF_ChangeFloor(ACSVM_Thread *thread, ACSVM_Word const *argV, ACSVM_Word argC); bool ACS_CF_ChangeCeiling(ACSVM_Thread *thread, ACSVM_Word const *argV, ACSVM_Word argC); +bool ACS_CF_LineSide(ACSVM_Thread *thread, ACSVM_Word const *argV, ACSVM_Word argC); bool ACS_CF_EndPrint(ACSVM_Thread *thread, ACSVM_Word const *argV, ACSVM_Word argC); bool ACS_CF_PlayerCount(ACSVM_Thread *thread, ACSVM_Word const *argV, ACSVM_Word argC); bool ACS_CF_GameType(ACSVM_Thread *thread, ACSVM_Word const *argV, ACSVM_Word argC); bool ACS_CF_GameSpeed(ACSVM_Thread *thread, ACSVM_Word const *argV, ACSVM_Word argC); bool ACS_CF_Timer(ACSVM_Thread *thread, ACSVM_Word const *argV, ACSVM_Word argC); +bool ACS_CF_EndPrintBold(ACSVM_Thread *thread, ACSVM_Word const *argV, ACSVM_Word argC); +bool ACS_CF_EndLog(ACSVM_Thread *thread, ACSVM_Word const *argV, ACSVM_Word argC); #endif // __K_ACS__ diff --git a/src/p_setup.c b/src/p_setup.c index 0d67b3753..192a82448 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -4333,12 +4333,17 @@ boolean P_LoadLevel(boolean fromnetsave, boolean reloadinggamestate) if (!fromnetsave) // uglier hack { // to make a newly loaded level start on the second frame. INT32 buf = gametic % BACKUPTICS; + for (i = 0; i < MAXPLAYERS; i++) { if (playeringame[i]) G_CopyTiccmd(&players[i].cmd, &netcmds[buf][i], 1); } + P_PreTicker(2); + + ACS_RunLevelStartScripts(); + P_MapStart(); // just in case MapLoad modifies tmthing LUA_HookInt(gamemap, HOOK(MapLoad)); P_MapEnd(); // just in case MapLoad modifies tmthing