package Ġworld . greg s . void ps . engine . entity Ċ Ċ import Ġkotlinx . coroutines . Job Ċ import Ġworld . greg s . void ps . engine . Game Loop Ċ import Ġworld . greg s . void ps . engine . delay Ċ import Ġworld . greg s . void ps . engine . event . Event Ċ Ċ data Ġclass ĠEffect Start ( val Ġeffect : ĠString , Ġval Ġticks : ĠInt Ġ= Ġ- 1 , Ġval Ġrestart : ĠBoolean Ġ= Ġfalse ) Ġ: ĠEvent Ċ data Ġclass ĠEffect Stop ( val Ġeffect : ĠString ) Ġ: ĠEvent Ċ Ċ /** Ċ Ġ* ĠStarts Ġan Ġeffect Ċ Ġ* Ġ@ param Ġticks ĠNumber Ġof Ġgame Ġticks Ġto Ġlast Ġbefore Ġthe Ġeffect Ġis Ġremoved Ċ Ġ* Ġ@ param Ġpersist Ġwhether Ġthe Ġeffect Ġshould Ġbe Ġsaved Ġafter Ġlogout Ċ Ġ* Ġ@ param Ġquiet Ġwhether Ġ[ Effect Start ] Ġ& Ġ[ Effect Stop ] Ġevents Ġshould Ġbe Ġemitted Ċ Ġ* Ġ@ param Ġrestart Ġ[ Effect Start ] Ġvalue Ġto Ġidentify Ġwhether Ġan Ġeffect Ġshould Ġbe Ġre - applied Ċ Ġ*/ Ċ fun ĠEntity . start ( effect : ĠString , Ġticks : ĠInt Ġ= Ġ- 1 , Ġpersist : ĠBoolean Ġ= Ġfalse , Ġquiet : ĠBoolean Ġ= Ġfalse , Ġrestart : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠ Ġval Ġhad Ġ= Ġhas Effect ( effect ) ĊĠĠĠ Ġif Ġ( had ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstop ( effect , Ġquiet ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġstart Effect ( effect , Ġticks , Ġpersist , Ġhad Ġ&& Ġquiet , Ġrestart ) Ċ } Ċ Ċ private Ġfun ĠEntity . start Effect ( effect : ĠString , Ġticks : ĠInt , Ġpersist : ĠBoolean , Ġquiet : ĠBoolean , Ġrestart : ĠBoolean ) Ġ{ ĊĠĠĠ Ġthis [" ${ effect }_ effect ", Ġpersist ] Ġ= Ġticks ĊĠĠĠ Ġif Ġ( ticks Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis [" ${ effect }_ tick "] Ġ= ĠGame Loop . tick Ġ+ Ġticks ĊĠĠĠĠĠĠĠ Ġthis [" ${ effect }_ job "] Ġ= Ġdelay ( this , Ġticks ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop ( effect ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ(! quiet ) Ġ{ ĊĠĠĠĠĠĠĠ Ġevents . emit ( Effect Start ( effect , Ġticks , Ġrestart )) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠEntity . stop ( effect : ĠString , Ġquiet : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠ Ġval Ġstopped Ġ= Ġclear ("${ effect }_ effect ") ĊĠĠĠ Ġclear ("${ effect }_ tick ") ĊĠĠĠ Ġremove < Job >(" ${ effect }_ job ") ?. cancel () ĊĠĠĠ Ġif Ġ( stopped Ġ&& Ġ! quiet ) Ġ{ ĊĠĠĠĠĠĠĠ Ġevents . emit ( Effect Stop ( effect )) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠEntity . stop All Effects ( quiet : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠ Ġvalues . keys (). filter Ġ{ Ġit . endsWith ("_ effect ") Ġ}. forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġstop ( it . remove Suffix ("_ effect "), Ġquiet ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠEntity . has Effect ( effect : ĠString ): ĠBoolean Ġ= Ġcontains ("${ effect }_ effect ") Ċ Ċ fun ĠEntity . has Or Start ( effect : ĠString , Ġticks : ĠInt Ġ= Ġ- 1 , Ġpersist : ĠBoolean Ġ= Ġtrue ): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ( has Effect ( effect )) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĠĠĠ Ġstart ( effect , Ġticks , Ġpersist ) ĊĠĠĠ Ġreturn Ġfalse Ċ } Ċ Ċ fun ĠEntity . remaining ( effect : ĠString ): ĠLong Ġ{ ĊĠĠĠ Ġval Ġexpected : ĠLong Ġ= Ġget OrNull ("${ effect }_ tick ") Ġ?: Ġreturn Ġ- 1 ĊĠĠĠ Ġreturn Ġexpected Ġ- ĠGame Loop . tick Ċ } Ċ Ċ fun ĠEntity . elapsed ( effect : ĠString ): ĠLong Ġ{ ĊĠĠĠ Ġval Ġremaining Ġ= Ġremaining ( effect ) ĊĠĠĠ Ġif Ġ( remaining Ġ== Ġ- 1 L ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ- 1 ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġtotal : ĠInt Ġ= Ġget OrNull ("${ effect }_ effect ") Ġ?: Ġreturn Ġ- 1 ĊĠĠĠ Ġreturn Ġtotal Ġ- Ġremaining Ċ } Ċ Ċ fun ĠEntity . save ( effect : ĠString ) Ġ{ ĊĠĠĠ Ġthis [ effect ] Ġ= Ġremaining ( effect ) Ċ } Ċ Ċ fun ĠEntity . restart ( effect : ĠString ) Ġ{ ĊĠĠĠ Ġval Ġticks : ĠInt Ġ= Ġget OrNull ("${ effect }_ effect ") Ġ?: Ġreturn ĊĠĠĠ Ġstart Effect ( effect , Ġticks , Ġpersist Ġ= Ġtrue , Ġquiet Ġ= Ġfalse , Ġrestart Ġ= Ġtrue ) Ċ } Ċ Ċ fun ĠEntity . toggle ( effect : ĠString , Ġpersist : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠ Ġif Ġ( has Effect ( effect )) Ġ{ ĊĠĠĠĠĠĠĠ Ġstop ( effect ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġstart ( effect , Ġpersist Ġ= Ġpersist ) ĊĠĠĠ Ġ} Ċ }