package Ġrs . d us k . engine . entity . character . player . skill Ċ Ċ import Ġkotlin . math . floor Ċ import Ġkotlin . math . max Ċ import Ġkotlin . math . min Ċ import Ġkotlin . math . pow Ċ Ċ class ĠLevel s ( ĊĠĠĠ Ġprivate Ġval Ġexperience : ĠExperience , ĊĠĠĠ Ġprivate Ġval Ġboost s : ĠMutable Map < Skill , ĠInt > Ġ= Ġmutable Map Of () Ċ ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlisteners Ġ= Ġmutable ListOf <( Skill , ĠInt , ĠInt ) Ġ-> ĠUnit >() ĊĠĠĠ Ġprivate Ġval Ġlevel Listeners Ġ= Ġmutable ListOf <( Skill , ĠInt , ĠInt ) Ġ-> ĠUnit >() ĊĊĠĠĠ Ġfun Ġadd Boost Listener ( listener : Ġ( Skill , ĠInt , ĠInt ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlisteners . add ( listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Level Up Listener ( listener : Ġ( Skill , ĠInt , ĠInt ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlevel Listeners . add ( listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġexperience . addListener Ġ{ Ġskill , Ġfrom , Ġto Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprevious Level Ġ= Ġget Level ( from ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Level Ġ= Ġget Level ( to ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Level Ġ> Ġprevious Level ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( listener Ġin Ġlevel Listeners ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . invoke ( skill , Ġprevious Level , Ġcurrent Level ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget ( skill : ĠSkill ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠgetMax ( skill ) Ġ+ Ġget Boost ( skill ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetMax ( skill : ĠSkill ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexp Ġ= Ġexperience . get ( skill ) ĊĠĠĠĠĠĠĠ Ġreturn Ġget Level ( exp ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Boost ( skill : ĠSkill ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġboost s [ skill ] Ġ?: Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Boost ( skill : ĠSkill , Ġlevel : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprevious Ġ= Ġget ( skill ) ĊĠĠĠĠĠĠĠ Ġboost s [ skill ] Ġ= Ġlevel ĊĠĠĠĠĠĠĠ Ġnotify ( skill , Ġprevious ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclear Boost ( skill : ĠSkill ) Ġ{ ĊĠĠĠĠĠĠĠ Ġboost s . remove ( skill ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrestore ( skill : ĠSkill , Ġamount : ĠInt Ġ= Ġ 0 , Ġmultiplier : ĠDouble Ġ= Ġ 0 . 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġmultiply ( getMax ( skill ), Ġmultiplier ) ĊĠĠĠĠĠĠĠ Ġval Ġboost Ġ= Ġcalculate Amount ( amount , Ġoffset ) ĊĠĠĠĠĠĠĠ Ġval Ġminimum Boost Ġ= Ġmin ( 0 , Ġget Boost ( skill )) ĊĠĠĠĠĠĠĠ Ġmodify ( skill , Ġboost , Ġminimum Boost , Ġ 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġboost ( skill : ĠSkill , Ġamount : ĠInt Ġ= Ġ 0 , Ġmultiplier : ĠDouble Ġ= Ġ 0 . 0 , Ġstack : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġmultiply ( minimum Level ( skill ), Ġmultiplier ) ĊĠĠĠĠĠĠĠ Ġval Ġboost Ġ= Ġcalculate Amount ( amount , Ġoffset ) ĊĠĠĠĠĠĠĠ Ġval Ġmaximum Boost Ġ= Ġif Ġ( stack ) Ġmin ( MAXIMUM _ BOOST _ LEVEL , Ġget Boost ( skill ) Ġ+ Ġboost ) Ġelse Ġmax ( get Boost ( skill ), Ġboost ) ĊĠĠĠĠĠĠĠ Ġmodify ( skill , Ġboost , Ġ 0 , Ġmaximum Boost ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdrain ( skill : ĠSkill , Ġamount : ĠInt Ġ= Ġ 0 , Ġmultiplier : ĠDouble Ġ= Ġ 0 . 0 , Ġstack : ĠBoolean Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġmultiply ( maximum Level ( skill ), Ġmultiplier ) ĊĠĠĠĠĠĠĠ Ġval Ġdrain Ġ= Ġcalculate Amount ( amount , Ġoffset ) ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Ġ= Ġget Boost ( skill ) ĊĠĠĠĠĠĠĠ Ġval Ġminimum Dr ain Ġ= Ġif Ġ( stack ) Ġmax (- getMax ( skill ), Ġcurrent Ġ- Ġdrain ) Ġelse Ġmin ( current , Ġ- drain ) ĊĠĠĠĠĠĠĠ Ġmodify ( skill , Ġ- drain , Ġminimum Dr ain , Ġ 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnotify ( skill : ĠSkill , Ġprevious : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlevel Ġ= Ġget ( skill ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( listener Ġin Ġlisteners ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . invoke ( skill , Ġprevious , Ġlevel ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġminimum Level ( skill : ĠSkill ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Level Ġ= Ġget ( skill ) ĊĠĠĠĠĠĠĠ Ġval Ġmax Level Ġ= ĠgetMax ( skill ) ĊĠĠĠĠĠĠĠ Ġreturn Ġmin ( current Level , Ġmax Level ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmaximum Level ( skill : ĠSkill ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Level Ġ= Ġget ( skill ) ĊĠĠĠĠĠĠĠ Ġval Ġmax Level Ġ= ĠgetMax ( skill ) ĊĠĠĠĠĠĠĠ Ġreturn Ġmax ( current Level , Ġmax Level ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmodify ( skill : ĠSkill , Ġamount : ĠInt , Ġmin : ĠInt , Ġmax : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Ġ= Ġget Boost ( skill ) ĊĠĠĠĠĠĠĠ Ġval Ġcombined Ġ= Ġcurrent Ġ+ Ġamount ĊĠĠĠĠĠĠĠ Ġset Boost ( skill , Ġcombined . coerce In ( min , Ġmax )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmultiply ( level : ĠInt , Ġmultiplier : ĠDouble ) Ġ= Ġif Ġ( multiplier Ġ> Ġ 0 . 0 ) Ġ( level Ġ* Ġmultiplier ). toInt () Ġelse Ġ 0 ĊĊĠĠĠ Ġprivate Ġfun Ġcalculate Amount ( amount : ĠInt , Ġoffset : ĠInt ) Ġ= Ġmax ( 0 , Ġamount ) Ġ+ Ġoffset ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget Level ( experience : ĠDouble ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġpoints Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġoutput : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( level Ġin Ġ 1 .. 9 9 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoints Ġ+= Ġfloor ( level Ġ+ Ġ 3 0 0 . 0 Ġ* Ġ 2 . 0 . pow ( level Ġ/ Ġ 7 . 0 )). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Ġ= Ġpoints Ġ/ Ġ 4 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( output Ġ- Ġ 1 Ġ>= Ġexperience ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlevel ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 9 9 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġcreate Levels ( experience : ĠExperience ): ĠInt Array Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSkill . all . map Ġ{ Ġskill Ġ-> Ġget Level ( experience . get ( skill )) Ġ}. to IntArray () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMAX IMUM _ BOOST _ LEVEL Ġ= Ġ 2 4 ĊĠĠĠ Ġ} Ċ } Ċ