diff --git a/Controllers/ConfigAndAssetsController.cs b/Controllers/ConfigAndAssetsController.cs new file mode 100644 index 0000000..ce0e895 --- /dev/null +++ b/Controllers/ConfigAndAssetsController.cs @@ -0,0 +1,109 @@ +using Microsoft.AspNetCore.Mvc; +using System.IO.Compression; +using System.Net; +using System.Reflection.Metadata.Ecma335; +using System.Text; + +namespace NotPogo.Controllers +{ + [Route("/")] + public class ConfigAndAssetsController(ILogger logger) : Controller + { + private readonly ILogger _logger = logger; + + public IActionResult Index() => Ok("Not Pogo Is Running!"); + + // might aswell provide a minimal way to play the games supported + [HttpGet] + [Route("/play-game")] + public IActionResult GetGamePage(string game) + { + var path = Path.Combine(AppContext.BaseDirectory, "StaticFiles", "GameAssets", game, "index.html"); + + _logger.LogInformation("Attempting To Serve Game Applet At {Path}", path); + return new ContentResult + { + Content = System.IO.File.Exists(path) ? System.IO.File.ReadAllText(path) : $"Game Not Found - {game}", + ContentType = "text/html", + StatusCode = (int)HttpStatusCode.OK + }; + } + + [HttpGet] + [Route("/get-jar")] + public IActionResult GetAppletCode(string game) + { + var path = Path.Combine(AppContext.BaseDirectory, "StaticFiles", "JARs", game + "-en_US.jar"); + if (!System.IO.File.Exists(path)) + return NotFound("Applet Not Found"); + else + return File(System.IO.File.ReadAllBytes(path), "application/x-java-archive", fileDownloadName: $"{game}.jar"); + } + + [HttpGet] + [Route("/blank.html")] + public IActionResult GetEmptyPage() => Ok(); + + [HttpGet] + [Route("/client-props.jsp")] + public async Task GetConfigAsync(string game) + { + var path = Path.Combine(AppContext.BaseDirectory, "StaticFiles", "Configs", $"{game}.txt"); + byte[] config = System.IO.File.Exists(path) ? await System.IO.File.ReadAllBytesAsync(path) : Encoding.UTF8.GetBytes($"Configration Missing For {game} :("); + + // client props needs to be gzip compressed for whatever reason (probably to throw off dumpers or something idk) + byte[] compressed; + using (var ms = new MemoryStream()) + { + using (var gzip = new GZipStream(ms, CompressionLevel.Fastest, leaveOpen: true)) + { + await gzip.WriteAsync(config); + } + compressed = ms.ToArray(); + } + + return File(compressed, "text/plain"); + } + + [HttpGet] + [Route("/assets")] + public async Task GetGameAssetAsync(string game, string assetPath) + { + var pathToAsset = Path.Combine(AppContext.BaseDirectory, "StaticFiles", "GameAssets", game, assetPath); + byte[] assetBytes = System.IO.File.Exists(pathToAsset) ? + await System.IO.File.ReadAllBytesAsync(pathToAsset) : + Encoding.UTF8.GetBytes($"Missing Asset File For {game} - {assetPath}"); + + //var contentType = GetContentType(pathToAsset); + //if(contentType == "text/xml") + //{ + // // response needs to be gzipped + // byte[] compressed; + // using (var ms = new MemoryStream()) + // { + // using (var gzip = new GZipStream(ms, CompressionLevel.Fastest, leaveOpen: true)) + // { + // await gzip.WriteAsync(assetBytes); + // } + // compressed = ms.ToArray(); + // } + // _logger.LogInformation("Serving Compressed Game Asset {Game}/{FileName}", game, assetPath); + // return File(compressed, GetContentType(pathToAsset)); + //} + + _logger.LogInformation("Serving Game Asset {Game}/{FileName}", game, assetPath); + return File(assetBytes, GetContentType(pathToAsset)); + } + + private string GetContentType(string assetFileName) => Path.GetExtension(assetFileName).ToLowerInvariant() switch + { + ".gif" => "image/gif", + ".jpg" or ".jpeg" => "image/jpeg", + ".au" => "audio/basic", + ".xml" => "text/xml", + ".dat" => "application/octet-stream", + // ".txt" => "text/plain", + _ => "application/octet-stream" + }; + } +} diff --git a/NotPogo.csproj b/NotPogo.csproj new file mode 100644 index 0000000..3e62923 --- /dev/null +++ b/NotPogo.csproj @@ -0,0 +1,23 @@ + + + + net10.0 + enable + enable + + + + + + + + + + + + + PreserveNewest + + + + diff --git a/NotPogo.slnx b/NotPogo.slnx new file mode 100644 index 0000000..cab92f0 --- /dev/null +++ b/NotPogo.slnx @@ -0,0 +1,3 @@ + + + diff --git a/Program.cs b/Program.cs new file mode 100644 index 0000000..d283bfa --- /dev/null +++ b/Program.cs @@ -0,0 +1,27 @@ +namespace NotPogo +{ + public class Program + { + public static void Main(string[] args) + { + var builder = WebApplication.CreateBuilder(args); + + // Add services to the container. + + builder.Services.AddControllersWithViews(); + + // Add Game Server Hosted Service + builder.Services.AddHostedService(); + + var app = builder.Build(); + + // Configure the HTTP request pipeline. + + app.UseAuthorization(); + + app.MapControllers(); + + app.Run(); + } + } +} diff --git a/Properties/launchSettings.json b/Properties/launchSettings.json new file mode 100644 index 0000000..e74d67c --- /dev/null +++ b/Properties/launchSettings.json @@ -0,0 +1,21 @@ +{ + "profiles": { + "http": { + "commandName": "Project", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "dotnetRunMessages": true, + "applicationUrl": "http://localhost:8080" + }, + "https": { + "commandName": "Project", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "dotnetRunMessages": true, + "applicationUrl": "" + } + }, + "$schema": "https://json.schemastore.org/launchsettings.json" +} \ No newline at end of file diff --git a/StaticFiles/Configs/waterwheel.txt b/StaticFiles/Configs/waterwheel.txt new file mode 100644 index 0000000..99163a2 --- /dev/null +++ b/StaticFiles/Configs/waterwheel.txt @@ -0,0 +1,751 @@ +# ============================================================ +# ORIGINAL GAME CONFIG (from the jar's own applet/waterwheel/config/config.txt) +# ============================================================ + +# number of laps that will use the initial meta card chance table +amt.initial.laps=2 + +# set to true to force a perfect game result every time +flag.force.perfect.game=false + +# score earned for lighting all hearts on lovemeter +tokens.perfect.game=100 + +# set to true to enable the R (reset) hotkey +flag.reset.hotkey.testing=false + +# set to true to enable the W (win) hotkey +flag.win.hotkey.testing=false + +# set to true to enable the N (new game) hotkey +flag.new.game.hotkey.testing=false + +# set to true to enable the H (show history) hotkey +flag.show.history.hotkey.testing=false + +# set to true to display game version in Java Console +show_version=false + +# set to true to increment 1 rank per lap +flag.quick.rank.advance.testing=false + +# set to true to make meta-boat travel very quickly (and extra rings count quickly) +flag.fast.meta.boat=false + +# minimum number of moves taken when W key used (114 will do exactly 1 lap on the board) +amt.fake.win=10 + +tiles.rank.levels=0,1,3,6,10,15,21,28,36,45,55,67,81,97,115,135,157,181,207,235,265,297,331,367,405,410,416,423,431,440,450,461,473,486,500,515,531,549,569,589,611,633,655,679,705,731,759,787,814,847,880 + +#number of hearts lit to start extra scoring sequence +hearts.extra.limit=10 + +#delay between score-N sounds +delay.perfect.sounds=3 + +# set to 0-12 to test metagame cards; -1 to play normally +id.force.meta.card.testing=-1 + +# number of spaces near home port that will only allow good cards +spaces.good.cards.only.range=3 + +flag.frags.allowed.testing=true + +# set to true to show centered area of travel +flag.show.meta.center.testing=trueX + +# set to true to make piles snap into place instead of slide +flag.snap.piles=true + +# set to true to make all draw cards face up +flag.draw.pile.face.up=true + +# set to true to start with full undo rack and perfect match does not add rings +flag.start.full.rack=true + +# set to true for auto play +flag.auto.play.testing=trueX +secs.auto.play.delay=5 + +# set to true for meta-game path testing (auto play must also be true) +flag.auto.quick.meta.testing=true + +percent.chance.meta.cards=10,20,10,10,10,5,5,10,5,10,5 +percent.chance.meta.cards.spooky=0,10,0,10,40,0,0,0,0,0,10,30 +percent.chance.meta.cards.initial=10,40,10,5,5,5,5,5,5,5,5 + +num.pairs.in.boat.max=4 + +# score earned for matching pairs (for example: second number is total score for 2nd pair) +tokens.normal.match=2,4,6,8 + +# score earned for perfect match +tokens.perfect.match=10 + +# score earned for each extra cupid +tokens.extra.cupid=5 + +# set to 100 for fast win - set to 0 for normal win +num.cards.fake.win=0 + +num.initial.freecell.count=1 + +pixels.gap.card.deal=20 + +x.y.locs.meta.map=507,457 458,493 475,519 480,546 472,573 440,591 417,567 402,540 404,512 412,484 415,458 404,432 382,407 348,395 318,415 311,442 310,471 312,499 283,518 249,507 229,482 210,458 186,435 159,417 149,391 186,389 226,392 264,393 299,379 329,366 357,349 376,323 346,306 308,299 279,317 238,323 208,304 224,278 246,258 234,232 256,210 279,189 316,179 351,188 349,217 337,244 359,269 395,262 422,242 457,228 483,209 496,184 464,167 425,167 398,148 409,122 449,119 482,133 523,128 562,133 590,151 632,151 648,172 682,187 719,191 749,207 746,236 714,245 674,236 640,227 606,217 566,219 541,240 552,265 585,254 619,265 626,291 662,290 691,309 727,308 752,288 792,290 812,312 805,338 841,351 848,378 835,403 798,396 769,377 740,356 699,359 681,383 656,404 689,420 728,420 767,432 775,458 768,486 748,507 718,524 683,520 660,501 621,488 599,513 601,541 624,564 618,592 593,614 550,613 530,590 529,562 532,533 552,512 565,486 +flags.meta.ports= 1 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 3 0 0 0 4 0 0 0 0 5 0 0 0 0 6 0 0 0 0 0 0 0 7 0 0 0 0 0 0 0 8 0 0 0 9 0 0 0 0 10 0 0 0 0 11 0 0 0 0 12 0 0 0 0 0 13 0 0 0 14 0 0 0 15 0 0 0 0 0 16 0 0 0 0 0 17 0 0 0 0 0 0 0 0 0 0 0 0 18 0 0 0 19 0 0 0 0 +flags.meta.palms= 7 7 7 0 0 16 16 16 16 18 18 18 0 0 0 18 18 18 12 12 12 12 12 12 14 14 14 14 0 0 8 8 8 0 0 0 0 13 13 13 13 -1 -1 -1 -1 -1 9 9 9 9 5 5 5 0 0 4 4 4 0 0 6 6 6 0 0 3 3 3 5 5 5 5 7 7 7 10 10 10 0 2 2 2 0 0 1 1 1 1 0 0 0 11 11 11 0 0 -2 -2 -2 -2 -2 -2 0 0 15 15 15 17 17 17 17 0 7 7 + +num.stacks=9 + +type.ports=6,15,17,11,13, 7,12, 8, 4, 3, 5, 2, 6, 9, 1, 0,10,14,16 +type.docks=3, 0, 3, 3, 2, 0, 2, 0, 4, 3, 2, 1, 3, 0, 1, 1, 2, 1, 0 + +x.y.locs.deal.stack.port.0=106,147 122,147 138,147 154,147 170,147 186,147 202,147 +x.y.locs.deal.stack.port.1=408,147 392,147 376,147 360,147 344,147 328,147 312,147 +x.y.locs.deal.stack.port.2=122,220 138,220 154,220 170,220 186,220 202,220 +x.y.locs.deal.stack.port.3=392,220 376,220 360,220 344,220 328,220 312,220 +x.y.locs.deal.stack.port.4=138,293 154,293 170,293 186,293 202,293 +x.y.locs.deal.stack.port.5=376,293 360,293 344,293 328,293 312,293 +x.y.locs.deal.stack.port.6=154,366 170,366 186,366 202,366 +x.y.locs.deal.stack.port.7=360,366 344,366 328,366 312,366 +x.y.locs.deal.stack.port.8=54,442 68,442 82,442 96,442 110,442 124,442 138,442 152,442 166,442 194,442 + +x.y.locs.deal.stack.sea.0=90,147 106,147 122,147 138,147 154,147 170,147 186,147 202,147 +x.y.locs.deal.stack.sea.1=424,147 408,147 392,147 376,147 360,147 344,147 328,147 312,147 +x.y.locs.deal.stack.sea.2=106,220 122,220 138,220 154,220 170,220 186,220 202,220 +x.y.locs.deal.stack.sea.3=408,220 392,220 376,220 360,220 344,220 328,220 312,220 +x.y.locs.deal.stack.sea.4=122,293 138,293 154,293 170,293 186,293 202,293 +x.y.locs.deal.stack.sea.5=392,293 376,293 360,293 344,293 328,293 312,293 +x.y.locs.deal.stack.sea.6=122,366 138,366 154,366 170,366 186,366 202,366 +x.y.locs.deal.stack.sea.7=392,366 376,366 360,366 344,366 328,366 312,366 +x.y.locs.deal.stack.sea.8= + +x.y.locs.deal.stack.miss.0=90,147 106,147 122,147 138,147 154,147 170,147 186,147 202,147 +x.y.locs.deal.stack.miss.1=424,147 408,147 392,147 376,147 360,147 344,147 328,147 312,147 +x.y.locs.deal.stack.miss.2=106,220 122,220 138,220 154,220 170,220 186,220 202,220 +x.y.locs.deal.stack.miss.3=408,220 392,220 376,220 360,220 344,220 328,220 312,220 +x.y.locs.deal.stack.miss.4=122,293 138,293 154,293 170,293 186,293 202,293 +x.y.locs.deal.stack.miss.5=392,293 376,293 360,293 344,293 328,293 312,293 +x.y.locs.deal.stack.miss.6=138,366 154,366 170,366 186,366 202,366 +x.y.locs.deal.stack.miss.7=376,366 360,366 344,366 328,366 312,366 +x.y.locs.deal.stack.miss.8= + +# disables save game +flag.allow.save.testing=true + +# set to true to shuffle tiles +flag.shuffle.testing=true + +type.jackpot.normal=default + +delay.secs.title.screen=1 + +# ============================================================ +# GAME PANEL POSITIONING (aq() -- .rect suffix is auto-appended +# by w.c(), so these must be written with .rect explicitly) +# ============================================================ +game.rect=0,0,564,506 +game.sngl.rect=0,0,564,506 + +# ============================================================ +# BASE SHEET IMAGE NAME -> PATH (bare keys; legacy from the +# standalone-launcher days, harmless to keep, some code paths +# may still consult them via Y()) +# ============================================================ +anchor=assets?game=waterwheel&assetPath=images/anchor.gif +anchorchain=assets?game=waterwheel&assetPath=images/anchorchain.gif +anchormask=assets?game=waterwheel&assetPath=images/anchormask.gif +anchoroverlay=assets?game=waterwheel&assetPath=images/anchoroverlay.jpg +bg=assets?game=waterwheel&assetPath=images/bg.jpg +bgmeta=assets?game=waterwheel&assetPath=images/bgmeta.jpg +bgparts=assets?game=waterwheel&assetPath=images/bgparts.jpg +blueglows=assets?game=waterwheel&assetPath=images/blueglows.gif +boat=assets?game=waterwheel&assetPath=images/boat.gif +bottomglows=assets?game=waterwheel&assetPath=images/bottomglows.jpg +bowglow=assets?game=waterwheel&assetPath=images/bowglow.jpg +button_extra=assets?game=waterwheel&assetPath=images/button_extra.jpg +button_undo=assets?game=waterwheel&assetPath=images/button_undo.jpg +buttons=assets?game=waterwheel&assetPath=images/buttons.gif +cake=assets?game=waterwheel&assetPath=images/cake.gif +cakeglows=assets?game=waterwheel&assetPath=images/cakeglows.jpg +cameraflash=assets?game=waterwheel&assetPath=images/cameraflash.gif +card_blanks=assets?game=waterwheel&assetPath=images/card_blanks.gif +card_blanksfade=assets?game=waterwheel&assetPath=images/card_blanksfade.gif +cardflip=assets?game=waterwheel&assetPath=images/cardflip.gif +characters=assets?game=waterwheel&assetPath=images/characters.gif +characters2=assets?game=waterwheel&assetPath=images/characters2.gif +characters2fade=assets?game=waterwheel&assetPath=images/characters2fade.gif +charactersfade=assets?game=waterwheel&assetPath=images/charactersfade.gif +docks=assets?game=waterwheel&assetPath=images/docks.gif +door_open=assets?game=waterwheel&assetPath=images/door_open.jpg +floaty=assets?game=waterwheel&assetPath=images/floaty.gif +greenglow=assets?game=waterwheel&assetPath=images/greenglow.gif +hands=assets?game=waterwheel&assetPath=images/hands.gif +hatch=assets?game=waterwheel&assetPath=images/hatch.jpg +headings=assets?game=waterwheel&assetPath=images/headings.gif +heartfrag=assets?game=waterwheel&assetPath=images/heartfrag.gif +heartglows=assets?game=waterwheel&assetPath=images/heartglows.gif +hearts=assets?game=waterwheel&assetPath=images/hearts.gif +holder=assets?game=waterwheel&assetPath=images/holder.gif +hrings=assets?game=waterwheel&assetPath=images/hrings.gif +iris=assets?game=waterwheel&assetPath=images/iris.gif +king0=assets?game=waterwheel&assetPath=images/king0.gif +king0fade=assets?game=waterwheel&assetPath=images/king0fade.gif +king1=assets?game=waterwheel&assetPath=images/king1.gif +kingflash=assets?game=waterwheel&assetPath=images/kingflash.gif +lid=assets?game=waterwheel&assetPath=images/lid.gif +lovemeter=assets?game=waterwheel&assetPath=images/lovemeter.gif +metacard=assets?game=waterwheel&assetPath=images/metacard.jpg +metacardbutton=assets?game=waterwheel&assetPath=images/metacardbutton.gif +metacardflip=assets?game=waterwheel&assetPath=images/metacardflip.gif +metaimgs=assets?game=waterwheel&assetPath=images/metaimgs.gif +meter_patch=assets?game=waterwheel&assetPath=images/meter_patch.jpg +numbers=assets?game=waterwheel&assetPath=images/numbers.gif +numbersfaded=assets?game=waterwheel&assetPath=images/numbersfaded.gif +particles=assets?game=waterwheel&assetPath=images/particles.gif +particles2=assets?game=waterwheel&assetPath=images/particles.gif +porthole=assets?game=waterwheel&assetPath=images/porthole.gif +preservers=assets?game=waterwheel&assetPath=images/preservers.gif +rank0=assets?game=waterwheel&assetPath=images/rank0.jpg +rank1=assets?game=waterwheel&assetPath=images/rank1.jpg +rank2=assets?game=waterwheel&assetPath=images/rank2.jpg +rank3=assets?game=waterwheel&assetPath=images/rank3.jpg +rank4=assets?game=waterwheel&assetPath=images/rank4.jpg +rank5=assets?game=waterwheel&assetPath=images/rank5.jpg +rank6=assets?game=waterwheel&assetPath=images/rank6.jpg +rank7=assets?game=waterwheel&assetPath=images/rank7.jpg +rank8=assets?game=waterwheel&assetPath=images/rank8.jpg +rank9=assets?game=waterwheel&assetPath=images/rank9.jpg +rank10=assets?game=waterwheel&assetPath=images/rank10.jpg +rank11=assets?game=waterwheel&assetPath=images/rank11.jpg +rank12=assets?game=waterwheel&assetPath=images/rank12.jpg +rank13=assets?game=waterwheel&assetPath=images/rank13.jpg +rank14=assets?game=waterwheel&assetPath=images/rank14.jpg +rank15=assets?game=waterwheel&assetPath=images/rank15.jpg +rank16=assets?game=waterwheel&assetPath=images/rank16.jpg +rank17=assets?game=waterwheel&assetPath=images/rank17.jpg +rank18=assets?game=waterwheel&assetPath=images/rank18.jpg +rank19=assets?game=waterwheel&assetPath=images/rank19.jpg +rank20=assets?game=waterwheel&assetPath=images/rank20.jpg +rank21=assets?game=waterwheel&assetPath=images/rank21.jpg +rank22=assets?game=waterwheel&assetPath=images/rank22.jpg +rank23=assets?game=waterwheel&assetPath=images/rank23.jpg +rank24=assets?game=waterwheel&assetPath=images/rank24.jpg +rankadvance=assets?game=waterwheel&assetPath=images/rankadvance.jpg +ranktitle=assets?game=waterwheel&assetPath=images/ranktitle.jpg +shadow=assets?game=waterwheel&assetPath=images/shadow.gif +slotoverlay=assets?game=waterwheel&assetPath=images/slotoverlay.jpg +tickerbg=assets?game=waterwheel&assetPath=images/tickerbg.gif +title=assets?game=waterwheel&assetPath=images/title.jpg +wave=assets?game=waterwheel&assetPath=images/wave.gif + +# ============================================================ +# WATERWHEEL.GAME.*.IMG (the real cache-key-prefixed entries the +# ESG engine actually looks up -- .bh() scans for these via the +# generic ".img" suffix convention. The browser-hosted setup needs +# these explicitly in config.txt since we're no longer using the +# standalone launcher's Java-side preloadImageCache() reflection +# hack to populate them programmatically.) +# ============================================================ +waterwheel.game.anchor.img=assets?game=waterwheel&assetPath=images/anchor.gif +waterwheel.game.anchorchain.img=assets?game=waterwheel&assetPath=images/anchorchain.gif +waterwheel.game.anchormask.img=assets?game=waterwheel&assetPath=images/anchormask.gif +waterwheel.game.anchoroverlay.img=assets?game=waterwheel&assetPath=images/anchoroverlay.jpg +waterwheel.game.bg.img=assets?game=waterwheel&assetPath=images/bg.jpg +waterwheel.game.bgmeta.img=assets?game=waterwheel&assetPath=images/bgmeta.jpg +waterwheel.game.bgparts.img=assets?game=waterwheel&assetPath=images/bgparts.jpg +waterwheel.game.blueglows.img=assets?game=waterwheel&assetPath=images/blueglows.gif +waterwheel.game.boat.img=assets?game=waterwheel&assetPath=images/boat.gif +waterwheel.game.bottomglows.img=assets?game=waterwheel&assetPath=images/bottomglows.jpg +waterwheel.game.bowglow.img=assets?game=waterwheel&assetPath=images/bowglow.jpg +waterwheel.game.button_extra.img=assets?game=waterwheel&assetPath=images/button_extra.jpg +waterwheel.game.button_undo.img=assets?game=waterwheel&assetPath=images/button_undo.jpg +waterwheel.game.buttons.img=assets?game=waterwheel&assetPath=images/buttons.gif +waterwheel.game.cake.img=assets?game=waterwheel&assetPath=images/cake.gif +waterwheel.game.cakeglows.img=assets?game=waterwheel&assetPath=images/cakeglows.jpg +waterwheel.game.cameraflash.img=assets?game=waterwheel&assetPath=images/cameraflash.gif +waterwheel.game.card_blanks.img=assets?game=waterwheel&assetPath=images/card_blanks.gif +waterwheel.game.card_blanksfade.img=assets?game=waterwheel&assetPath=images/card_blanksfade.gif +waterwheel.game.cardflip.img=assets?game=waterwheel&assetPath=images/cardflip.gif +waterwheel.game.characters.img=assets?game=waterwheel&assetPath=images/characters.gif +waterwheel.game.characters2.img=assets?game=waterwheel&assetPath=images/characters2.gif +waterwheel.game.characters2fade.img=assets?game=waterwheel&assetPath=images/characters2fade.gif +waterwheel.game.charactersfade.img=assets?game=waterwheel&assetPath=images/charactersfade.gif +waterwheel.game.docks.img=assets?game=waterwheel&assetPath=images/docks.gif +waterwheel.game.door_open.img=assets?game=waterwheel&assetPath=images/door_open.jpg +waterwheel.game.floaty.img=assets?game=waterwheel&assetPath=images/floaty.gif +waterwheel.game.greenglow.img=assets?game=waterwheel&assetPath=images/greenglow.gif +waterwheel.game.hands.img=assets?game=waterwheel&assetPath=images/hands.gif +waterwheel.game.hatch.img=assets?game=waterwheel&assetPath=images/hatch.jpg +waterwheel.game.headings.img=assets?game=waterwheel&assetPath=images/headings.gif +waterwheel.game.heartfrag.img=assets?game=waterwheel&assetPath=images/heartfrag.gif +waterwheel.game.heartglows.img=assets?game=waterwheel&assetPath=images/heartglows.gif +waterwheel.game.hearts.img=assets?game=waterwheel&assetPath=images/hearts.gif +waterwheel.game.holder.img=assets?game=waterwheel&assetPath=images/holder.gif +waterwheel.game.hrings.img=assets?game=waterwheel&assetPath=images/hrings.gif +waterwheel.game.iris.img=assets?game=waterwheel&assetPath=images/iris.gif +waterwheel.game.king0.img=assets?game=waterwheel&assetPath=images/king0.gif +waterwheel.game.king0fade.img=assets?game=waterwheel&assetPath=images/king0fade.gif +waterwheel.game.king1.img=assets?game=waterwheel&assetPath=images/king1.gif +waterwheel.game.kingflash.img=assets?game=waterwheel&assetPath=images/kingflash.gif +waterwheel.game.lid.img=assets?game=waterwheel&assetPath=images/lid.gif +waterwheel.game.lovemeter.img=assets?game=waterwheel&assetPath=images/lovemeter.gif +waterwheel.game.metacard.img=assets?game=waterwheel&assetPath=images/metacard.jpg +waterwheel.game.metacardbutton.img=assets?game=waterwheel&assetPath=images/metacardbutton.gif +waterwheel.game.metacardflip.img=assets?game=waterwheel&assetPath=images/metacardflip.gif +waterwheel.game.metaimgs.img=assets?game=waterwheel&assetPath=images/metaimgs.gif +waterwheel.game.meter_patch.img=assets?game=waterwheel&assetPath=images/meter_patch.jpg +waterwheel.game.numbers.img=assets?game=waterwheel&assetPath=images/numbers.gif +waterwheel.game.numbersfaded.img=assets?game=waterwheel&assetPath=images/numbersfaded.gif +waterwheel.game.particles.img=assets?game=waterwheel&assetPath=images/particles.gif +waterwheel.game.particles2.img=assets?game=waterwheel&assetPath=images/particles.gif +waterwheel.game.porthole.img=assets?game=waterwheel&assetPath=images/porthole.gif +waterwheel.game.preservers.img=assets?game=waterwheel&assetPath=images/preservers.gif +waterwheel.game.rank0.img=assets?game=waterwheel&assetPath=images/rank0.jpg +waterwheel.game.rank1.img=assets?game=waterwheel&assetPath=images/rank1.jpg +waterwheel.game.rank2.img=assets?game=waterwheel&assetPath=images/rank2.jpg +waterwheel.game.rank3.img=assets?game=waterwheel&assetPath=images/rank3.jpg +waterwheel.game.rank4.img=assets?game=waterwheel&assetPath=images/rank4.jpg +waterwheel.game.rank5.img=assets?game=waterwheel&assetPath=images/rank5.jpg +waterwheel.game.rank6.img=assets?game=waterwheel&assetPath=images/rank6.jpg +waterwheel.game.rank7.img=assets?game=waterwheel&assetPath=images/rank7.jpg +waterwheel.game.rank8.img=assets?game=waterwheel&assetPath=images/rank8.jpg +waterwheel.game.rank9.img=assets?game=waterwheel&assetPath=images/rank9.jpg +waterwheel.game.rank10.img=assets?game=waterwheel&assetPath=images/rank10.jpg +waterwheel.game.rank11.img=assets?game=waterwheel&assetPath=images/rank11.jpg +waterwheel.game.rank12.img=assets?game=waterwheel&assetPath=images/rank12.jpg +waterwheel.game.rank13.img=assets?game=waterwheel&assetPath=images/rank13.jpg +waterwheel.game.rank14.img=assets?game=waterwheel&assetPath=images/rank14.jpg +waterwheel.game.rank15.img=assets?game=waterwheel&assetPath=images/rank15.jpg +waterwheel.game.rank16.img=assets?game=waterwheel&assetPath=images/rank16.jpg +waterwheel.game.rank17.img=assets?game=waterwheel&assetPath=images/rank17.jpg +waterwheel.game.rank18.img=assets?game=waterwheel&assetPath=images/rank18.jpg +waterwheel.game.rank19.img=assets?game=waterwheel&assetPath=images/rank19.jpg +waterwheel.game.rank20.img=assets?game=waterwheel&assetPath=images/rank20.jpg +waterwheel.game.rank21.img=assets?game=waterwheel&assetPath=images/rank21.jpg +waterwheel.game.rank22.img=assets?game=waterwheel&assetPath=images/rank22.jpg +waterwheel.game.rank23.img=assets?game=waterwheel&assetPath=images/rank23.jpg +waterwheel.game.rank24.img=assets?game=waterwheel&assetPath=images/rank24.jpg +waterwheel.game.rankadvance.img=assets?game=waterwheel&assetPath=images/rankadvance.jpg +waterwheel.game.ranktitle.img=assets?game=waterwheel&assetPath=images/ranktitle.jpg +waterwheel.game.shadow.img=assets?game=waterwheel&assetPath=images/shadow.gif +waterwheel.game.slotoverlay.img=assets?game=waterwheel&assetPath=images/slotoverlay.jpg +waterwheel.game.tickerbg.img=assets?game=waterwheel&assetPath=images/tickerbg.gif +waterwheel.game.title.img=assets?game=waterwheel&assetPath=images/title.jpg +waterwheel.game.wave.img=assets?game=waterwheel&assetPath=images/wave.gif + +# The real bi()-scanned sound cache keys (waterwheel.game..snd) +waterwheel.game.LB_America.snd=assets?game=waterwheel&assetPath=sounds/LB_America.au +waterwheel.game.LB_Anchor.snd=assets?game=waterwheel&assetPath=sounds/LB_Anchor.au +waterwheel.game.LB_Asia.snd=assets?game=waterwheel&assetPath=sounds/LB_Asia.au +waterwheel.game.LB_BoatMoves.snd=assets?game=waterwheel&assetPath=sounds/LB_BoatMoves.au +waterwheel.game.LB_ButtonClick.snd=assets?game=waterwheel&assetPath=sounds/LB_ButtonClick.au +waterwheel.game.LB_CardFlip.snd=assets?game=waterwheel&assetPath=sounds/LB_CardFlip.au +waterwheel.game.LB_Europe.snd=assets?game=waterwheel&assetPath=sounds/LB_Europe.au +waterwheel.game.LB_Flash.snd=assets?game=waterwheel&assetPath=sounds/LB_Flash.au +waterwheel.game.LB_FreeCell.snd=assets?game=waterwheel&assetPath=sounds/LB_FreeCell.au +waterwheel.game.LB_HeartGone.snd=assets?game=waterwheel&assetPath=sounds/LB_HeartGone.au +waterwheel.game.LB_HeartScore.snd=assets?game=waterwheel&assetPath=sounds/LB_HeartScore.au +waterwheel.game.LB_HomeBase.snd=assets?game=waterwheel&assetPath=sounds/LB_HomeBase.au +waterwheel.game.LB_KingCard.snd=assets?game=waterwheel&assetPath=sounds/LB_KingCard.au +waterwheel.game.LB_Mismatch.snd=assets?game=waterwheel&assetPath=sounds/LB_Mismatch.au +waterwheel.game.LB_OutOfMoves.snd=assets?game=waterwheel&assetPath=sounds/LB_OutOfMoves.au +waterwheel.game.LB_PerfectMatch.snd=assets?game=waterwheel&assetPath=sounds/LB_PerfectMatch.au +waterwheel.game.LB_Reverse.snd=assets?game=waterwheel&assetPath=sounds/LB_Reverse.au +waterwheel.game.LB_Russia.snd=assets?game=waterwheel&assetPath=sounds/LB_Russia.au +waterwheel.game.LB_Score.snd=assets?game=waterwheel&assetPath=sounds/LB_Score.au +waterwheel.game.LB_Score1.snd=assets?game=waterwheel&assetPath=sounds/LB_Score1.au +waterwheel.game.LB_Score2.snd=assets?game=waterwheel&assetPath=sounds/LB_Score2.au +waterwheel.game.LB_Score3.snd=assets?game=waterwheel&assetPath=sounds/LB_Score3.au +waterwheel.game.LB_Score4.snd=assets?game=waterwheel&assetPath=sounds/LB_Score4.au +waterwheel.game.LB_ScoreBonus.snd=assets?game=waterwheel&assetPath=sounds/LB_ScoreBonus.au +waterwheel.game.LB_SelectCard.snd=assets?game=waterwheel&assetPath=sounds/LB_SelectCard.au +waterwheel.game.LB_Spooky.snd=assets?game=waterwheel&assetPath=sounds/LB_Spooky.au +waterwheel.game.LB_StartGame.snd=assets?game=waterwheel&assetPath=sounds/LB_StartGame.au +waterwheel.game.LB_Tiki.snd=assets?game=waterwheel&assetPath=sounds/LB_Tiki.au +waterwheel.game.LB_Transition.snd=assets?game=waterwheel&assetPath=sounds/LB_Transition.au +waterwheel.game.LB_Undo.snd=assets?game=waterwheel&assetPath=sounds/LB_Undo.au +waterwheel.game.silence.snd=assets?game=waterwheel&assetPath=sounds/silence.au + +# Script load (h()/Y() indirection -- identity mapping) +config/init.xml.dat=assets?game=waterwheel&assetPath=config/init.xml.dat + +# ============================================================ +# LOCALIZATION TEXT (never bundled in this preservation dump -- +# placeholder English text) +# ============================================================ +waterwheel.game.text.port.0=Port 0 +waterwheel.game.text.port.1=Port 1 +waterwheel.game.text.port.2=Port 2 +waterwheel.game.text.port.3=Port 3 +waterwheel.game.text.port.4=Port 4 +waterwheel.game.text.port.5=Port 5 +waterwheel.game.text.port.6=Port 6 +waterwheel.game.text.port.7=Port 7 +waterwheel.game.text.port.8=Port 8 +waterwheel.game.text.port.9=Port 9 +waterwheel.game.text.port.10=Port 10 +waterwheel.game.text.port.11=Port 11 +waterwheel.game.text.port.12=Port 12 +waterwheel.game.text.port.13=Port 13 +waterwheel.game.text.port.14=Port 14 +waterwheel.game.text.port.15=Port 15 +waterwheel.game.text.port.16=Port 16 +waterwheel.game.text.port.17=Port 17 +waterwheel.game.text.port.18=Port 18 + +waterwheel.game.text.meta.card.title.0=Card 0 +waterwheel.game.text.meta.card.title.0s=Card 0s +waterwheel.game.text.meta.card.title.1=Card 1 +waterwheel.game.text.meta.card.title.1s=Card 1s +waterwheel.game.text.meta.card.title.2=Card 2 +waterwheel.game.text.meta.card.title.2s=Card 2s +waterwheel.game.text.meta.card.title.3=Card 3 +waterwheel.game.text.meta.card.title.3s=Card 3s +waterwheel.game.text.meta.card.title.4=Card 4 +waterwheel.game.text.meta.card.title.4s=Card 4s +waterwheel.game.text.meta.card.title.5=Card 5 +waterwheel.game.text.meta.card.title.5s=Card 5s +waterwheel.game.text.meta.card.title.6=Card 6 +waterwheel.game.text.meta.card.title.6s=Card 6s +waterwheel.game.text.meta.card.title.7=Card 7 +waterwheel.game.text.meta.card.title.7s=Card 7s +waterwheel.game.text.meta.card.title.8=Card 8 +waterwheel.game.text.meta.card.title.8s=Card 8s +waterwheel.game.text.meta.card.title.9=Card 9 +waterwheel.game.text.meta.card.title.9s=Card 9s +waterwheel.game.text.meta.card.title.10=Card 10 +waterwheel.game.text.meta.card.title.10s=Card 10s +waterwheel.game.text.meta.card.title.11=Card 11 +waterwheel.game.text.meta.card.title.11s=Card 11s +waterwheel.game.text.meta.card.title.12=Card 12 +waterwheel.game.text.meta.card.title.12s=Card 12s + +waterwheel.game.text.ranks=Rank 0,Rank 1,Rank 2,Rank 3,Rank 4,Rank 5,Rank 6,Rank 7,Rank 8,Rank 9,Rank 10,Rank 11,Rank 12,Rank 13,Rank 14,Rank 15,Rank 16,Rank 17,Rank 18,Rank 19,Rank 20,Rank 21,Rank 22,Rank 23,Rank 24,Rank 25,Rank 26,Rank 27,Rank 28,Rank 29,Rank 30,Rank 31,Rank 32,Rank 33,Rank 34,Rank 35,Rank 36,Rank 37,Rank 38,Rank 39,Rank 40,Rank 41,Rank 42,Rank 43,Rank 44,Rank 45,Rank 46,Rank 47,Rank 48,Rank 49,Rank 50 + +waterwheel.game.text.ticker.first=Welcome aboard! +waterwheel.game.text.ticker.dblcupid=Dblcupid! +waterwheel.game.text.ticker.missboat=Missboat! +waterwheel.game.text.ticker.brokenhearts=Brokenhearts! +waterwheel.game.text.ticker.stowaway=Stowaway! +waterwheel.game.text.ticker.poolparty=Poolparty! +waterwheel.game.text.ticker.smooth=Smooth! +waterwheel.game.text.ticker.meter=Meter filling! +waterwheel.game.text.spaces.plural=spaces + +# ============================================================ +# GAME-OVER DIALOG (stdc.game.over.dlog.*) +# ============================================================ +stdc.game.over.dlog=0,0,564,506 +stdc.game.over.dlog.bg=0,0,564,506 +stdc.game.over.dlog.blnc=0,0,0,0 +stdc.game.over.dlog.btns=0,0,0,0 +stdc.game.over.dlog.fast=false +stdc.game.over.dlog.final=0,0,0,0 +stdc.game.over.dlog.final.txt= +stdc.game.over.dlog.frame.time=0 +stdc.game.over.dlog.pause.time=0 +stdc.game.over.dlog.rank=0,0,0,0 +stdc.game.over.dlog.rank.final=0,0,0,0 +stdc.game.over.dlog.rank.final.always=false +stdc.game.over.dlog.rank.jpot=0,0,0,0 +stdc.game.over.dlog.rank.last.txt= +stdc.game.over.dlog.rank.new=0,0,0,0 +stdc.game.over.dlog.rank.new.txt= +stdc.game.over.dlog.rank.txt= +stdc.game.over.dlog.ready=0,0,0,0 +stdc.game.over.dlog.ready.txt= +stdc.game.over.dlog.round=0,0,0,0 +stdc.game.over.dlog.rounds=0 +stdc.game.over.dlog.spin=false +stdc.game.over.dlog.spin.pic=waterwheel.game.boat +stdc.game.over.dlog.spin.pic.rect=0,0,50,50 +stdc.game.over.dlog.spin.pic.img.lzy=assets?game=waterwheel&assetPath=images/boat.gif +stdc.game.over.dlog.spin.spinner=0,0,0,0 +stdc.game.over.dlog.spin.spinner.rect=0,0,50,50 +stdc.game.over.dlog.spin.spinner.pause=0 +stdc.game.over.dlog.spin.txt= +stdc.game.over.dlog.threshold=0 +stdc.game.over.dlog.titl=0,0,0,0 +stdc.game.over.dlog.titl.txt= +stdc.game.over.dlog.totl=0,0,0,0 +stdc.game.over.dlog.totl.txt= +stdc.game.over.dlog.xprt=0,0,0,0 +stdc.game.over.dlog.zero=0,0,0,0 +stdc.game.over.dlog.zero.txt= + +# ============================================================ +# CONTROL PANEL (stdc.*) -- feature flags and layout +# ============================================================ +# NOTE: stdc.hasPrivateChat is TRUE (flipped from the original +# false) -- required for the chat.has.tabs system to actually +# build tab components at all. +stdc.hasAvatars=false +stdc.hasCashIn=false +stdc.hasChatAbuseReporting=false +stdc.hasEmoticons=false +stdc.hasFriendsList=false +stdc.hasGuestPass=false +stdc.hasJackpots=false +stdc.hasPlayerBooting=false +stdc.hasPrivateChat=true +stdc.hasPrizes=false +stdc.hasTokens=false +stdc.avatar.enabled=false +stdc.jfsb=false +stdc.paus=false +stdc.ratio.auto=false +stdc.ratio.auto.over=0 +stdc.dlog=false + +stdc.cash=0,0,0,0 +stdc.cash.alt=0,0,0,0 +stdc.cash.alt.sub=0,0,0,0 +# stdc.strp/stdc.bg are cache-key image lookups (this.j(...)), +# NOT rect strings -- point them at an already-cached image key, +# and use .img.lzy for the actual real-file mapping. +stdc.strp=waterwheel.game.boat +stdc.strp.img.lzy=assets?game=waterwheel&assetPath=images/interface.gif +stdc.bg.img.lzy=assets?game=waterwheel&assetPath=images/boat.gif +stdc.bg.sngl=0,0,0,0 +stdc.bg.sngl.rect=564,0,210,506 +# Positions the WHOLE chat/control panel container (q.N) -- +# this is the key that actually got the sidebar showing at all. +stdc.bg.rect=564,0,210,506 +stdc.jpot=0,0,0,0 +stdc.dblj=0,0,0,0 +stdc.dblj.sub=0,0,0,0 +stdc.tokn=0,0,0,0 +stdc.tokn.alt=0,0,0,0 +stdc.tokn.alt.sub=0,0,0,0 +stdc.tokn.frame=0,0,0,0 +stdc.tokn.frame.sub=0,0,0,0 +stdc.tokn.lbl=0,0,0,0 +stdc.tokn.lbl.sub=0,0,0,0 +stdc.tokn.alignment=left +stdc.skil=0,0,0,0 +stdc.skil.def=0 +stdc.skil.lvls=1 +stdc.skil.lbl=0,0,0,0 +stdc.skil.lbl.sub=0,0,0,0 +stdc.ngam=0,0,0,0 +stdc.rule=0,0,0,0 +stdc.decr=0 +stdc.incr=0 +stdc.snds=false + +stdc.paus.dlog.resume= +stdc.paus.dlog.text= +stdc.paus.dlog.xprt=0,0,0,0 +stdc.jfsd=false +stdc.jfsd.instr= +stdc.jfsd.nojava= +stdc.jfsd.strp=waterwheel.game.boat +stdc.jfsd.strp.img.lzy=assets?game=waterwheel&assetPath=images/boat.gif +stdc.jfsd.upsell=0,0,0,0 +stdc.avatar.controllers= +stdc.avatar.default.controller= +# NOTE: stdc.cusb.0 intentionally NOT set -- setting it to +# "false" broke click-through on the whole game board (the +# enable/disable loop in ControlPanel.e() NPEs on a null button +# slot). Leaving it undefined keeps the custom-button array +# empty, which is what we actually want. + +ui.jpot.dig.rect=0,0,50,20 +ui.jpot.dec=0 +ui.jpot.dec.count=0 + +# ============================================================ +# CHAT PANEL (chat.*, avat.*, ui.bg, ui.pvtc.*) +# ============================================================ +avat.rmtpi=0 +avat.throt=false +avat.dlay=0 +chat.avat.fps=10 +chat.avat.viewid=0 +chat.avat.dlay=0 +# NOTE: chat.has.tabs is TRUE (flipped from the original false) +chat.has.tabs=true +chat.pre=false +chat.frnd=false +chat.data.key= +chat.emot.num=0 +chat.emot.mepl=0 +chat.emot.img.lzy=assets?game=waterwheel&assetPath=images/chat/emoticons.gif +hasRatings=false +ui.pvtc.away.notify=false +ui.bg=255,140,0 +chat.bg=255,140,0 +ui.bg.rect=0,0,564,506 + +chat.view.max.lines=100 +chat.font=SansSerif,0,12 +chat.lg.font=SansSerif,0,14 + +chat.icon.badge.rect=0,0,16,16 +chat.icon.mute.rect=0,0,16,16 +chat.icon.watch.rect=0,0,16,16 +chat.icon.flag.rect=0,0,16,16 +chat.icon.sm.rect=0,0,16,16 +chat.icon.info.rect=0,0,16,16 +chat.icon.friend.rect=0,0,16,16 +chat.icon.rank.rect=0,0,16,16 + +chat.splt.top=0 +chat.splt.def=0 +chat.splt.bot=0 +chat.splt.sldr.h=0 +chat.splt.rect=0,28,210,150 +chat.splt.sldr.up.rect=0,0,0,0 +chat.splt.sldr.dn.rect=0,0,0,0 + +chat.tab.guest.norm.rect=0,0,0,0 +chat.tab.guest.pres.rect=0,0,0,0 +chat.tab.guest.over.rect=0,0,0,0 +# --- real, measured coordinates from assets?game=waterwheel&assetPath=images/chat/tab-strip.gif, +# a 1217x22 sprite sheet. Positions (start/end x) are directly +# measured from the actual image; which color-state maps to +# which semantic name (norm/free/indi/pres) is a best-effort +# guess by typical UI convention -- verify visually and adjust. +chat.tab.main.norm.rect=0,0,79,20 +chat.tab.main.free.rect=90,0,78,20 +chat.tab.main.indi.rect=179,0,78,20 +chat.tab.main.pres.rect=258,0,104,20 +chat.tab.main.rect=0,0,105,28 +chat.tab.pvtc.norm.rect=362,0,73,20 +chat.tab.pvtc.free.rect=445,0,79,20 +chat.tab.pvtc.indi.rect=534,0,79,20 +chat.tab.pvtc.disa.rect=623,0,79,20 +chat.tab.pvtc.pres.rect=712,0,88,20 +chat.tab.pvtc.rect=105,0,105,28 + +chat.button.main.rect=0,0,0,0 +chat.button.topleft.rect=0,0,0,0 +chat.button.bottomright.rect=0,0,0,0 +chat.button.bg.rect=0,0,0,0 +chat.hiddenpicture.rect=0,0,0,0 +chat.sele.who.rect=0,0,0,0 +chat.sele.avat.rect=0,0,0,0 +chat.help.rect=0,0,0,0 +chat.close.rect=0,0,0,0 +chat.field.rect=0,470,160,30 +chat.annc.rect=0,0,0,0 +chat.friends.announce.rect=0,0,0,0 +chat.echo.rect=0,0,0,0 +chat.link.rect=0,0,0,0 +chat.view.premium.bg.rect=0,0,0,0 +chat.view.rect=0,178,210,260 +chat.nput.sele.rect=0,0,0,0 +chat.nput.rect=0,0,0,0 +chat.send.rect=160,470,50,30 +# real measured coordinates for the two "Sign up now to +# chat!" button states, far right of tab-strip.gif -- chat.send +# had no dedicated sub-region before, so it was very likely +# drawing the ENTIRE unclipped sprite sheet as its own button +# image, which is what was actually showing up at the bottom +# of the chat panel this whole time (not misplaced tabs). +chat.send.norm.rect=519,0,44,20 +chat.send.pres.rect=564,0,44,20 +chat.emot.btn.rect=0,0,0,0 +chat.opt.rect=0,0,0,0 + +# Image cache keys for the chat/badge image batch (all +# discovered via q.java's this.j(...) calls right before the +# chat.l constructor runs) +chat.icon.img.lzy=assets?game=waterwheel&assetPath=images/chat/icons-gf2.gif +chat.hidden.img.lzy=assets?game=waterwheel&assetPath=images/chat/hiddenChat.gif +# This is the tabs' REAL source image (com.pogo.game.client2.q's +# "image2 = this.j(\"chat.strp\")", feeding chat.l's "this.bw" field +# used by both chat.tab.main and chat.tab.pvtc). Distinct from +# chat.btn.strp (used only by chat.send). This line was set +# correctly early on but got lost during a later config +# consolidation -- its absence is why every tab sub-image's own +# source image ended up genuinely null, despite perfectly correct +# bounds/visibility/positioning at every other layer. +chat.strp.img.lzy=assets?game=waterwheel&assetPath=images/chat/tab-strip.gif +chat.badgeg.img.lzy=assets?game=waterwheel&assetPath=images/badges/medals.gif +chat.avatarmg.img.lzy=assets?game=waterwheel&assetPath=images/badges/avatarminighost.gif +chat.gradient.main.img.lzy=assets?game=waterwheel&assetPath=images/chat/background-fade.gif +chat.gradient.pvt.img.lzy=assets?game=waterwheel&assetPath=images/chat/background-fade-pvt.gif +chat.welc.img.lzy=assets?game=waterwheel&assetPath=images/chat/welcome.jpg +chat.btn.strp.img.lzy=assets?game=waterwheel&assetPath=images/chat/newstrip_en.gif +chat.splt.sldr.img.lzy=assets?game=waterwheel&assetPath=images/chat/slider-bar-grip.gif +chat.splt.sldr.grip.img.lzy=assets?game=waterwheel&assetPath=images/chat/slider-bar-grip.gif +chat.btn.feld.img.lzy=assets?game=waterwheel&assetPath=images/chat/onepix_background_20h.gif +chat.who.premium.bg.img.lzy=assets?game=waterwheel&assetPath=images/chat/background-fade.gif +chat.who.premium.over.bg.img.lzy=assets?game=waterwheel&assetPath=images/chat/background-fade.gif +chat.wmrk.img.lzy=assets?game=waterwheel&assetPath=images/chat/onepix_background_20h.gif + +# ============================================================ +# BADGE SYSTEM +# ============================================================ +badge.anim.time=1000 +badge.storage.size=10 +badge.icon.root=assets?game=waterwheel&assetPath=images/badges +badge.icon.ext=.gif + +# ============================================================ +# SINGLE-APPLET MODE -- switched from multi-applet (separate +# ShellApplet "game"/"chat" tags) after hitting an intermittent +# timing race in W("chat")'s cross-applet registry coordination +# (worked once, then failed to reproduce across several reloads +# with identical code/config). isSingleApplet=true makes W() +# short-circuit immediately with no cross-applet/cross-window +# dependency at all -- game and chat share one applet, one +# window, one straightforward init sequence. +# ============================================================ +isSingleApplet=true + +# ============================================================ +# 2019 build (PPS-2019 / com.pogo.game.client2.chat.s) -- new, +# richer chat shell keys. All int-parsed via com.pogo.util.thin.g +# (extended by com.pogo.ui2.awt.ac), which throws immediately if +# any of these are missing -- these are first-pass placeholder +# values based on key names and the old shell's rough layout, +# NOT verified against real Pogo assets. Expect to tune once the +# panel actually renders. +# ============================================================ +chat.pna.historyButton.height=20 +chat.splt.top=28 +chat.splt.def=150 +chat.splt.bot=400 +chat.avat.dlay=100 +chat.field.hgap=2 +chat.field.vgap=2 +chat.nput.row.h=20 +chat.splt.sldr.h=8 +chat.splt.bottom.top=28 +chat.splt.bottom.def=150 +chat.splt.bottom.bot=400 +chat.who.rate.w=40 +chat.who.data.w=100 +chat.boot.priv=0 +chat.rect=0,0,210,506 +chat.gift.ignoreSplt=false +chat.hide.guest.profile=false +chat.who.header.hide=false +stdc.hasStore=false +stdc.hasStoreBadge=false +ui.localized.num.format=false +chat.gift.button.num.max=10 +chat.pna.historyButton.label.rect=0,0,105,20 +# chat.t's private button-builder: builds a 3-segment stretchy +# button (left-cap "img" / right-cap "end" / middle-stretch +# "render") for two variants -- prefixed "grey." and unprefixed. +# Found via direct bytecode disassembly (chat.t is a dual-purpose +# splitter-slider/gift-history-button widget not present in the +# decompiled source we had). Placeholder rects, likely need visual +# tuning once rendered. +chat.gift.button.bg.grey.img.rect=0,0,10,20 +chat.gift.button.bg.grey.end.rect=0,0,10,20 +chat.gift.button.bg.grey.render.rect=0,0,50,20 +chat.gift.button.bg.img.rect=0,0,10,20 +chat.gift.button.bg.end.rect=0,0,10,20 +chat.gift.button.bg.render.rect=0,0,50,20 +# Point-typed (ac.d) positions for the gift-count digit glyphs on +# the same button, referenced from chat.t's a(I)V -- called +# conditionally right after setBounds() completes. +chat.gift.button.num.firstDigit.pt=0,0 +chat.gift.button.num.secondDigit.pt=10,0 +chat.gift.button.num.threeOrMoreDigit.pt=20,0 \ No newline at end of file diff --git a/StaticFiles/GameAssets/waterwheel/config/init.xml b/StaticFiles/GameAssets/waterwheel/config/init.xml new file mode 100644 index 0000000..b57a2b5 --- /dev/null +++ b/StaticFiles/GameAssets/waterwheel/config/init.xml @@ -0,0 +1,802 @@ + + diff --git a/StaticFiles/GameAssets/waterwheel/config/init.xml.dat b/StaticFiles/GameAssets/waterwheel/config/init.xml.dat new file mode 100644 index 0000000..2877355 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/config/init.xml.dat differ diff --git a/StaticFiles/GameAssets/waterwheel/images/anchor.gif b/StaticFiles/GameAssets/waterwheel/images/anchor.gif new file mode 100644 index 0000000..b264faa Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/anchor.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/anchorchain.gif b/StaticFiles/GameAssets/waterwheel/images/anchorchain.gif new file mode 100644 index 0000000..6b2cdf4 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/anchorchain.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/anchormask.gif b/StaticFiles/GameAssets/waterwheel/images/anchormask.gif new file mode 100644 index 0000000..fc9a927 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/anchormask.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/anchoroverlay.jpg b/StaticFiles/GameAssets/waterwheel/images/anchoroverlay.jpg new file mode 100644 index 0000000..dab3288 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/anchoroverlay.jpg differ diff --git a/StaticFiles/GameAssets/waterwheel/images/avatar/avatarghost-f.gif b/StaticFiles/GameAssets/waterwheel/images/avatar/avatarghost-f.gif new file mode 100644 index 0000000..86bf980 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/avatar/avatarghost-f.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/avatar/avatarghost-m.gif b/StaticFiles/GameAssets/waterwheel/images/avatar/avatarghost-m.gif new file mode 100644 index 0000000..7b5f3ed Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/avatar/avatarghost-m.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/avatar/loading-65.gif b/StaticFiles/GameAssets/waterwheel/images/avatar/loading-65.gif new file mode 100644 index 0000000..2b1d7fe Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/avatar/loading-65.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/badges/avatarminighost.gif b/StaticFiles/GameAssets/waterwheel/images/badges/avatarminighost.gif new file mode 100644 index 0000000..e55330f Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/badges/avatarminighost.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/badges/medals.gif b/StaticFiles/GameAssets/waterwheel/images/badges/medals.gif new file mode 100644 index 0000000..3a8084d Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/badges/medals.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/bg.jpg b/StaticFiles/GameAssets/waterwheel/images/bg.jpg new file mode 100644 index 0000000..7085a7f Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/bg.jpg differ diff --git a/StaticFiles/GameAssets/waterwheel/images/bgmeta.jpg b/StaticFiles/GameAssets/waterwheel/images/bgmeta.jpg new file mode 100644 index 0000000..861672d Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/bgmeta.jpg differ diff --git a/StaticFiles/GameAssets/waterwheel/images/bgparts.jpg b/StaticFiles/GameAssets/waterwheel/images/bgparts.jpg new file mode 100644 index 0000000..486ff9c Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/bgparts.jpg differ diff --git a/StaticFiles/GameAssets/waterwheel/images/blueglows.gif b/StaticFiles/GameAssets/waterwheel/images/blueglows.gif new file mode 100644 index 0000000..af69c17 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/blueglows.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/boat.gif b/StaticFiles/GameAssets/waterwheel/images/boat.gif new file mode 100644 index 0000000..68acc26 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/boat.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/bottomglows.jpg b/StaticFiles/GameAssets/waterwheel/images/bottomglows.jpg new file mode 100644 index 0000000..10529d4 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/bottomglows.jpg differ diff --git a/StaticFiles/GameAssets/waterwheel/images/bowglow.jpg b/StaticFiles/GameAssets/waterwheel/images/bowglow.jpg new file mode 100644 index 0000000..5a8fa79 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/bowglow.jpg differ diff --git a/StaticFiles/GameAssets/waterwheel/images/button_extra.jpg b/StaticFiles/GameAssets/waterwheel/images/button_extra.jpg new file mode 100644 index 0000000..d5a5c8b Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/button_extra.jpg differ diff --git a/StaticFiles/GameAssets/waterwheel/images/button_undo.jpg b/StaticFiles/GameAssets/waterwheel/images/button_undo.jpg new file mode 100644 index 0000000..8ff94d2 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/button_undo.jpg differ diff --git a/StaticFiles/GameAssets/waterwheel/images/buttons.gif b/StaticFiles/GameAssets/waterwheel/images/buttons.gif new file mode 100644 index 0000000..05615b0 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/buttons.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/cake.gif b/StaticFiles/GameAssets/waterwheel/images/cake.gif new file mode 100644 index 0000000..0fd21a6 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/cake.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/cakeglows.jpg b/StaticFiles/GameAssets/waterwheel/images/cakeglows.jpg new file mode 100644 index 0000000..4136b65 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/cakeglows.jpg differ diff --git a/StaticFiles/GameAssets/waterwheel/images/cameraflash.gif b/StaticFiles/GameAssets/waterwheel/images/cameraflash.gif new file mode 100644 index 0000000..780b807 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/cameraflash.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/card_blanks.gif b/StaticFiles/GameAssets/waterwheel/images/card_blanks.gif new file mode 100644 index 0000000..9345cb7 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/card_blanks.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/card_blanksfade.gif b/StaticFiles/GameAssets/waterwheel/images/card_blanksfade.gif new file mode 100644 index 0000000..2df7511 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/card_blanksfade.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/cardflip.gif b/StaticFiles/GameAssets/waterwheel/images/cardflip.gif new file mode 100644 index 0000000..eb671bb Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/cardflip.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/characters.gif b/StaticFiles/GameAssets/waterwheel/images/characters.gif new file mode 100644 index 0000000..8c83ed4 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/characters.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/characters2.gif b/StaticFiles/GameAssets/waterwheel/images/characters2.gif new file mode 100644 index 0000000..d42de2f Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/characters2.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/characters2fade.gif b/StaticFiles/GameAssets/waterwheel/images/characters2fade.gif new file mode 100644 index 0000000..3921bff Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/characters2fade.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/charactersfade.gif b/StaticFiles/GameAssets/waterwheel/images/charactersfade.gif new file mode 100644 index 0000000..c39f8a9 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/charactersfade.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/chat/background-fade-pvt.gif b/StaticFiles/GameAssets/waterwheel/images/chat/background-fade-pvt.gif new file mode 100644 index 0000000..f5b77e7 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/chat/background-fade-pvt.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/chat/background-fade.gif b/StaticFiles/GameAssets/waterwheel/images/chat/background-fade.gif new file mode 100644 index 0000000..470c585 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/chat/background-fade.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/chat/emoticons.gif b/StaticFiles/GameAssets/waterwheel/images/chat/emoticons.gif new file mode 100644 index 0000000..b1ab5d6 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/chat/emoticons.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/chat/hiddenChat.gif b/StaticFiles/GameAssets/waterwheel/images/chat/hiddenChat.gif new file mode 100644 index 0000000..34452ac Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/chat/hiddenChat.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/chat/icons-gf2.gif b/StaticFiles/GameAssets/waterwheel/images/chat/icons-gf2.gif new file mode 100644 index 0000000..d975b51 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/chat/icons-gf2.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/chat/newstrip_en.gif b/StaticFiles/GameAssets/waterwheel/images/chat/newstrip_en.gif new file mode 100644 index 0000000..d0a2a57 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/chat/newstrip_en.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/chat/onepix_background_13h.gif b/StaticFiles/GameAssets/waterwheel/images/chat/onepix_background_13h.gif new file mode 100644 index 0000000..f86fafd Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/chat/onepix_background_13h.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/chat/onepix_background_20h.gif b/StaticFiles/GameAssets/waterwheel/images/chat/onepix_background_20h.gif new file mode 100644 index 0000000..216a163 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/chat/onepix_background_20h.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/chat/slider-bar-grip.gif b/StaticFiles/GameAssets/waterwheel/images/chat/slider-bar-grip.gif new file mode 100644 index 0000000..ed9901c Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/chat/slider-bar-grip.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/chat/tab-strip.gif b/StaticFiles/GameAssets/waterwheel/images/chat/tab-strip.gif new file mode 100644 index 0000000..9525f62 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/chat/tab-strip.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/chat/welcome.jpg b/StaticFiles/GameAssets/waterwheel/images/chat/welcome.jpg new file mode 100644 index 0000000..5c4521f Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/chat/welcome.jpg differ diff --git a/StaticFiles/GameAssets/waterwheel/images/docks.gif b/StaticFiles/GameAssets/waterwheel/images/docks.gif new file mode 100644 index 0000000..914b4e2 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/docks.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/door_open.jpg b/StaticFiles/GameAssets/waterwheel/images/door_open.jpg new file mode 100644 index 0000000..599054b Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/door_open.jpg differ diff --git a/StaticFiles/GameAssets/waterwheel/images/floaty.gif b/StaticFiles/GameAssets/waterwheel/images/floaty.gif new file mode 100644 index 0000000..a29f1b6 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/floaty.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/greenglow.gif b/StaticFiles/GameAssets/waterwheel/images/greenglow.gif new file mode 100644 index 0000000..866c406 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/greenglow.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/hands.gif b/StaticFiles/GameAssets/waterwheel/images/hands.gif new file mode 100644 index 0000000..82acb2e Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/hands.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/hatch.jpg b/StaticFiles/GameAssets/waterwheel/images/hatch.jpg new file mode 100644 index 0000000..8b87ae8 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/hatch.jpg differ diff --git a/StaticFiles/GameAssets/waterwheel/images/headings.gif b/StaticFiles/GameAssets/waterwheel/images/headings.gif new file mode 100644 index 0000000..888e824 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/headings.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/heartfrag.gif b/StaticFiles/GameAssets/waterwheel/images/heartfrag.gif new file mode 100644 index 0000000..79685de Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/heartfrag.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/heartglows.gif b/StaticFiles/GameAssets/waterwheel/images/heartglows.gif new file mode 100644 index 0000000..ca5b319 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/heartglows.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/hearts.gif b/StaticFiles/GameAssets/waterwheel/images/hearts.gif new file mode 100644 index 0000000..46ab1f4 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/hearts.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/holder.gif b/StaticFiles/GameAssets/waterwheel/images/holder.gif new file mode 100644 index 0000000..073b92a Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/holder.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/hrings.gif b/StaticFiles/GameAssets/waterwheel/images/hrings.gif new file mode 100644 index 0000000..4124bac Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/hrings.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/interface.gif b/StaticFiles/GameAssets/waterwheel/images/interface.gif new file mode 100644 index 0000000..35cc020 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/interface.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/iris.gif b/StaticFiles/GameAssets/waterwheel/images/iris.gif new file mode 100644 index 0000000..430759c Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/iris.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/king0.gif b/StaticFiles/GameAssets/waterwheel/images/king0.gif new file mode 100644 index 0000000..8632ccd Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/king0.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/king0fade.gif b/StaticFiles/GameAssets/waterwheel/images/king0fade.gif new file mode 100644 index 0000000..03b8c84 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/king0fade.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/king1.gif b/StaticFiles/GameAssets/waterwheel/images/king1.gif new file mode 100644 index 0000000..fb2f60b Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/king1.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/kingflash.gif b/StaticFiles/GameAssets/waterwheel/images/kingflash.gif new file mode 100644 index 0000000..5351010 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/kingflash.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/lid.gif b/StaticFiles/GameAssets/waterwheel/images/lid.gif new file mode 100644 index 0000000..229fa84 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/lid.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/lovemeter.gif b/StaticFiles/GameAssets/waterwheel/images/lovemeter.gif new file mode 100644 index 0000000..7c5aef8 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/lovemeter.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/metacard.jpg b/StaticFiles/GameAssets/waterwheel/images/metacard.jpg new file mode 100644 index 0000000..a3d36f8 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/metacard.jpg differ diff --git a/StaticFiles/GameAssets/waterwheel/images/metacardbutton.gif b/StaticFiles/GameAssets/waterwheel/images/metacardbutton.gif new file mode 100644 index 0000000..4c219d2 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/metacardbutton.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/metacardflip.gif b/StaticFiles/GameAssets/waterwheel/images/metacardflip.gif new file mode 100644 index 0000000..5a94c38 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/metacardflip.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/metaimgs.gif b/StaticFiles/GameAssets/waterwheel/images/metaimgs.gif new file mode 100644 index 0000000..3a36e4f Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/metaimgs.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/meter_patch.jpg b/StaticFiles/GameAssets/waterwheel/images/meter_patch.jpg new file mode 100644 index 0000000..8942ddc Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/meter_patch.jpg differ diff --git a/StaticFiles/GameAssets/waterwheel/images/numbers.gif b/StaticFiles/GameAssets/waterwheel/images/numbers.gif new file mode 100644 index 0000000..1160af0 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/numbers.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/numbersfaded.gif b/StaticFiles/GameAssets/waterwheel/images/numbersfaded.gif new file mode 100644 index 0000000..7e3033a Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/numbersfaded.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/particles.gif b/StaticFiles/GameAssets/waterwheel/images/particles.gif new file mode 100644 index 0000000..25daa11 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/particles.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/porthole.gif b/StaticFiles/GameAssets/waterwheel/images/porthole.gif new file mode 100644 index 0000000..99aa74e Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/porthole.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/preservers.gif b/StaticFiles/GameAssets/waterwheel/images/preservers.gif new file mode 100644 index 0000000..974843a Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/preservers.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/rank0.jpg b/StaticFiles/GameAssets/waterwheel/images/rank0.jpg new file mode 100644 index 0000000..36dcc8c Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/rank0.jpg differ diff --git a/StaticFiles/GameAssets/waterwheel/images/rank1.jpg b/StaticFiles/GameAssets/waterwheel/images/rank1.jpg new file mode 100644 index 0000000..a94b47a Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/rank1.jpg differ diff --git a/StaticFiles/GameAssets/waterwheel/images/rank10.jpg b/StaticFiles/GameAssets/waterwheel/images/rank10.jpg new file mode 100644 index 0000000..916c2e8 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/rank10.jpg differ diff --git a/StaticFiles/GameAssets/waterwheel/images/rank11.jpg b/StaticFiles/GameAssets/waterwheel/images/rank11.jpg new file mode 100644 index 0000000..5de4ec5 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/rank11.jpg differ diff --git a/StaticFiles/GameAssets/waterwheel/images/rank12.jpg b/StaticFiles/GameAssets/waterwheel/images/rank12.jpg new file mode 100644 index 0000000..3e07baa Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/rank12.jpg differ diff --git a/StaticFiles/GameAssets/waterwheel/images/rank13.jpg b/StaticFiles/GameAssets/waterwheel/images/rank13.jpg new file mode 100644 index 0000000..cb53334 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/rank13.jpg differ diff --git a/StaticFiles/GameAssets/waterwheel/images/rank14.jpg b/StaticFiles/GameAssets/waterwheel/images/rank14.jpg new file mode 100644 index 0000000..da0bc32 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/rank14.jpg differ diff --git a/StaticFiles/GameAssets/waterwheel/images/rank15.jpg b/StaticFiles/GameAssets/waterwheel/images/rank15.jpg new file mode 100644 index 0000000..dfb7a76 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/rank15.jpg differ diff --git a/StaticFiles/GameAssets/waterwheel/images/rank16.jpg b/StaticFiles/GameAssets/waterwheel/images/rank16.jpg new file mode 100644 index 0000000..6229cee Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/rank16.jpg differ diff --git a/StaticFiles/GameAssets/waterwheel/images/rank17.jpg b/StaticFiles/GameAssets/waterwheel/images/rank17.jpg new file mode 100644 index 0000000..e41460d Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/rank17.jpg differ diff --git a/StaticFiles/GameAssets/waterwheel/images/rank18.jpg b/StaticFiles/GameAssets/waterwheel/images/rank18.jpg new file mode 100644 index 0000000..5fab26a Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/rank18.jpg differ diff --git a/StaticFiles/GameAssets/waterwheel/images/rank19.jpg b/StaticFiles/GameAssets/waterwheel/images/rank19.jpg new file mode 100644 index 0000000..abec6bf Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/rank19.jpg differ diff --git a/StaticFiles/GameAssets/waterwheel/images/rank2.jpg b/StaticFiles/GameAssets/waterwheel/images/rank2.jpg new file mode 100644 index 0000000..4514086 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/rank2.jpg differ diff --git a/StaticFiles/GameAssets/waterwheel/images/rank20.jpg b/StaticFiles/GameAssets/waterwheel/images/rank20.jpg new file mode 100644 index 0000000..10ff901 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/rank20.jpg differ diff --git a/StaticFiles/GameAssets/waterwheel/images/rank21.jpg b/StaticFiles/GameAssets/waterwheel/images/rank21.jpg new file mode 100644 index 0000000..fa5b051 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/rank21.jpg differ diff --git a/StaticFiles/GameAssets/waterwheel/images/rank22.jpg b/StaticFiles/GameAssets/waterwheel/images/rank22.jpg new file mode 100644 index 0000000..46a887e Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/rank22.jpg differ diff --git a/StaticFiles/GameAssets/waterwheel/images/rank23.jpg b/StaticFiles/GameAssets/waterwheel/images/rank23.jpg new file mode 100644 index 0000000..aabd410 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/rank23.jpg differ diff --git a/StaticFiles/GameAssets/waterwheel/images/rank24.jpg b/StaticFiles/GameAssets/waterwheel/images/rank24.jpg new file mode 100644 index 0000000..b2517a4 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/rank24.jpg differ diff --git a/StaticFiles/GameAssets/waterwheel/images/rank3.jpg b/StaticFiles/GameAssets/waterwheel/images/rank3.jpg new file mode 100644 index 0000000..e999851 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/rank3.jpg differ diff --git a/StaticFiles/GameAssets/waterwheel/images/rank4.jpg b/StaticFiles/GameAssets/waterwheel/images/rank4.jpg new file mode 100644 index 0000000..b1d98f8 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/rank4.jpg differ diff --git a/StaticFiles/GameAssets/waterwheel/images/rank5.jpg b/StaticFiles/GameAssets/waterwheel/images/rank5.jpg new file mode 100644 index 0000000..0ad85ed Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/rank5.jpg differ diff --git a/StaticFiles/GameAssets/waterwheel/images/rank6.jpg b/StaticFiles/GameAssets/waterwheel/images/rank6.jpg new file mode 100644 index 0000000..7479d1d Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/rank6.jpg differ diff --git a/StaticFiles/GameAssets/waterwheel/images/rank7.jpg b/StaticFiles/GameAssets/waterwheel/images/rank7.jpg new file mode 100644 index 0000000..768fceb Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/rank7.jpg differ diff --git a/StaticFiles/GameAssets/waterwheel/images/rank8.jpg b/StaticFiles/GameAssets/waterwheel/images/rank8.jpg new file mode 100644 index 0000000..7d896f1 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/rank8.jpg differ diff --git a/StaticFiles/GameAssets/waterwheel/images/rank9.jpg b/StaticFiles/GameAssets/waterwheel/images/rank9.jpg new file mode 100644 index 0000000..854512a Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/rank9.jpg differ diff --git a/StaticFiles/GameAssets/waterwheel/images/rankadvance.jpg b/StaticFiles/GameAssets/waterwheel/images/rankadvance.jpg new file mode 100644 index 0000000..b6e86fc Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/rankadvance.jpg differ diff --git a/StaticFiles/GameAssets/waterwheel/images/ranktitle.jpg b/StaticFiles/GameAssets/waterwheel/images/ranktitle.jpg new file mode 100644 index 0000000..2d8a42f Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/ranktitle.jpg differ diff --git a/StaticFiles/GameAssets/waterwheel/images/shadow.gif b/StaticFiles/GameAssets/waterwheel/images/shadow.gif new file mode 100644 index 0000000..2c7514e Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/shadow.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/slotoverlay.jpg b/StaticFiles/GameAssets/waterwheel/images/slotoverlay.jpg new file mode 100644 index 0000000..f740c64 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/slotoverlay.jpg differ diff --git a/StaticFiles/GameAssets/waterwheel/images/tickerbg.gif b/StaticFiles/GameAssets/waterwheel/images/tickerbg.gif new file mode 100644 index 0000000..d0359ac Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/tickerbg.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/images/title.jpg b/StaticFiles/GameAssets/waterwheel/images/title.jpg new file mode 100644 index 0000000..42eff1d Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/title.jpg differ diff --git a/StaticFiles/GameAssets/waterwheel/images/wave.gif b/StaticFiles/GameAssets/waterwheel/images/wave.gif new file mode 100644 index 0000000..39f0fed Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/images/wave.gif differ diff --git a/StaticFiles/GameAssets/waterwheel/index.html b/StaticFiles/GameAssets/waterwheel/index.html new file mode 100644 index 0000000..46ef35e --- /dev/null +++ b/StaticFiles/GameAssets/waterwheel/index.html @@ -0,0 +1,33 @@ + + + + Not Pogo - Perfect Pair Solitaire + + + + + + + + + + + + + + + + + + + + + diff --git a/StaticFiles/GameAssets/waterwheel/sounds/LB_America.au b/StaticFiles/GameAssets/waterwheel/sounds/LB_America.au new file mode 100644 index 0000000..367283b Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/sounds/LB_America.au differ diff --git a/StaticFiles/GameAssets/waterwheel/sounds/LB_Anchor.au b/StaticFiles/GameAssets/waterwheel/sounds/LB_Anchor.au new file mode 100644 index 0000000..d2204de Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/sounds/LB_Anchor.au differ diff --git a/StaticFiles/GameAssets/waterwheel/sounds/LB_Asia.au b/StaticFiles/GameAssets/waterwheel/sounds/LB_Asia.au new file mode 100644 index 0000000..371d263 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/sounds/LB_Asia.au differ diff --git a/StaticFiles/GameAssets/waterwheel/sounds/LB_BoatMoves.au b/StaticFiles/GameAssets/waterwheel/sounds/LB_BoatMoves.au new file mode 100644 index 0000000..0386931 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/sounds/LB_BoatMoves.au differ diff --git a/StaticFiles/GameAssets/waterwheel/sounds/LB_ButtonClick.au b/StaticFiles/GameAssets/waterwheel/sounds/LB_ButtonClick.au new file mode 100644 index 0000000..5ae41d2 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/sounds/LB_ButtonClick.au differ diff --git a/StaticFiles/GameAssets/waterwheel/sounds/LB_CardFlip.au b/StaticFiles/GameAssets/waterwheel/sounds/LB_CardFlip.au new file mode 100644 index 0000000..3be935e Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/sounds/LB_CardFlip.au differ diff --git a/StaticFiles/GameAssets/waterwheel/sounds/LB_Europe.au b/StaticFiles/GameAssets/waterwheel/sounds/LB_Europe.au new file mode 100644 index 0000000..cbe3a02 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/sounds/LB_Europe.au differ diff --git a/StaticFiles/GameAssets/waterwheel/sounds/LB_Flash.au b/StaticFiles/GameAssets/waterwheel/sounds/LB_Flash.au new file mode 100644 index 0000000..9126466 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/sounds/LB_Flash.au differ diff --git a/StaticFiles/GameAssets/waterwheel/sounds/LB_FreeCell.au b/StaticFiles/GameAssets/waterwheel/sounds/LB_FreeCell.au new file mode 100644 index 0000000..a857006 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/sounds/LB_FreeCell.au differ diff --git a/StaticFiles/GameAssets/waterwheel/sounds/LB_HeartGone.au b/StaticFiles/GameAssets/waterwheel/sounds/LB_HeartGone.au new file mode 100644 index 0000000..51dcb4c Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/sounds/LB_HeartGone.au differ diff --git a/StaticFiles/GameAssets/waterwheel/sounds/LB_HeartScore.au b/StaticFiles/GameAssets/waterwheel/sounds/LB_HeartScore.au new file mode 100644 index 0000000..6a3c0ac Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/sounds/LB_HeartScore.au differ diff --git a/StaticFiles/GameAssets/waterwheel/sounds/LB_HomeBase.au b/StaticFiles/GameAssets/waterwheel/sounds/LB_HomeBase.au new file mode 100644 index 0000000..6ddff36 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/sounds/LB_HomeBase.au differ diff --git a/StaticFiles/GameAssets/waterwheel/sounds/LB_KingCard.au b/StaticFiles/GameAssets/waterwheel/sounds/LB_KingCard.au new file mode 100644 index 0000000..ba41e79 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/sounds/LB_KingCard.au differ diff --git a/StaticFiles/GameAssets/waterwheel/sounds/LB_Mismatch.au b/StaticFiles/GameAssets/waterwheel/sounds/LB_Mismatch.au new file mode 100644 index 0000000..a03d520 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/sounds/LB_Mismatch.au differ diff --git a/StaticFiles/GameAssets/waterwheel/sounds/LB_OutOfMoves.au b/StaticFiles/GameAssets/waterwheel/sounds/LB_OutOfMoves.au new file mode 100644 index 0000000..57fcf7d Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/sounds/LB_OutOfMoves.au differ diff --git a/StaticFiles/GameAssets/waterwheel/sounds/LB_PerfectMatch.au b/StaticFiles/GameAssets/waterwheel/sounds/LB_PerfectMatch.au new file mode 100644 index 0000000..7964299 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/sounds/LB_PerfectMatch.au differ diff --git a/StaticFiles/GameAssets/waterwheel/sounds/LB_Reverse.au b/StaticFiles/GameAssets/waterwheel/sounds/LB_Reverse.au new file mode 100644 index 0000000..60d1949 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/sounds/LB_Reverse.au differ diff --git a/StaticFiles/GameAssets/waterwheel/sounds/LB_Russia.au b/StaticFiles/GameAssets/waterwheel/sounds/LB_Russia.au new file mode 100644 index 0000000..037f6fe Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/sounds/LB_Russia.au differ diff --git a/StaticFiles/GameAssets/waterwheel/sounds/LB_Score.au b/StaticFiles/GameAssets/waterwheel/sounds/LB_Score.au new file mode 100644 index 0000000..d1e4e49 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/sounds/LB_Score.au differ diff --git a/StaticFiles/GameAssets/waterwheel/sounds/LB_Score1.au b/StaticFiles/GameAssets/waterwheel/sounds/LB_Score1.au new file mode 100644 index 0000000..4eb0586 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/sounds/LB_Score1.au differ diff --git a/StaticFiles/GameAssets/waterwheel/sounds/LB_Score2.au b/StaticFiles/GameAssets/waterwheel/sounds/LB_Score2.au new file mode 100644 index 0000000..3bd710a Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/sounds/LB_Score2.au differ diff --git a/StaticFiles/GameAssets/waterwheel/sounds/LB_Score3.au b/StaticFiles/GameAssets/waterwheel/sounds/LB_Score3.au new file mode 100644 index 0000000..18e72bf Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/sounds/LB_Score3.au differ diff --git a/StaticFiles/GameAssets/waterwheel/sounds/LB_Score4.au b/StaticFiles/GameAssets/waterwheel/sounds/LB_Score4.au new file mode 100644 index 0000000..9bf83d7 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/sounds/LB_Score4.au differ diff --git a/StaticFiles/GameAssets/waterwheel/sounds/LB_ScoreBonus.au b/StaticFiles/GameAssets/waterwheel/sounds/LB_ScoreBonus.au new file mode 100644 index 0000000..74b499b Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/sounds/LB_ScoreBonus.au differ diff --git a/StaticFiles/GameAssets/waterwheel/sounds/LB_SelectCard.au b/StaticFiles/GameAssets/waterwheel/sounds/LB_SelectCard.au new file mode 100644 index 0000000..7f989b6 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/sounds/LB_SelectCard.au differ diff --git a/StaticFiles/GameAssets/waterwheel/sounds/LB_Spooky.au b/StaticFiles/GameAssets/waterwheel/sounds/LB_Spooky.au new file mode 100644 index 0000000..2220dae Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/sounds/LB_Spooky.au differ diff --git a/StaticFiles/GameAssets/waterwheel/sounds/LB_StartGame.au b/StaticFiles/GameAssets/waterwheel/sounds/LB_StartGame.au new file mode 100644 index 0000000..5653d5e Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/sounds/LB_StartGame.au differ diff --git a/StaticFiles/GameAssets/waterwheel/sounds/LB_Tiki.au b/StaticFiles/GameAssets/waterwheel/sounds/LB_Tiki.au new file mode 100644 index 0000000..2ced82b Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/sounds/LB_Tiki.au differ diff --git a/StaticFiles/GameAssets/waterwheel/sounds/LB_Transition.au b/StaticFiles/GameAssets/waterwheel/sounds/LB_Transition.au new file mode 100644 index 0000000..0b83d34 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/sounds/LB_Transition.au differ diff --git a/StaticFiles/GameAssets/waterwheel/sounds/LB_Undo.au b/StaticFiles/GameAssets/waterwheel/sounds/LB_Undo.au new file mode 100644 index 0000000..8e0762b Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/sounds/LB_Undo.au differ diff --git a/StaticFiles/GameAssets/waterwheel/sounds/silence.au b/StaticFiles/GameAssets/waterwheel/sounds/silence.au new file mode 100644 index 0000000..2ace6b5 Binary files /dev/null and b/StaticFiles/GameAssets/waterwheel/sounds/silence.au differ diff --git a/StaticFiles/JARs/waterwheel-en_US.jar b/StaticFiles/JARs/waterwheel-en_US.jar new file mode 100644 index 0000000..7f0accd Binary files /dev/null and b/StaticFiles/JARs/waterwheel-en_US.jar differ diff --git a/TCPGameServer.cs b/TCPGameServer.cs new file mode 100644 index 0000000..260c9e8 --- /dev/null +++ b/TCPGameServer.cs @@ -0,0 +1,123 @@ +using System.Net.Sockets; +using System.Net; +using Microsoft.VisualBasic; + +namespace NotPogo +{ + public class TCPGameServer(ILogger logger, IConfiguration configuration) : BackgroundService + { + private readonly ILogger _logger = logger; + private readonly IConfiguration _configuration = configuration; + + private int _tcpPort; + + public TcpListener? Listener { get; private set; } + + public static List Clients { get; } = []; + + protected override async Task ExecuteAsync(CancellationToken stoppingToken) + { + _tcpPort = _configuration.GetValue("GameServerPort"); + Listener = new(IPAddress.Any, _tcpPort); + Listener.Start(); + _logger.LogInformation("Game Server Listening On Port {Port}", _tcpPort); + + while (!stoppingToken.IsCancellationRequested) + { + var client = await Listener.AcceptTcpClientAsync(stoppingToken); + _logger.LogInformation("Client Connected: {RemoteEndPoint}", client.Client.RemoteEndPoint); + _ = HandleClientAsync(client); + } + } + + private async Task HandleClientAsync(TcpClient client) + { + using (client) + await using (var stream = client.GetStream()) + { + try + { + while (true) + { + Dictionary received; + try + { + received = await TCPProtocol.ReadMessageAsync(stream); + } + catch (EndOfStreamException) { break; } + + _logger.LogInformation("Received:"); + foreach (var kv in received) + _logger.LogInformation(" {Key} = {Value}", kv.Key, kv.Value); + + if (!received.TryGetValue("msg.op", out var op)) continue; + + if (op == "logn") // Login Request + { + // we know this is a compatible client now so let's add it to the client list + Clients.Add(client); + + // send logn response chain + await SendAsync(stream, ("msg.op", "init"), ("plid", "1"), ("cnid", "1")); // PLID and CNID are placeholder values here + await SendAsync(stream, ("msg.op", "load"), ("rmst", "start")); // indicate the backend is putting you in a room + await SendAsync(stream, ("msg.op", "rm.join"), ("scrn", "standalone"), ("plid", "1")); // SCRN and PLID are placeholder values here (PLID = Room ID?) + await SendAsync(stream, ("msg.op", "gm.crea")); // I don't know what this does but apparently it's required + await SendAsync(stream, ("msg.op", "load"), ("rmst", "end")); // room placement complete + await SendAsync(stream, ("msg.op", "say"), ("chnl", "serv"), ("text", "Welcome to Not Pogo! The best place to go for games and friends!")); // MOTD + await SendAsync(stream, ("msg.op", "say"), ("chnl", "serv"), ("text", "WARNING: This Emulator Is A WIP. Some Things May Not Work As Expected Even With Proper Client Props")); // Alpha Disclaimer + await SendAsync(stream, ("msg.op", "pl.rm.stte"), ("plid", "1"), ("tokb", "9999")); // PLID and TOKB are placeholder values here + _logger.LogInformation("Sent 'logn' Response Sequence"); + } + else if (op == "gm.join") // Room Join Request + { + // send gm.join response chain + await SendAsync(stream, ("msg.op", "gm.join"), ("plid", "1"), ("scrn", "standalone")); // yay more placeholders! + await SendAsync(stream, ("msg.op", "jcfg"), ("jpot", "1234.56"), ("jmlt", "1.0"), ("cap", "4999.0"), ("intv", "10000"), ("incr", "0.01")); // more than likely jackpot config + await SendAsync(stream, ("msg.op", "cnfg"), ("impd", "15")); // placeholder, idk what this is + await SendAsync(stream, ("msg.op", "tokb"), ("tokb", "9999")); // token balance again for whatever reason + await SendAsync(stream, ("msg.op", "gm.lnch")); // more than likely this tells the shell to launch the game + await SendAsync(stream, ("msg.op", "ext.pref"), ("pref", "")); // game preferences + _logger.LogInformation("Sent 'gm.join' Response Sequence (Launches Game)"); + } + else if (op == "ext.over") + { + bool winMet = (received["gm.won"] == "true"); + + if (winMet) + _logger.LogInformation("Jackpot Won!"); + + // send stubbed results + await SendAsync(stream, ("msg.op", "ext.rslt"), ("tokb", "999"), ("tokn.won", "0"), // Token Earnings + ("spin.rslt", winMet ? "1" : "0"), ("spin.tokn", "50"), ("inst.desc", ""), // Jackpot? + ("jpot", "1234.0"), ("pzpm", $"conf={Guid.NewGuid()}"), ("bmlt", "1"), ("bspo", "")); // Jackpot Confirmation Stuff - placeholder + + _logger.LogInformation("Results Sent"); + } + } + } catch (Exception e) { _logger.LogError(e, "Error Handling Client"); } + } + + Clients.Remove(client); + _logger.LogInformation("Client Disconnected"); + } + + static Task SendAsync(NetworkStream stream, params (string key, string value)[] fields) + { + var msg = new Dictionary(); + foreach (var (key, value) in fields) msg[key] = value; + return TCPProtocol.WriteMessageAsync(stream, msg); + } + + public override Task StopAsync(CancellationToken cancellationToken) + { + if(!cancellationToken.IsCancellationRequested) + { + Clients.Clear(); + Listener?.Stop(); + Listener?.Dispose(); + } + + return Task.CompletedTask; + } + } +} diff --git a/TCPProtocol.cs b/TCPProtocol.cs new file mode 100644 index 0000000..6b8e8f1 --- /dev/null +++ b/TCPProtocol.cs @@ -0,0 +1,149 @@ +using Microsoft.AspNetCore.Routing.Constraints; +using Microsoft.AspNetCore.Server.HttpSys; +using System.Net.Sockets; +using System.Text; + +namespace NotPogo +{ + public static class TCPProtocol + { + /// + /// Reverses Pogo XOR Obfucscation And Reads Key Value Pairs From TCP Stream + /// + /// The Stream Associated With The Received Message + /// A Dictionary Containing A Command And Data Pair (Key = Command, Value = Data) + public static async Task> ReadMessageAsync(NetworkStream stream) + { + int len = await ReadUInt16BEAsync(stream); + byte[] payload = await ReadExactAsync(stream, len); + + for (int i = 0; i < payload.Length; i++) + payload[i] = (byte)(payload[i] ^ 0xFF); + + var props = new Dictionary(); + using var ms = new MemoryStream(payload); + while(ms.Position < ms.Length) + { + string key = ReadJavaUtf(ms); + string value = ReadJavaUtf(ms); + props[key] = value; + } + return props; + } + + /// + /// Writes Key Value Pairs To A TCP Stream + /// + /// The Stream You Wish To Write To + /// The Properties You Wish To Write To The Stream + /// The Completed Task + public static async Task WriteMessageAsync(NetworkStream stream, IEnumerable> props) + { + using var payload = new MemoryStream(); + foreach(var kv in props) + { + WriteJavaUtf(payload, kv.Key); + WriteJavaUtf(payload, kv.Value); + } + + byte[] bytes = payload.ToArray(); + for (int i = 0; i < bytes.Length; i++) + bytes[i] = (byte)(bytes[i] ^ 0xFF); + + await WriteUint16BEAsync(stream, (ushort)bytes.Length); + await stream.WriteAsync(bytes); + await stream.FlushAsync(); + } + + private static async Task ReadUInt16BEAsync(NetworkStream stream) + { + byte[] buf = await ReadExactAsync(stream, 2); + return (buf[0] << 8) | buf[1]; + } + + private static async Task ReadExactAsync(NetworkStream stream, int count) + { + if (count < 0) + throw new IOException($"Invalid Frame Length: {count}"); + + byte[] buf = new byte[count]; + int off = 0; + while (off < count) + { + int n = await stream.ReadAsync(buf.AsMemory(off, count - off)); + if (n <= 0) + throw new EndOfStreamException($"Socket Closed Mid-Message ({off}/{count} bytes read)"); + off += n; + } + return buf; + } + + private static string ReadJavaUtf(Stream s) + { + int len = (s.ReadByte() << 8) | s.ReadByte(); + byte[] bytes = new byte[len]; + int off = 0; + + while (off < len) + { + int n = s.Read(bytes, off, len - off); + if (n <= 0) + throw new EndOfStreamException(); + off += n; + } + + var sb = new StringBuilder(); + int i = 0; + while (i < bytes.Length) + { + int c = bytes[i] & 0xFF; + if (c >> 4 <= 7) + { + sb.Append((char)c); + i += 1; + } + else if (c >> 4 == 12 || c >> 4 == 13) + { + sb.Append((char)(c & 0x1F << 6) | (bytes[i + 1] & 0x3F)); + i += 2; + } + else + { + sb.Append((char)((c & 0x0F) << 12) | ((bytes[i + 1] & 0x3F) << 6) | (bytes[i + 2] & 0x3F)); + i += 3; + } + } + return sb.ToString(); + } + + private static async Task WriteUint16BEAsync(NetworkStream stream, ushort length) + { + await stream.WriteAsync(new byte[] { (byte)(length >> 8), (byte)length }); + } + + private static void WriteJavaUtf(Stream s, string str) + { + using var buf = new MemoryStream(); + foreach(char ch in str) + { + if (ch >= 0x001 && ch <= 0x007F) + buf.WriteByte((byte)ch); + else if (ch == 0 || ch > 0x07FF) + { + buf.WriteByte((byte)(0xE0 | ((ch >> 12) & 0x0F))); + buf.WriteByte((byte)(0x80 | ((ch >> 6) & 0x3F))); + buf.WriteByte((byte)(0x80 | (ch & 0x3F))); + } + else + { + buf.WriteByte((byte)(0x0C | ((ch >> 6) & 0x1F))); + buf.WriteByte((byte)(0x80 | (ch & 0x3F))); + } + } + byte[] bytes = buf.ToArray(); + s.WriteByte((byte)(bytes.Length >> 8)); + s.WriteByte((byte)bytes.Length); + s.Write(bytes, 0, bytes.Length); + } + } +} diff --git a/appsettings.Development.json b/appsettings.Development.json new file mode 100644 index 0000000..df518f5 --- /dev/null +++ b/appsettings.Development.json @@ -0,0 +1,10 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*", + "GameServerPort": 11200 +} diff --git a/appsettings.json b/appsettings.json new file mode 100644 index 0000000..df518f5 --- /dev/null +++ b/appsettings.json @@ -0,0 +1,10 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*", + "GameServerPort": 11200 +}