package Ġcom . phoenix pen . game . console Ċ Ċ import Ġcom . phoenix pen . game . ascii .* Ċ import Ġcom . phoenix pen . game . core . Observer Ċ import Ġcom . phoenix pen . game . core . Tick Counter Ċ import Ġcom . phoenix pen . game . events . Event Message Ċ import Ġcom . phoenix pen . game . events . Global Events Ċ import Ġcom . phoenix pen . game . graphics . Color Ċ import Ġcom . phoenix pen . game . graphics . Surface Ċ import Ġcom . phoenix pen . game . graphics . putString Ċ import Ġcom . phoenix pen . game . input . Enum Event Ċ import Ġcom . phoenix pen . game . input . Input Provider Ċ import Ġcom . phoenix pen . game . logging . Global Logger Ċ import Ġcom . phoenix pen . game . logging . Log Message Ċ import Ġjava . util .* Ċ import Ġkotlin . math . min Ċ Ċ /** Ċ Ġ* ĠEnumeration Ġdescribing Ġthe Ġcurrent Ġstate Ġof Ġa Ġconsole Ġcomponent Ċ Ġ*/ Ċ enum Ġclass ĠConsole State Ċ { ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConsole Ġwidget Ġis Ġhidden ĊĠĠĠĠ Ġ*/ ĊĠĠĠ ĠHidden , ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConsole Ġwidget Ġjust Ġshows Ġlog Ġmessages , Ġbut Ġdoes Ġnot Ġgrab Ġinput Ġ( other Ġthan Ġthe Ġmode Ġswitch Ġkey ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ ĠLog , ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConsole Ġwidget Ġis Ġshown Ġand Ġis Ġfully Ġinteractive , Ġwith Ġa Ġcommand Ġprompt . ĠAll Ġinput Ġis Ġgrab bed . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ ĠInteractive Ċ } Ċ Ċ /** Ċ Ġ* ĠEnumeration Ġdetail ing Ġin Ġwhich Ġheight Ġmode Ġthe Ġconsole Ġwidget Ġcurrently Ġis Ċ Ġ*/ Ċ enum Ġclass ĠConsole Height Mode Ċ { ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠJust Ġshow Ġa Ġfew Ġlines ĊĠĠĠĠ Ġ*/ ĊĠĠĠ ĠComp act , ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠShow Ġmore Ġlines ĊĠĠĠĠ Ġ*/ ĊĠĠĠ ĠFull Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġscene Ġcomponent Ġthat Ġcan Ġbe Ġused Ġto Ġshow Ġlog Ġand Ġevent Ġmessages Ġand Ġinteract Ġwith Ġthe Ġgame Ġusing Ċ Ġ* Ġtext ual Ġcommands Ċ Ġ*/ Ċ class ĠConsole ( val Ġinput : ĠInput Provider ): ĠScene Component Ċ { ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTick Ġcounter Ġused Ġto Ġblink Ġthe Ġprompt Ġcursor ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġcursor B linker Ġ= ĠTick Counter ( 1 4 ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWhether Ġto Ġshow Ġthe Ġprompt Ġcursor Ġright Ġnow ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġprompt Show Cursor Ġ= Ġtrue ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġinput Ġadapter Ġthat Ġis Ġused Ġwhen Ġin Ġinteractive Ġmode ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġadapter Ġ= ĠConsole Input Adapter ( input ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBuffer Ġholding Ġlog Ġand Ġevent Ġmessages . ĠNew Ġmessages Ġare Ġare Ġattached Ġto Ġthe Ġfront . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġbuffer Ġ= ĠLinkedList < Buffer Entry >() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġmaximum Ġbuffer Ġsize . ĠIf Ġthe Ġbuffer Ġexceeds Ġthis Ġvalue , Ġold Ġentries Ġwill Ġbe Ġdiscarded . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġmax BufferSize Ġ= Ġ 2 5 6 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWhether Ġto Ġshow Ġlog Ġmessages Ġin Ġconsole ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġshow Log Messages : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWhether Ġto Ġshow Ġevent Ġmessages Ġin Ġconsole ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġshow Event Messages Ġ: ĠBoolean Ġ= Ġtrue ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġcurrent Ġconsole Ġstate ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġcurrent State Ġ= ĠConsole State . Hidden ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġcurrent Ġheight Ġmode Ġof Ġthe Ġconsole ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġheight Mode Ġ= ĠConsole Height Mode . Compact ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHeight Ġin Ġcompact Ġmode ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġheight Compact Ġ= Ġ 5 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHeight Ġin Ġfull Ġmode ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġheight Full Ġ= Ġ 1 5 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġcurrent Ġinput Ġbuffer ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġinput Buffer : ĠString Ġ= Ġ"" ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠColor Ġused Ġfor Ġold , Ġand Ġthus Ġgrey ed Ġout , Ġbuffer Ġentries ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval ĠtextColor Ġ= ĠColor ( 1 5 6 , Ġ 1 5 6 , Ġ 1 5 6 ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreate Ġob servers ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinit ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ ĠGlobal Logger . instance (). subscribe ( object Ġ: ĠObserver < Log Message > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnotify ( value : ĠLog Message ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( show Log Messages ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Buffer Entry ( Buffer Entry . from Log Message ( value )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ ĠGlobal Events . subscribe ( object Ġ: ĠObserver < Event Message > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnotify ( value : ĠEvent Message ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( show Event Messages ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Buffer Entry ( Buffer Entry . from Event ( value )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ ĠGlobal Events . post Event (" Console ", Ġ" me ow ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdd Ġgiven Ġbuffer Ġentry Ġto Ġthe Ġconsole Ġbuffer ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġentry ĠEntry Ġto Ġadd Ġto Ġbuffer ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġadd Buffer Entry ( entry : ĠBuffer Entry ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġif Ġthe Ġmessage Ġis Ġsimilar Ġto Ġthe Ġlast Ġone ĊĠĠĠĠĠĠĠ Ġif ( this . buffer . size Ġ> Ġ 0 Ġ&& Ġthis . buffer . first . is Similar ( entry )) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠJust Ġincrement Ġthe Ġrepeat Ġcounter Ġand Ġreset Ġage ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Ġ= Ġthis . buffer . first ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ++ entry . repeat ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentry . age Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . buffer . add First ( entry ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this . buffer . size Ġ> Ġthis . max BufferSize ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . buffer . remove Last () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCheck Ġwhether Ġthis Ġcomponent Ġcurrently Ġgr abs Ġfull Ġinput ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġgr abs Input () Ġ= Ġthis . currentState Ġ== ĠConsole State . Interactive ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPerform Ġinternal Ġlogic Ġupdate Ġbased Ġon Ġgiven Ġnumber Ġof Ġelapsed Ġticks ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġelapsed Ticks ĠNumber Ġof Ġelapsed Ġticks Ġsince Ġlast Ġupdate ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġupdate ( elapsed Ticks : ĠInt ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġneed Ġto Ġupdate Ġthe Ġage Ġof Ġbuffer Ġentries , Ġbut Ġonly Ġup Ġuntil Ġthe Ġpoint Ġwe Ġfind Ġan Ġentry ĊĠĠĠĠĠĠĠ Ġ// Ġthat Ġis Ġalready Ġconsidered Ġto Ġbe Ġold . ĊĠĠĠĠĠĠĠ Ġfor ( entry Ġin Ġthis . buffer ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( entry . is Old ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġentry . age Ġ+= Ġelapsed Ticks ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhen ( this . currentState ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠConsole State . Interactive Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . handle Input () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠHandle Ġcursor Ġblink ing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . blink Cursor ( elapsed Ticks ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDraw Ġconsole Ġto Ġscreen ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġsurface ĠThe Ġsurface Ġto Ġdraw Ġto ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġrender ( surface : ĠSurface ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen ( this . currentState ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠConsole State . Hidden Ġ-> Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ ĠConsole State . Log Ġ-> Ġthis . draw Messages ( surface ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠConsole State . Interactive Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . draw Messages ( surface ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . draw Prompt ( surface ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPerform Ġcursor Ġblink ing ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġblink Cursor ( elapsed Ticks : ĠInt ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( this . cursor B linker . update ( elapsed Ticks ) Ġ> Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . prompt Show Cursor Ġ= Ġ! this . prompt Show Cursor ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDraw Ġinteractive Ġmode Ġprompt ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġdraw Prompt ( surface : ĠSurface ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠDetermine Ġy Ġpos Ġof Ġprompt ĊĠĠĠĠĠĠĠ Ġvar Ġy Pos Ġ= Ġif Ġ( this . height Mode Ġ== ĠConsole Height Mode . Full ) Ġthis . height Full Ġelse Ġthis . height Compact ĊĊĠĠĠĠĠĠĠ Ġ// ĠDraw Ġstatic Ġprompt ĊĠĠĠĠĠĠĠ Ġsurface . putString ( Position ( 0 , Ġy Pos ), Ġ"> ", Ġfront Ġ= Ġthis . textColor ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠDraw Ġuser Ġinput ĊĠĠĠĠĠĠĠ Ġval Ġmax Input Len Ġ= Ġsurface . dimensions In Glyph s . width Ġ- Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġval Ġdisplay String Ġ= Ġthis . input Buffer . substring ( 0 , Ġmin ( max Input Len , Ġthis . input Buffer . length )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. pad End ( max Input Len ) ĊĊĠĠĠĠĠĠĠ Ġsurface . putString ( Position ( 1 , Ġy Pos ), Ġdisplay String , Ġfront Ġ= Ġthis . textColor ) ĊĊĊĠĠĠĠĠĠĠ Ġ// ĠDraw Ġcursor ĊĠĠĠĠĠĠĠ Ġif ( this . input Buffer . length Ġ< Ġmax Input Len ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Pos Ġ= Ġ 1 Ġ+ Ġthis . input Buffer . length ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolor Ġ= Ġif Ġ( this . prompt Show Cursor ) Ġthis . textColor Ġelse ĠColor . black ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsurface . putString ( Position ( x Pos , Ġy Pos ), Ġ"_ ", Ġfront Ġ= Ġcolor ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHandle Ġinput Ġin Ġinteractive Ġmode ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġhandle Input () ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . adapter . update () ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġfind Ġway Ġto Ġfix Ġthis Ġwithout Ġthis Ġhack ĊĠĠĠĠĠĠĠ Ġvar Ġwas Special Key Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġif ( this . adapter . has Events ()) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCons ume Ġall Ġevents ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevents Ġ= Ġthis . adapter . consume Events () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( event Ġin Ġevents ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( event Ġis ĠEnum Event <* >) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ(( event Ġas ĠEnum Event < Console Input >). value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConsole Input . Close Console Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . currentState Ġ= ĠConsole State . Hidden ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConsole Input . Toggle State Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . toggle State () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( this . currentState Ġ!= ĠConsole State . Interactive ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConsole Input . Toggle Height Mode Ġ-> Ġthis . toggle Height Mode () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConsole Input . ExecuteCommand Ġ-> Ġwas Special Key Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConsole Input . Erase Character Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwas Special Key Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( this . input Buffer . isNotEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . input Buffer Ġ= Ġthis . input Buffer . substring ( 0 , Ġthis . input Buffer . length Ġ- Ġ 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠHandle Ġtext Ġinput . Ġ[ was Back space ] Ġis Ġa Ġhack Ġto Ġavoid Ġthe Ġnumerical Ġcode Ġof Ġspecial Ġkeys Ġto Ġappear ĊĠĠĠĠĠĠĠ Ġif (! was Special Key Ġ&& Ġthis . input . has Text ()) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . input Buffer Ġ+= Ġthis . input . text () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSwitch Ġto Ġnext Ġconsole Ġstate ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġtoggle State () ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . currentState Ġ= Ġwhen ( this . currentState ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠConsole State . Hidden Ġ-> ĠConsole State . Log ĊĠĠĠĠĠĠĠĠĠĠĠ ĠConsole State . Log Ġ-> ĠConsole State . Interactive ĊĠĠĠĠĠĠĠĠĠĠĠ ĠConsole State . Interactive Ġ-> ĠConsole State . Hidden ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠClear Ġinput Ġbuffer Ġif Ġentered Ġinteractive Ġmode ĊĠĠĠĠĠĠĠ Ġif ( this . currentState Ġ== ĠConsole State . Interactive ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . input Buffer Ġ= Ġ"" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSwitch Ġto Ġnext Ġheight Ġmode ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġtoggle Height Mode () ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . height Mode Ġ= Ġwhen ( this . height Mode ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠConsole Height Mode . Full Ġ-> ĠConsole Height Mode . Compact ĊĠĠĠĠĠĠĠĠĠĠĠ ĠConsole Height Mode . Compact Ġ-> ĠConsole Height Mode . Full ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDraw Ġas Ġmany Ġmessages Ġas Ġpossible ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġdraw Messages ( surface : ĠSurface ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠCalculate Ġhow Ġmany Ġmessages Ġwe Ġcan Ġfit ĊĠĠĠĠĠĠĠ Ġval Ġnum Messages Ġ= Ġif Ġ( this . height Mode Ġ== ĠConsole Height Mode . Full ) Ġthis . height Full Ġelse Ġthis . height Compact ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhere Ġto Ġstart Ġdrawing Ġmessages , Ġfrom Ġbottom Ġto Ġtop ĊĠĠĠĠĠĠĠ Ġvar ĠstartIndex Ġ= Ġnum Messages Ġ- Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhere Ġwe Ġneed Ġto Ġstart Ġblank ing Ġ( if Ġnot Ġenough Ġlog Ġmessages Ġare Ġavailable ) ĊĠĠĠĠĠĠĠ Ġvar Ġblank StartIndex Ġ= Ġnum Messages ĊĊĠĠĠĠĠĠĠ Ġ// ĠDo Ġwe Ġhave Ġenough Ġmessages ? ĊĠĠĠĠĠĠĠ Ġif ( this . buffer . size Ġ< Ġnum Messages ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDetermine Ġdifference ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdiff Ġ= Ġnum Messages Ġ- Ġthis . buffer . size ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdjust Ġindex ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartIndex Ġ-= Ġdiff ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġblank StartIndex Ġ= ĠstartIndex Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= ĠstartIndex ĊĠĠĠĠĠĠĠ Ġfor ( entry Ġin Ġthis . buffer ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentry . render ( surface , ĠPosition ( 0 , Ġi ), Ġsurface . dimensions In Glyph s . width ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġi -- ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( i Ġ< Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor ( i Ġin Ġblank StartIndex Ġuntil Ġnum Messages ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsurface . putString ( Position ( 0 , Ġi ), Ġ"". pad End ( surface . dimensions In Glyph s . width )) ĊĊĠĠĠĠĠĠĠ Ġthis . draw Divider ( surface ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDraw Ġthe Ġdivider Ġthat Ġis Ġlocated Ġat Ġthe Ġbottom Ġof Ġthe Ġconsole ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġdraw Divider ( surface : ĠSurface ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġy Pos Ġ= Ġif Ġ( this . height Mode Ġ== ĠConsole Height Mode . Full ) Ġthis . height Full Ġelse Ġthis . height Compact ĊĊĠĠĠĠĠĠĠ Ġ// ĠIn Ġinteractive Ġmode , Ġthe Ġcommand Ġprompt Ġmoves Ġthe Ġdivider Ġone Ġglyph Ġfurther Ġdown ĊĠĠĠĠĠĠĠ Ġif ( this . currentState Ġ== ĠConsole State . Interactive ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ++ y Pos ĊĊĠĠĠĠĠĠĠ Ġsurface . putString ( Position ( 0 , Ġy Pos ), Ġ"\ u 0 0 C 4 ". repeat ( surface . dimensions In Glyph s . width ), Ġfront Ġ= Ġthis . textColor ) ĊĠĠĠ Ġ} Ċ }