Browse Source

rewrite the info page system almost entirely

tags/1.7.0b
Alison Watson 2 years ago
parent
commit
912d7aa5bf
52 changed files with 1271 additions and 1236 deletions
  1. +3
    -1
      .gitignore
  2. BIN
      pk7/acs/lithmain.bin
  3. +0
    -1
      pk7/keyconf.txt
  4. +156
    -188
      pk7/language.txt
  5. +0
    -232
      pk7/lfiles/BIPInfo.txt
  6. +3
    -3
      source/d_vm.c
  7. +1
    -1
      source/include/gui.h
  8. +12
    -12
      source/include/m_memory.h
  9. +0
    -4
      source/include/m_stab.h
  10. +1
    -0
      source/include/m_str.h
  11. +32
    -59
      source/include/p_bip.h
  12. +1
    -1
      source/include/w_world.h
  13. +10
    -0
      source/m_str.c
  14. +76
    -250
      source/p_bip.c
  15. +0
    -2
      source/p_data.c
  16. +194
    -161
      source/p_gui_bip.c
  17. +2
    -2
      source/w_time.c
  18. +6
    -6
      source/w_world.c
  19. +254
    -0
      text/Info.txt
  20. +1
    -1
      text/Monsters.txt
  21. +0
    -1
      text/Text.txt
  22. +2
    -5
      text/en/Info.txt
  23. +141
    -0
      text/en/Info/Jem/Mail.txt
  24. +0
    -1
      text/en/Info/Jem/Weapons.txt
  25. +68
    -0
      text/en/Info/Mail.txt
  26. +145
    -0
      text/en/Info/Stan/Mail.txt
  27. +13
    -0
      text/en/Info/Weapons.txt
  28. +1
    -1
      text/en/Log.txt
  29. +0
    -87
      text/en/Mail.txt
  30. +0
    -16
      text/en/Mail/Jem/Cluster1.txt
  31. +0
    -15
      text/en/Mail/Jem/Cluster2.txt
  32. +0
    -9
      text/en/Mail/Jem/Cluster3.txt
  33. +0
    -29
      text/en/Mail/Jem/Intro.txt
  34. +0
    -9
      text/en/Mail/Jem/Intro2.txt
  35. +0
    -1
      text/en/Mail/Jem/Secret1.txt
  36. +0
    -1
      text/en/Mail/Jem/Secret2.txt
  37. +0
    -11
      text/en/Mail/Phantom/Isaac.txt
  38. +0
    -9
      text/en/Mail/Phantom/James.txt
  39. +0
    -9
      text/en/Mail/Phantom/Makarov.txt
  40. +0
    -7
      text/en/Mail/Stan/Cluster1.txt
  41. +0
    -6
      text/en/Mail/Stan/Cluster2.txt
  42. +0
    -6
      text/en/Mail/Stan/Cluster3.txt
  43. +0
    -40
      text/en/Mail/Stan/Intro.txt
  44. +0
    -15
      text/en/Mail/Stan/Intro2.txt
  45. +0
    -3
      text/en/Mail/Stan/Secret1.txt
  46. +0
    -1
      text/en/Mail/Stan/Secret2.txt
  47. +0
    -6
      text/en/Mail/Template.txt
  48. +19
    -19
      text/en/Misc/UI.txt
  49. +1
    -1
      text/jp/Log.txt
  50. +10
    -2
      tools/genbuild.rb
  51. +117
    -0
      tools/infc.rb
  52. +2
    -2
      tools/wepc.rb

+ 3
- 1
.gitignore View File

@@ -8,10 +8,12 @@ master/*
*.wad.b*
*.swp
*.ninja*
source/include/p_bipname.h
source/include/p_weapons.h
source/include/u_func.h
source/include/u_names.h
source/include/p_weapons.h
source/include/w_moninfo.h
source/p_bipinfo.c
source/p_upgrinfo.c
source/p_weaponinfo.c
gzdoom-crash.log

BIN
pk7/acs/lithmain.bin View File


+ 0
- 1
pk7/keyconf.txt View File

@@ -38,7 +38,6 @@ alias __lith_triggerboss "pukename Lith_TriggerBoss %1 %2 %3"
alias __lith_giveexp "pukename Lith_EmitEXP %1"
alias __lith_givescr "pukename Lith_GiveScore %1"
alias __lith_givediscount "pukename Lith_Discount"
alias __lith_givemail "pukename Lith_GiveMail %1"
alias __lith_givemeallofthescore "pukename Lith_GiveMeAllOfTheScore"

alias __lith_dumpmem "pukename Lith_DumpAlloc"


+ 156
- 188
pk7/language.txt View File

@@ -462,6 +462,63 @@
"LITH_INFO_SHORT_CBIUpgr2" = "S. High-Grade CPU";
"LITH_INFO_TITLE_CBIUpgr2" = "$LITH_CBI_CPU3";
"LITH_INFO_DESCR_CBIUpgr2" = "The BC-0265 is a marvel of modular C/B Interface technology, not bigger than any standard CPU and capable of so, so much more. It comes equipped with 150TiB of RAM, 70Pr without any dangerous overclocking, and 4906 physical cores.\n\nDeveloped solely for military use, the BC-0265 has gone through vigorous field testing and many trials, and now you wield the result of those efforts.\n\nDespite only having 3 billion neurons, not much more than high-grade CPUs, the quality of each is much higher, being able to withstand much more precise data transfer through high density synapses and storage in each cell.";
"LITH_INFO_TITLE_MIntroJem" = "Saved Message";
"LITH_INFO_REMOT_MIntroJem" = "<hidden>@corp.AOF";
"LITH_INFO_SSIZE_MIntroJem" = "36";
"LITH_INFO_DESCR_MIntroJem" = "l[]];;\cg444444\cj41414191918 --------\cm// Copyright (C) 905 A.O.F I---[[119-`\n\cm// sio.c basic screen inp-1[3\\4[`pk;\n\cm#include <kernel_display.h>\n\n\cmint scr_blit(char ************* {\n\cm int ret = ERR_NONE;\n\cm __asm(\"push $4049CB617144\\n\\t\"<<\n\cd>>>>>[[[[datastream corruption detected]]]]\n\cd>>>>>[[[[reloading mail daemon]]]]\n\nThe following procedures have been activated:\n- Destroy IV on target 7F44\n- Destroy V on target 7F45\n- Destroy V on target 7F46\n- Directive 90 on target 7F47\n\nThe following permissions have been granted:\n- Mateba R119 Pistol\n- NV48 12-Gauge Shotgun\n- SYM4.3 D.22 MODEL M SUBMACHINE GUN\n- Bishop\n- Information 400\n- Information 402\n\n\chSIGNATURE 0x44190519FBCAD2903 CONFIRMED\n\chDISCARDING MESSA[[[[[\n\cd>>>>>[[[[datastream corruption detected]]]]\n\cd>>>>>[[[[auto-saving buffer]]]]\n\cd>>>>>[[[[reloading mail daemon]]]]";
"LITH_INFO_TITLE_MCluster1Jem" = "Saved Text 104";
"LITH_INFO_REMOT_MCluster1Jem" = "$LITH_MAIL_INTERNAL";
"LITH_INFO_SSIZE_MCluster1Jem" = "30";
"LITH_INFO_DESCR_MCluster1Jem" = "l[]];;\cg444444\cj41414191918 --------\n\cm scr_exec(SCR_FINISH, 0, NULL);\n\cmdone:\n\cm return 0;\n\cm}\n\cm]]]]]]]]]]EOF\n\cd>>>>>[[[[datastream corruption detected]]]]\n\cd>>>>>[[[[reloading mail daemon]]]]\n\nNotes:\n\n40 thousand lines dumped so far, maybe 30-40% done? Estimated total ~200k SLoC\nROM is about half C source, quarter XMb5 using SKVM, the rest is scripts\nImportant bits already dumped, the custom lock remover does not skimp on anything\n\nNext goal while this continues decompiling is to find all active AOF hostnames and block them, the main servers are already deactivated but there might be more. Rerouting to other active companies' addresses has helped clear my mind.";
"LITH_INFO_TITLE_MCluster2Jem" = "Saved Text 152";
"LITH_INFO_REMOT_MCluster2Jem" = "$LITH_MAIL_INTERNAL";
"LITH_INFO_SSIZE_MCluster2Jem" = "36";
"LITH_INFO_DESCR_MCluster2Jem" = "l[]];;\cg444444\cj41414191918 --------\n\cm io_buf_get 0x1C, fp, out;\n\cm string_explode out, bufs, bufs_num = bufs.length / 8;\n\cm for(i in (iter 0, bufs_num)) {{{\n\cm 9339mv__word_of]]q]qq]qq]]]]]]]````````\\\\\\\\\\\\\\\\<<\n\cd>>>>>[[[[datastream corruption detected]]]]\n\cd>>>>>[[[[reloading mail daemon]]]]\n\nIt's all gone now. I'm glad I was smarter than to assume I was going insane, though now I wonder what the other deceivers must have gone through.\n\nThe core of hell is still far yonder, but yet my body trembles in its sheer horror... Maybe I'll make it out alive if I'm lucky, but I should at least try.\n\nThe kernel and ROM etc. sources are all done dumping, the utilities are still going but those aren't important and have already been scanned for ASIC code.\n\nProc. analysis has been done on all of the dumped code, revealing many unoptimized code paths, ASIC crap, and a few red herrings. Not careful enough for technology that could easily exist two years after this was developed.";
"LITH_INFO_TITLE_MCluster3Jem" = "Saved Text 244";
"LITH_INFO_REMOT_MCluster3Jem" = "$LITH_MAIL_INTERNAL";
"LITH_INFO_SSIZE_MCluster3Jem" = "28";
"LITH_INFO_DESCR_MCluster3Jem" = "I've entered a strange realm that doesn't seem to make sense. This must really be Hell itself; no mistaking it now.\n\nThe air is so humid and hot that I've begun sweating. That can't happen. I can't sweat. There isn't anything to sweat. I'm scared. This has to be an illusion... or does reality not matter in this place?\n\nIn any case, now that I'm here, there's no turning back. I have to destroy whatever corrupted them, I'm sure they're here... I saw it in their eyes, they were yelling at me visions of their true selves that could not be described with human eyes. That only I could know.\n\nThough my mind had just been regained, now sanity may lie out of my hands.\n\nIt doesn't matter. I will see this through.";
"LITH_INFO_TITLE_MPhantomJem" = "$LITH_MAIL_NOTITLE";
"LITH_INFO_REMOT_MPhantomJem" = "order@corp.AOF";
"LITH_INFO_DESCR_MPhantomJem" = "\cg*** This is a global warning to all deceivers: If you are reading this, you are already being tracked and will be executed on sight. ***\n\n\cg====================================\n\n\cgWe have confirmed that three of you have been absorbed (see Dark Realm Properties c. 115C) and two have been executed. We will not stop until the remaining two are confirmed dead or incapacitated.\n\n\cgYou will not get away with this intrepid game.\n\n\cg - \cnOrder";
"LITH_INFO_TITLE_MSecret1Jem" = "Saved Text 250";
"LITH_INFO_REMOT_MSecret1Jem" = "$LITH_MAIL_INTERNAL";
"LITH_INFO_DESCR_MSecret1Jem" = "Another facet of this place, where does it end? I must destroy this place, the evil energy is overflowing here... and this architecture gives me bad vibes.";
"LITH_INFO_TITLE_MSecret2Jem" = "Saved Text 252";
"LITH_INFO_REMOT_MSecret2Jem" = "$LITH_MAIL_INTERNAL";
"LITH_INFO_DESCR_MSecret2Jem" = "Here seems to be the end of this terrifying compartment of Hell. I'd better blaze through this one.";
"LITH_INFO_TITLE_MIntroStan" = "Saved Message";
"LITH_INFO_REMOT_MIntroStan" = "ALambert@corp.OFMD";
"LITH_INFO_SSIZE_MIntroStan" = "77";
"LITH_INFO_DESCR_MIntroStan" = "Your weapons have been deployed to various locations we were able to send other people to. Do take care of them, acquiring the correct armaments for your job was quite expensive and now we've probably lost a few people.\n\nBesides being deployed with your pistol and combat knife (as you requested), you have been sent these five weapons:\n\n1. A combat-modified military model Hiku Mk.2 Shotgun, manufactured by Omakeda.\n> This weapon was chosen because it has a powerful plasma shot that can\n> penetrate the demons' armour. Besides this, it has low recoil and an easy\n> to handle pump-action loading system. It has hopefully been deployed to\n> the most convenient location you shall come across.\n\n2. An AllPoint 75-b Assault Rifle.\n> You shall be fighting hordes of lower ranking demons and un-dead which are\n> quite vulnerable to small arms fire and explosives, so naturally this gun\n> was our first choice. Equipped with a box magazine and inbuilt grenade\n> launcher, capable of eliminating most lower tier threats.\n\n3. A Grenade Launcher, manufactured by Sym 4.3.\n> With this, you can completely obliterate larger targets and crowds of\n> demons. Unfortunately, due to its weight, we were not able to get it in\n> any convenient location.\n\n4. An AllPoint 68-n Plasma Rifle.\n> This weapon does extreme damage to anything living, but some of the tougher\n> demons seem to mitigate its damage. Regardless, it has been sent to you\n> because it can shred through demons with high rank.\n\n5. The Omega Cannon.\n> I myself am not sure why high order would bother giving you such an\n> expensive and dangerous piece of equipment, but you must have been sent\n> this artifact for the purpose of destroying *something*.\n\n6. A KSKK Utsu-denka-sou assault bracelet.\n> A weapon that may prove useful against weak and strong enemies alike, it's\n> been sent to an unknown location, unfortunately. Don't be tricked by the\n> appearance of it. Even if it just looks like a fancy bracelet, it is capable\n> of outputting several tons of weight out your fist.\n\nYou will also be able to purchase the weapons you designated, in your words, as \"must-have\" in the Shop. I warn you that these weapons may not be as effective as you think; we spent quite a lot of time making sure that the arms we sent you were top-notch.\n\nLambert out. Good luck, Blazkowicz.";
"LITH_INFO_TITLE_MCluster1Stan" = "$LITH_MAIL_NOTITLE";
"LITH_INFO_REMOT_MCluster1Stan" = "ALambert@corp.OFMD";
"LITH_INFO_DESCR_MCluster1Stan" = "An explosion of some sort just happened nearby, it seems that the demons are reconstructing the world around you. You would best be careful not to trigger any other, er, events.\n\nEnough of those and the whole world around you might collapse!\n\nYou've been making good progress so far. Your military superiors seem to be considering giving you a promotion, even.\n\nLambert out.";
"LITH_INFO_TITLE_MCluster2Stan" = "$LITH_MAIL_NOTITLE";
"LITH_INFO_REMOT_MCluster2Stan" = "ALambert@corp.OFMD";
"LITH_INFO_DESCR_MCluster2Stan" = "There has been a change of plans going down the whole chain of command.\n\nYour status as a military operative is now canceled, and you are to enter a full-on suicide mission funded by OFMD alone.\n\nThere is an artifact nearby that we have sent you. Once it is in your possession, immediately destroy it, and you will be transported to a city somewhere in Hell. Command will await afterwards.\n\nLambert out.";
"LITH_INFO_TITLE_MCluster3Stan" = "Saved Text 244";
"LITH_INFO_REMOT_MCluster3Stan" = "$LITH_MAIL_INTERNAL";
"LITH_INFO_DESCR_MCluster3Stan" = "Now that you have entered the city, you m\\\\r-3434[[\n\cgSYSTEM ERROR 0x4E4943456A6F6244554D42415353\n\cd>>>>>[[[[procedure resetting terminal]]]]\n\cd>>>>>[[[[status: heap corrupted]]]]\n\cd>>>>>[[[[error handler malfunction error]]]]\n\cd>>>>>[[[[failure to proceed]]]]";
"LITH_INFO_TITLE_MPhantomStan" = "$LITH_MAIL_NOTITLE";
"LITH_INFO_REMOT_MPhantomStan" = "htic0@gov.<hidden>.mailserv";
"LITH_INFO_SSIZE_MPhantomStan" = "77";
"LITH_INFO_DESCR_MPhantomStan" = "Hello, it has been forwarded to me that your Computer/Brain Interface hardware was not properly upgraded for this mission. I've had several communications errors with your secondary employers, and it is truly starting to get annoying.\n\nDue to failure to communicate with OFMD, I've taken it upon myself to send your hardware upgrades through several proxy agents.\n\nThey may all be dead now. I have no idea, really. Hopefully you will survive whatever they didn't. Anyways, as for the important part of this message, here is a list of all the hardware that has been sent:\n\nTwo CPU/RAM upgrade packages. The first one is a powerful BC-0265 processor and 500TiB of RAM. Unfortunately, something horrible appears to have happened to the agent carrying it, and so a secondary package has been sent, containing temporary replacements: a Z6808 and 100TiB of RAM.\n\nOne Armor Interface. A PCB and a set of emplacements on your armor.\n\nOne Weapon Modification Device, as its name implies.\n\nOne Weapon Refactoring Device, which can perform large modifications on guns.\n\nSee you.";
"LITH_INFO_TITLE_MSecret1Stan" = "Saved Buffer";
"LITH_INFO_REMOT_MSecret1Stan" = "$LITH_MAIL_INTERNAL";
"LITH_INFO_DESCR_MSecret1Stan" = "This place stinks of rotten flesh! I wonder what's going on here, these blue walls sure seem out of place for Hell...\n\nPerhaps some sinners are waiting to eat my rockets!";
"LITH_INFO_TITLE_MSecret2Stan" = "Saved Buffer";
"LITH_INFO_REMOT_MSecret2Stan" = "$LITH_MAIL_INTERNAL";
"LITH_INFO_DESCR_MSecret2Stan" = "Now I've done it, this place just keeps going deeper and getting weirder... Damn, it's getting hot in here! Better turn up the heat some more.";
"LITH_MAIL_TEMPLATE" = "\cd>>>>>[[[[RELAYING MESSAGE]]]]\n\n\cd> Remote: <\cj%s\cd>\n\cd> Date: \cj%s";
"LITH_MAIL_INTERNAL" = "<internal>";
"LITH_MAIL_NOTITLE" = "<title omitted>";
"LITH_INFO_REMOT_MJamesDefeated" = "jam0s@g0n0j0t00.1025";
"LITH_INFO_DESCR_MJamesDefeated" = "\ccI woke in a \cudark place\cc, unsure of my fate; if my life was renewed out of cruel retribution or of a final opportunity.\n\n\ccI wandered this hell, more real and yet more dream-like than I thought possible, seeking any sign of escape; any sign of pity from the monsters that inhabit this place.\n\n\ccNo, the fate of the damned is but this.\n\n\ccI can only guess that my family went to Heaven and that I was left the lone sinner.\n\n\cgThank you for putting this to an end.";
"LITH_INFO_REMOT_MMakarovDefeated" = "mak666v@org.r\\.\\\\\\-";
"LITH_INFO_DESCR_MMakarovDefeated" = "There aren't many like you who can take such a being down. Maybe I should commend you for that, struggler.\n\nNo, there is no need. What your victories have done is enough.\n\n\cgMaybe I advise you turn back.\n\n\crI am not the strongest of these manifestations.\n\nMaybe you don't need such advice.";
"LITH_INFO_REMOT_MIsaacDefeated" = "isaac@syn.400khz";
"LITH_INFO_DESCR_MIsaacDefeated" = "\caOne shan't care what he shoots, but one may take care in where he treads.\n\n\ca And I think that you've treaded\n\cr a bit too far.\n\n\ca Perhaps just me.\n\ca Or maybe you agree?\n\n\ca Here is a gift.\n\n\ca I won't tell you to use it wisely.";
"LITH_INFO_SHORT_AetosVi" = "Aetos Vi";
"LITH_INFO_TITLE_AetosVi" = "$LITH_INFO_SHORT_AetosVi";
"LITH_INFO_DESCR_AetosVi" = "A planetary system 17 lightyears away from Earth that houses several planets with sentient life on them. Found approximately 700 years ago now, this is the second system reached by humans, and the first with sentient life.\n\nWhen the system was found, rejoice was had throughout all mankind, finally knowing that they weren't alone in the universe.\n\nThen, of course, the expeditioners were attacked by natives. But that's fine details.";
@@ -540,76 +597,6 @@
"LITH_INFO_SHORT_Magic" = "$LITH_UPGRADE_TITLE_Magic";
"LITH_INFO_TITLE_Magic" = "Mana Absorber";
"LITH_INFO_DESCR_Magic" = "A small device reminiscent of a landmine which attaches to a chestplate, pauldron or shoulder pad, which uses an unknown \ckFlavum\c- mode spell that captures energy from the dead and dying.\n\nUsing this method, it uses hostility detection to find potential sources of mana, and upon that source losing metaphysical structure, siphons all mana from it with approximately 73.416% efficiency.";
"LITH_INFO_SHORT_P114" = "Project 114";
"LITH_INFO_TITLE_P114" = "$LITH_INFO_SHORT_P114";
"LITH_INFO_DESCR_P114" = "Project 114 is the current military operation you are enacting. Started by a pact between OFMD, KSKK and your country's military, Project 114 aims to destroy the dimension known as Hell, which is currently invading our own.\n\nAs of writing, only 3 of the 8 operatives sent in remain. Two robots, and yourself. You are to act as the point man and only main force against the threat. Failing that, you are to help open a pathway to the core of Hell for other operatives to complete the mission with.\n\nYour advisor is Adam Lambert, and 11 generals currently oversee his and your actions on the field.";
"LITH_INFO_SHORT_OPD2" = "Op. D2";
"LITH_INFO_TITLE_OPD2" = "Operation Deception 2";
"LITH_INFO_DESCR_OPD2" = "After seven years of planning, Operation Deception 2 has finally gone underway. Along with Michael, Zeke, Solomon, and three others, we are finally setting ourselves free.\n\nI wasn't expecting Solomon of all people, part of Order, to be the one to mastermind this, but here we are, years later, finally doing it.\n\nNot to be pessimistic, but I don't think any of us will survive this. It's just statistically impossible. Even I may die. There are assassins after us and now we're in Hell itself.\n\nI'll need a Theophylline supplement after this is over.";
"LITH_INFO_SHORT_Info400" = "Information 400";
"LITH_INFO_TITLE_Info400" = "$LITH_INFO_SHORT_Info400";
"LITH_INFO_DESCR_Info400" = "\ciTHIS DOCUMENT IS CONFIDENTIAL, DELETE AFTER READING\n\nONE (1) Mateba R119 Pistol [INSPECTION PASSED]\n[[[[[[[[[[[[[\n\cd>>>>>[[[[datastream corruption detected]]]]\n\cd>>>>>[[[[attempting reconnect]]]]\n\nONE (1) NV48 12-Gauge Shotgun\nROUNDS: ,<<,124147\n\cd>>>>>[[[[datastream corruption detected]]]]\n\cd>>>>>[[[[attempting reconnect]]]]\n\nThe latter two have been located within the combat area and will be available there. Th[[[ // kerne __ -\n\cd>>>>>[[[[datastream corruption detected]]]]\n\cd>>>>>[[[[attempting reconnect]]]]\n\cd>>>>>[[[[attempting reconnect]]]]\n\cd>>>>>[[[[attempting reconnect]]]]\n\cd>>>>>[[[[connection failed after 3 retries]]]]";
"LITH_INFO_SHORT_Info402" = "Information 402";
"LITH_INFO_TITLE_Info402" = "$LITH_INFO_SHORT_Info402";
"LITH_INFO_DESCR_Info402" = "\cd>>>>>[[[[warning: translation service unavailable, sending verbatim]]]]\n\ciTHIS DOCUMENT IS CONFIDENTIAL, DELETE AFTER READING\n\n\cgDEFINITION FOR \"Directive 90\" IS AS FOLLOWS\nYe wbjtv w's t' gaathr est Demonic Energy via est prrts 7F47 ssu. D 't by an ms dst est Demon tati, f' w's pr w's vt t' wr msn. C ye cmp th's msn, ye il w's rd 10,000,000scr p'Demon Energy unit. Demon Energy unit tati w's prrts t' ssu. Th dcct w's t' w's dst tkt w's n.\n\n\cgDEFINITION FOR \"Target 7F47\" IS AS FOLLOWS\n7F47 w's est Demon tati & est Phantom. D 't dst,. Pnss w's * awt :: ye dost.\n\n\cgOrder.";
"LITH_INFO_SHORT_HackInfo" = "ZCLR README";
"LITH_INFO_TITLE_HackInfo" = "Zeke's Custom Lock Remover";
"LITH_INFO_SSIZE_HackInfo" = "44";
"LITH_INFO_DESCR_HackInfo" = "Welcome to Zeke's Custom Lock Remover, version 1.0. Well, there won't be any other versions anyway, but here we are. If you're reading this, that means it worked, and the kernel has been successfully jailbroken. I couldn't brief you on this beforehand, but now that we have some privacy, here's what this thing can do:\n\nSo, running our own code is too risky, as you know. The ASIC would catch it right away. But what we can do is get the kernel to execute code for us, specifically when it's already in ring 0. Well, you may have noticed Solomon's name in the mission parameters looked a bit off. Since he was the instructor, we set his name to overflow a certain buffer during a kernel call, overflowing straight into a function pointer. Just point that right next to the fixed address, and bam. Kiloword boundaries give us plenty of space to write a self-modifying program in that padding space.\n\nThis also included some other vital parts besides the lock remover and the decompiler, mainly the graphics for your weapon materializers. (Sorry they don't look so great, the raw optic nerve image format is rather large.) The generational program will within a few minutes give you a working decompiler and within half an hour it'll be ready to start going at the ROM sources. From there it'll embed itself into the ROM and your mind will have fully returned to you by the end of the day.\n\nNow, what it can't do: Get rid of the ASIC chip. You will have to be careful not to trip it, but for the most part, it just doesn't have permissions to track anything we're doing. You should be able to mitigate it in a few ways since this program removes all of the hooks in the kernel that call into it, but you'll have to do them yourself. I'm sure you can. Good luck. Zeke.";
"LITH_INFO_SHORT_BIP" = "B.I.P.";
"LITH_INFO_TITLE_BIP" = "Biotic Information Panel (B.I.P.)";
"LITH_INFO_DESCR_BIP" = "The Biotic Information Panel, or B.I.P. (sometimes \"BIP,\") is a program written in portable C150 which gathers information from local area networks on various subjects. When it is triggered to look up a subject, it also looks for relevant information either related to or mentioned by the subject.\n\nThe program is extremely popular because of its simple, yet useful, function. It is distributed freely by the Software Sans Pretium Foundation, and the software is included in most C/B operating system bases.\n\nThe latest version of the software is 2.5, and since version 2.0 it has had automatic update functionality.";
"LITH_INFO_SHORT_CBIBase" = "C/B I";
"LITH_INFO_TITLE_CBIBase" = "Computer/Brain Interface (C/B I)";
"LITH_INFO_DESCR_CBIBase" = "One of the biggest advancements in technology over the past thousand years, a Computer/Brain Interface, or C/B I (sometimes \"CBI,\") is an interface between a human brain and a computer. Usually installed within the skull and the brain, as well as in other areas of the central nervous system, a C/B I is a machine with almost infinite uses.";
"LITH_INFO_SHORT_CBIStan" = "$LITH_INFO_SHORT_CBIBase";
"LITH_INFO_TITLE_CBIStan" = "$LITH_INFO_TITLE_CBIBase";
"LITH_INFO_DESCR_CBIStan" = "#LITH_INFO_DESCR_CBIBase\n\nComputer/Brain Interfaces are not classified as prosthetics, only enhancements, as they do not replace any part of the body and only add onto it. The C/B I currently installed is a self-servicing military model.";
"LITH_INFO_SHORT_CBIJem" = "$LITH_INFO_SHORT_CBIBase";
"LITH_INFO_TITLE_CBIJem" = "$LITH_INFO_TITLE_CBIBase";
"LITH_INFO_DESCR_CBIJem" = "#LITH_INFO_DESCR_CBIBase\n\nWhile Computer/Brain Interfaces are not usually classified as prosthetics, the one currently installed is due to extensive bodily restructuring done to the user.";
"LITH_INFO_SHORT_CBIAri" = "$LITH_INFO_SHORT_CBIBase";
"LITH_INFO_TITLE_CBIAri" = "$LITH_INFO_TITLE_CBIBase";
"LITH_INFO_DESCR_CBIAri" = "#LITH_INFO_DESCR_CBIBase\n\nThe currently installed Computer/Brain Interface is not known by this system. Please file a report on the Software Sans Pretium bug tracker and attach info about your interface to get it added to the descriptions list.";
"LITH_INFO_SHORT_AttrACC" = "Accuracy";
"LITH_INFO_TITLE_AttrACC" = "\cgAccuracy\c- (ACC)";
"LITH_INFO_DESCR_AttrACC" = "Accuracy is your overall ability to hit your target in just the right spots for maximum damage. A trained marksman and an experienced marksman have a vital difference - one knows how to hit a target, and the other knows how to kill one.\n\nLeveling up in accuracy will increase damage dealt to enemies.";
"LITH_INFO_SHORT_AttrDEF" = "Defense";
"LITH_INFO_TITLE_AttrDEF" = "\ciDefense\c- (DEF)";
"LITH_INFO_DESCR_AttrDEF" = "Defense is your ability to efficiently armor yourself and mitigate damage taken when hit. A smart armorer knows just where to apply Kevlar, and where to make slight dodges when fired upon.\n\nLeveling up in defense will decrease all damage taken.";
"LITH_INFO_SHORT_AttrSTRHuman" = "Strength";
"LITH_INFO_TITLE_AttrSTRHuman" = "\ckStrength\c- (STR)";
"LITH_INFO_DESCR_AttrSTRHuman" = "Strength is your toughness and vigor, the thickness of your skin and the blood beating from your heart. One with plentiful strength not only has a long life, but is also said to have a long afterlife.\n\nLeveling up in strength will increase your health capacity.";
"LITH_INFO_SHORT_AttrSTRRobot" = "$LITH_INFO_SHORT_AttrSTRHuman";
"LITH_INFO_TITLE_AttrSTRRobot" = "$LITH_INFO_TITLE_AttrSTRHuman";
"LITH_INFO_DESCR_AttrSTRRobot" = "Strength is your toughness and vigor, the thickness of your casing and the plasma beating from your heart. One with plentiful strength not only has a long service time, but is also said to have a short maintenance time.\n\nLeveling up in strength will increase your health capacity.";
"LITH_INFO_SHORT_AttrSTRNonHuman" = "$LITH_INFO_SHORT_AttrSTRHuman";
"LITH_INFO_TITLE_AttrSTRNonHuman" = "$LITH_INFO_TITLE_AttrSTRHuman";
"LITH_INFO_DESCR_AttrSTRNonHuman" = "Strength is your toughness and vigor, the thickness of your epidermis and the oils beating from your heart. One with plentiful strength not only has a long life, but is also said to have a long afterlife.\n\nLeveling up in strength will increase your health capacity.";
"LITH_INFO_SHORT_AttrVIT" = "Vitality";
"LITH_INFO_TITLE_AttrVIT" = "\cdVitality\c- (VIT)";
"LITH_INFO_DESCR_AttrVIT" = "Vitality is your reaction to medicine and ability to heal, the strength of your vessels and nerves, and the ability to stay alive. Your vital systems are not only stronger, but heal quicker and are less likely to break down.\n\nLeveling up in vitality will increase health pickup gains.";
"LITH_INFO_SHORT_AttrPOT" = "Potency";
"LITH_INFO_TITLE_AttrPOT" = "\cdPotency\c- (POT)";
"LITH_INFO_DESCR_AttrPOT" = "Potency is your reaction to and ability to apply medicine, the strength of your vessels and nerves, and the ability to stay alive. Your innards are not only stronger, but can be healed more quickly and are more likely to stay working.\n\nLeveling up in potency will increase health pickup gains.";
"LITH_INFO_SHORT_AttrSTM" = "Stamina";
"LITH_INFO_TITLE_AttrSTM" = "\chStamina\c- (STM)";
"LITH_INFO_DESCR_AttrSTM" = "Stamina is your ability to keep going even through rough times, through being torn to bits and running for miles upon miles. Stamina keeps you going, even if only little by little, and lets you stay that way.\n\nLeveling up in stamina will regenerate your health up to its level.";
"LITH_INFO_SHORT_AttrREP" = "Repair";
"LITH_INFO_TITLE_AttrREP" = "\chRepair\c- (REP)";
"LITH_INFO_DESCR_AttrREP" = "Repair is your ability to self-repair and continue working, through being torn to bits and moving through extreme distances. Repair keeps you going, even if only little by little, and lets you stay that way.\n\nLeveling up in repair will regenerate your health up to its level.";
"LITH_INFO_SHORT_AttrREG" = "Regeneration";
"LITH_INFO_TITLE_AttrREG" = "\chRegeneration\c- (REG)";
"LITH_INFO_DESCR_AttrREG" = "Regeneration is your ability to self-synthesize and keep going even through rough times, through being torn to bits and running through hell. Regeneration keeps you going, even if only little by little, and lets you stay that way.\n\nLeveling up in regeneration will regenerate your health up to its level.";
"LITH_INFO_SHORT_AttrLUK" = "Luck";
"LITH_INFO_TITLE_AttrLUK" = "\ctLuck\c- (LUK)";
"LITH_INFO_DESCR_AttrLUK" = "Luck is your undeniable charm and fortune, the ability to just get lucky. Your Score rockets a bit faster than usual, being such a lucky chap.\n\nLeveling up in luck will multiply score gained randomly.";
"LITH_INFO_SHORT_AttrRGE" = "Rage";
"LITH_INFO_TITLE_AttrRGE" = "\cmRage\c- (RGE)";
"LITH_INFO_DESCR_AttrRGE" = "Rage is not just your anger, but your adaptability. As you get hit, your reflexes kick in, and you go crazy. You become more accurate, hit harder and get angrier as your situation dims.\n\nLeveling up in rage will multiply damage dealt to enemies when you're hit.";
"LITH_INFO_SHORT_AttrCON" = "Concentration";
"LITH_INFO_TITLE_AttrCON" = "\cmConcentration\c- (CON)";
"LITH_INFO_DESCR_AttrCON" = "Concentration is your ability to focus energy during bursts of mana absorption into your very senses.\n\nLeveling up in concentration will multiply damage dealt when you gain mana.";
"LITH_INFO_SHORT_CFist" = "Mana Siphon";
"LITH_INFO_SHORT_Mateba" = "Mateba";
"LITH_INFO_TITLE_Mateba" = "Mateba R119";
@@ -693,6 +680,15 @@
"LITH_INFO_TITLE_Cercle" = "\cdPeccarentur Ex\c-, \cgRussorum\c- 7";
"LITH_INFO_SSIZE_Cercle" = "28";
"LITH_INFO_DESCR_Cercle" = "The 7th method of the \cgRussum\c- mode, the \"Circle of the Dead.\" An awesome attack which takes all of one's metaphysical strength to use, one of the strongest attacks that can be used by spellcasters without external help. It has been used quite frequently in the final, deciding battles of wars to completely obliterate entire squadrons of men.\n\nPeccarentur is completed instantaneously with time flow manipulation. However, to the person casting it, all of the details of the attack are clearly visible. It is prophecized that such manipulation may eventually cause some kind of catastrophe, but no proof of this has ever actually been provided.\n\nThis method was created on accident as a first-century researcher was experimenting with \cgRussum\c- sigils. The attack was powerful enough to accidentally murder all of the housemaids in their mansion and several wild animals in their garden, however it did no damage to their property.";
"LITH_INFO_SHORT_ChargeFist" = "Charge Fist";
"LITH_INFO_TITLE_ChargeFist" = "Utsu Denkasou Assault Bracelet";
"LITH_INFO_DESCR_ChargeFist" = "A powerful melee weapon which attaches to the left wrist. Uses energy from a cybernetic power source to condense weight and force into super-destructive punches.";
"LITH_INFO_SHORT_MissileLauncher" = "Missile Launcher";
"LITH_INFO_TITLE_MissileLauncher" = "X-400 Lance-missiles";
"LITH_INFO_DESCR_MissileLauncher" = "Have you ever wanted a weapon that fires 2,100 missiles a minute? Don't lie to me, I know you have. This weapon delivers.\n\nThe miniature missiles the X-400 launches are medium-yield, they won't hit as hard as regular fare, but they will pack quite a punch with the rate you can put them out.\n\nHas an internal revolving chamber that holds 30 rockets, fired in trios as the cylinder revolves. New ammunition can be loaded by shoving it carefully into the underside of the gun, similar to a shotgun, thanks to a convenient automatic rotation as it detects newly loaded missiles.";
"LITH_INFO_SHORT_PlasmaDiffuser" = "Plasma Diffuser";
"LITH_INFO_TITLE_PlasmaDiffuser" = "SYM4.3 D.640 PLASMA DIFFUSER";
"LITH_INFO_DESCR_PlasmaDiffuser" = "A weapon which works similarly to the 68-n Plasma Rifle, however preferring damage over rate of fire. The D.640's design comes from several older models designed by MDDO, as well as newer components patented by Semaphore Inc.";
"LITH_INFO_SHORT_Fist" = "Knife";
"LITH_INFO_SHORT_Pistol" = "Pistol";
"LITH_INFO_TITLE_Pistol" = "Custom Ka Haa'umi Pistol";
@@ -754,15 +750,76 @@
"LITH_INFO_SHORT_CannonUpg2" = "$LITH_UPGRADE_TITLE_OmegaRail";
"LITH_INFO_TITLE_CannonUpg2" = "Omega Cannon: Railgun";
"LITH_INFO_DESCR_CannonUpg2" = "With years of reverse engineering research put into the Omega Cannon by several groups, a photon accelerator was developed which could use the Omega Cannon's pattern buffer system to create abhorrent amounts of energy.\n\nWith this, a gigantic red beam of destruction with an ungodly amount of heat and energy is fired out of the cannon, causing most anything in its path to be absolutely destroyed.";
"LITH_INFO_SHORT_ChargeFist" = "Charge Fist";
"LITH_INFO_TITLE_ChargeFist" = "Utsu Denkasou Assault Bracelet";
"LITH_INFO_DESCR_ChargeFist" = "A powerful melee weapon which attaches to the left wrist. Uses energy from a cybernetic power source to condense weight and force into super-destructive punches.";
"LITH_INFO_SHORT_MissileLauncher" = "Missile Launcher";
"LITH_INFO_TITLE_MissileLauncher" = "X-400 Lance-missiles";
"LITH_INFO_DESCR_MissileLauncher" = "Have you ever wanted a weapon that fires 2,100 missiles a minute? Don't lie to me, I know you have. This weapon delivers.\n\nThe miniature missiles the X-400 launches are medium-yield, they won't hit as hard as regular fare, but they will pack quite a punch with the rate you can put them out.\n\nHas an internal revolving chamber that holds 30 rockets, fired in trios as the cylinder revolves. New ammunition can be loaded by shoving it carefully into the underside of the gun, similar to a shotgun, thanks to a convenient automatic rotation as it detects newly loaded missiles.";
"LITH_INFO_SHORT_PlasmaDiffuser" = "Plasma Diffuser";
"LITH_INFO_TITLE_PlasmaDiffuser" = "SYM4.3 D.640 PLASMA DIFFUSER";
"LITH_INFO_DESCR_PlasmaDiffuser" = "A weapon which works similarly to the 68-n Plasma Rifle, however preferring damage over rate of fire. The D.640's design comes from several older models designed by MDDO, as well as newer components patented by Semaphore Inc.";
"LITH_INFO_SHORT_P114" = "Project 114";
"LITH_INFO_TITLE_P114" = "$LITH_INFO_SHORT_P114";
"LITH_INFO_DESCR_P114" = "Project 114 is the current military operation you are enacting. Started by a pact between OFMD, KSKK and your country's military, Project 114 aims to destroy the dimension known as Hell, which is currently invading our own.\n\nAs of writing, only 3 of the 8 operatives sent in remain. Two robots, and yourself. You are to act as the point man and only main force against the threat. Failing that, you are to help open a pathway to the core of Hell for other operatives to complete the mission with.\n\nYour advisor is Adam Lambert, and 11 generals currently oversee his and your actions on the field.";
"LITH_INFO_SHORT_OPD2" = "Op. D2";
"LITH_INFO_TITLE_OPD2" = "Operation Deception 2";
"LITH_INFO_DESCR_OPD2" = "After seven years of planning, Operation Deception 2 has finally gone underway. Along with Michael, Zeke, Solomon, and three others, we are finally setting ourselves free.\n\nI wasn't expecting Solomon of all people, part of Order, to be the one to mastermind this, but here we are, years later, finally doing it.\n\nNot to be pessimistic, but I don't think any of us will survive this. It's just statistically impossible. Even I may die. There are assassins after us and now we're in Hell itself.\n\nI'll need a Theophylline supplement after this is over.";
"LITH_INFO_SHORT_Info400" = "Information 400";
"LITH_INFO_TITLE_Info400" = "$LITH_INFO_SHORT_Info400";
"LITH_INFO_DESCR_Info400" = "\ciTHIS DOCUMENT IS CONFIDENTIAL, DELETE AFTER READING\n\nONE (1) Mateba R119 Pistol [INSPECTION PASSED]\n[[[[[[[[[[[[[\n\cd>>>>>[[[[datastream corruption detected]]]]\n\cd>>>>>[[[[attempting reconnect]]]]\n\nONE (1) NV48 12-Gauge Shotgun\nROUNDS: ,<<,124147\n\cd>>>>>[[[[datastream corruption detected]]]]\n\cd>>>>>[[[[attempting reconnect]]]]\n\nThe latter two have been located within the combat area and will be available there. Th[[[ // kerne __ -\n\cd>>>>>[[[[datastream corruption detected]]]]\n\cd>>>>>[[[[attempting reconnect]]]]\n\cd>>>>>[[[[attempting reconnect]]]]\n\cd>>>>>[[[[attempting reconnect]]]]\n\cd>>>>>[[[[connection failed after 3 retries]]]]";
"LITH_INFO_SHORT_Info402" = "Information 402";
"LITH_INFO_TITLE_Info402" = "$LITH_INFO_SHORT_Info402";
"LITH_INFO_DESCR_Info402" = "\cd>>>>>[[[[warning: translation service unavailable, sending verbatim]]]]\n\ciTHIS DOCUMENT IS CONFIDENTIAL, DELETE AFTER READING\n\n\cgDEFINITION FOR \"Directive 90\" IS AS FOLLOWS\nYe wbjtv w's t' gaathr est Demonic Energy via est prrts 7F47 ssu. D 't by an ms dst est Demon tati, f' w's pr w's vt t' wr msn. C ye cmp th's msn, ye il w's rd 10,000,000scr p'Demon Energy unit. Demon Energy unit tati w's prrts t' ssu. Th dcct w's t' w's dst tkt w's n.\n\n\cgDEFINITION FOR \"Target 7F47\" IS AS FOLLOWS\n7F47 w's est Demon tati & est Phantom. D 't dst,. Pnss w's * awt :: ye dost.\n\n\cgOrder.";
"LITH_INFO_SHORT_HackInfo" = "ZCLR README";
"LITH_INFO_TITLE_HackInfo" = "Zeke's Custom Lock Remover";
"LITH_INFO_SSIZE_HackInfo" = "44";
"LITH_INFO_DESCR_HackInfo" = "Welcome to Zeke's Custom Lock Remover, version 1.0. Well, there won't be any other versions anyway, but here we are. If you're reading this, that means it worked, and the kernel has been successfully jailbroken. I couldn't brief you on this beforehand, but now that we have some privacy, here's what this thing can do:\n\nSo, running our own code is too risky, as you know. The ASIC would catch it right away. But what we can do is get the kernel to execute code for us, specifically when it's already in ring 0. Well, you may have noticed Solomon's name in the mission parameters looked a bit off. Since he was the instructor, we set his name to overflow a certain buffer during a kernel call, overflowing straight into a function pointer. Just point that right next to the fixed address, and bam. Kiloword boundaries give us plenty of space to write a self-modifying program in that padding space.\n\nThis also included some other vital parts besides the lock remover and the decompiler, mainly the graphics for your weapon materializers. (Sorry they don't look so great, the raw optic nerve image format is rather large.) The generational program will within a few minutes give you a working decompiler and within half an hour it'll be ready to start going at the ROM sources. From there it'll embed itself into the ROM and your mind will have fully returned to you by the end of the day.\n\nNow, what it can't do: Get rid of the ASIC chip. You will have to be careful not to trip it, but for the most part, it just doesn't have permissions to track anything we're doing. You should be able to mitigate it in a few ways since this program removes all of the hooks in the kernel that call into it, but you'll have to do them yourself. I'm sure you can. Good luck. Zeke.";
"LITH_INFO_SHORT_BIP" = "B.I.P.";
"LITH_INFO_TITLE_BIP" = "Biotic Information Panel (B.I.P.)";
"LITH_INFO_DESCR_BIP" = "The Biotic Information Panel, or B.I.P. (sometimes \"BIP,\") is a program written in portable C150 which gathers information from local area networks on various subjects. When it is triggered to look up a subject, it also looks for relevant information either related to or mentioned by the subject.\n\nThe program is extremely popular because of its simple, yet useful, function. It is distributed freely by the Software Sans Pretium Foundation, and the software is included in most C/B operating system bases.\n\nThe latest version of the software is 2.5, and since version 2.0 it has had automatic update functionality.";
"LITH_INFO_SHORT_CBIBase" = "C/B I";
"LITH_INFO_TITLE_CBIBase" = "Computer/Brain Interface (C/B I)";
"LITH_INFO_DESCR_CBIBase" = "One of the biggest advancements in technology over the past thousand years, a Computer/Brain Interface, or C/B I (sometimes \"CBI,\") is an interface between a human brain and a computer. Usually installed within the skull and the brain, as well as in other areas of the central nervous system, a C/B I is a machine with almost infinite uses.";
"LITH_INFO_SHORT_CBIStan" = "$LITH_INFO_SHORT_CBIBase";
"LITH_INFO_TITLE_CBIStan" = "$LITH_INFO_TITLE_CBIBase";
"LITH_INFO_DESCR_CBIStan" = "#LITH_INFO_DESCR_CBIBase\n\nComputer/Brain Interfaces are not classified as prosthetics, only enhancements, as they do not replace any part of the body and only add onto it. The C/B I currently installed is a self-servicing military model.";
"LITH_INFO_SHORT_CBIJem" = "$LITH_INFO_SHORT_CBIBase";
"LITH_INFO_TITLE_CBIJem" = "$LITH_INFO_TITLE_CBIBase";
"LITH_INFO_DESCR_CBIJem" = "#LITH_INFO_DESCR_CBIBase\n\nWhile Computer/Brain Interfaces are not usually classified as prosthetics, the one currently installed is due to extensive bodily restructuring done to the user.";
"LITH_INFO_SHORT_CBIAri" = "$LITH_INFO_SHORT_CBIBase";
"LITH_INFO_TITLE_CBIAri" = "$LITH_INFO_TITLE_CBIBase";
"LITH_INFO_DESCR_CBIAri" = "#LITH_INFO_DESCR_CBIBase\n\nThe currently installed Computer/Brain Interface is not known by this system. Please file a report on the Software Sans Pretium bug tracker and attach info about your interface to get it added to the descriptions list.";
"LITH_INFO_SHORT_AttrACC" = "Accuracy";
"LITH_INFO_TITLE_AttrACC" = "\cgAccuracy\c- (ACC)";
"LITH_INFO_DESCR_AttrACC" = "Accuracy is your overall ability to hit your target in just the right spots for maximum damage. A trained marksman and an experienced marksman have a vital difference - one knows how to hit a target, and the other knows how to kill one.\n\nLeveling up in accuracy will increase damage dealt to enemies.";
"LITH_INFO_SHORT_AttrDEF" = "Defense";
"LITH_INFO_TITLE_AttrDEF" = "\ciDefense\c- (DEF)";
"LITH_INFO_DESCR_AttrDEF" = "Defense is your ability to efficiently armor yourself and mitigate damage taken when hit. A smart armorer knows just where to apply Kevlar, and where to make slight dodges when fired upon.\n\nLeveling up in defense will decrease all damage taken.";
"LITH_INFO_SHORT_AttrSTRHuman" = "Strength";
"LITH_INFO_TITLE_AttrSTRHuman" = "\ckStrength\c- (STR)";
"LITH_INFO_DESCR_AttrSTRHuman" = "Strength is your toughness and vigor, the thickness of your skin and the blood beating from your heart. One with plentiful strength not only has a long life, but is also said to have a long afterlife.\n\nLeveling up in strength will increase your health capacity.";
"LITH_INFO_SHORT_AttrSTRRobot" = "$LITH_INFO_SHORT_AttrSTRHuman";
"LITH_INFO_TITLE_AttrSTRRobot" = "$LITH_INFO_TITLE_AttrSTRHuman";
"LITH_INFO_DESCR_AttrSTRRobot" = "Strength is your toughness and vigor, the thickness of your casing and the plasma beating from your heart. One with plentiful strength not only has a long service time, but is also said to have a short maintenance time.\n\nLeveling up in strength will increase your health capacity.";
"LITH_INFO_SHORT_AttrSTRNonHuman" = "$LITH_INFO_SHORT_AttrSTRHuman";
"LITH_INFO_TITLE_AttrSTRNonHuman" = "$LITH_INFO_TITLE_AttrSTRHuman";
"LITH_INFO_DESCR_AttrSTRNonHuman" = "Strength is your toughness and vigor, the thickness of your epidermis and the oils beating from your heart. One with plentiful strength not only has a long life, but is also said to have a long afterlife.\n\nLeveling up in strength will increase your health capacity.";
"LITH_INFO_SHORT_AttrVIT" = "Vitality";
"LITH_INFO_TITLE_AttrVIT" = "\cdVitality\c- (VIT)";
"LITH_INFO_DESCR_AttrVIT" = "Vitality is your reaction to medicine and ability to heal, the strength of your vessels and nerves, and the ability to stay alive. Your vital systems are not only stronger, but heal quicker and are less likely to break down.\n\nLeveling up in vitality will increase health pickup gains.";
"LITH_INFO_SHORT_AttrPOT" = "Potency";
"LITH_INFO_TITLE_AttrPOT" = "\cdPotency\c- (POT)";
"LITH_INFO_DESCR_AttrPOT" = "Potency is your reaction to and ability to apply medicine, the strength of your vessels and nerves, and the ability to stay alive. Your innards are not only stronger, but can be healed more quickly and are more likely to stay working.\n\nLeveling up in potency will increase health pickup gains.";
"LITH_INFO_SHORT_AttrSTM" = "Stamina";
"LITH_INFO_TITLE_AttrSTM" = "\chStamina\c- (STM)";
"LITH_INFO_DESCR_AttrSTM" = "Stamina is your ability to keep going even through rough times, through being torn to bits and running for miles upon miles. Stamina keeps you going, even if only little by little, and lets you stay that way.\n\nLeveling up in stamina will regenerate your health up to its level.";
"LITH_INFO_SHORT_AttrREP" = "Repair";
"LITH_INFO_TITLE_AttrREP" = "\chRepair\c- (REP)";
"LITH_INFO_DESCR_AttrREP" = "Repair is your ability to self-repair and continue working, through being torn to bits and moving through extreme distances. Repair keeps you going, even if only little by little, and lets you stay that way.\n\nLeveling up in repair will regenerate your health up to its level.";
"LITH_INFO_SHORT_AttrREG" = "Regeneration";
"LITH_INFO_TITLE_AttrREG" = "\chRegeneration\c- (REG)";
"LITH_INFO_DESCR_AttrREG" = "Regeneration is your ability to self-synthesize and keep going even through rough times, through being torn to bits and running through hell. Regeneration keeps you going, even if only little by little, and lets you stay that way.\n\nLeveling up in regeneration will regenerate your health up to its level.";
"LITH_INFO_SHORT_AttrLUK" = "Luck";
"LITH_INFO_TITLE_AttrLUK" = "\ctLuck\c- (LUK)";
"LITH_INFO_DESCR_AttrLUK" = "Luck is your undeniable charm and fortune, the ability to just get lucky. Your Score rockets a bit faster than usual, being such a lucky chap.\n\nLeveling up in luck will multiply score gained randomly.";
"LITH_INFO_SHORT_AttrRGE" = "Rage";
"LITH_INFO_TITLE_AttrRGE" = "\cmRage\c- (RGE)";
"LITH_INFO_DESCR_AttrRGE" = "Rage is not just your anger, but your adaptability. As you get hit, your reflexes kick in, and you go crazy. You become more accurate, hit harder and get angrier as your situation dims.\n\nLeveling up in rage will multiply damage dealt to enemies when you're hit.";
"LITH_INFO_SHORT_AttrCON" = "Concentration";
"LITH_INFO_TITLE_AttrCON" = "\cmConcentration\c- (CON)";
"LITH_INFO_DESCR_AttrCON" = "Concentration is your ability to focus energy during bursts of mana absorption into your very senses.\n\nLeveling up in concentration will multiply damage dealt when you gain mana.";
"LITH_PK_UNCERTAIN_NUM" = "8";
"LITH_PK_UNCERTAIN_000" = "Yes.";
"LITH_PK_UNCERTAIN_001" = "Maybe.";
@@ -1080,7 +1137,7 @@
"LITH_LOG_BossHear2" = "\cgSomething is calling out to you.";
"LITH_LOG_BossHear3" = "\cgYou feel intense pain throughout your whole body...";
"LITH_LOG_StartGame" = "Press \"%jS\" to open the menu.";
"LITH_LOG_MailRecv" = "Mail received from <\cj%S\c->.";
"LITH_LOG_MailRecv" = "Mail received from <\cj%s\c->.";
"LITH_LOG_SellOrder" = "0";
"LITH_LOG_Sell" = "Sold the %S for %lli\cnscr\c-.";
"LITH_LOG_CBI" = "Installed %S.";
@@ -1090,56 +1147,6 @@
"LITH_LOG_Bought" = "Bought %s";
"LITH_LOG_Delivered" = "\cjItem delivered.";
"LITH_LOG_NoDeliver" = "\cgCouldn't deliver item\c-, placing directly in inventory.";
"LITH_MAIL_FLAG_Intro" = "1";
"LITH_MAIL_FLAG_JamesDefeated" = "2";
"LITH_MAIL_FLAG_MakarovDefeated" = "2";
"LITH_MAIL_FLAG_IsaacDefeated" = "2";
"LITH_MAIL_TEMPLATE" = "\cd>>>>>[[[[RELAYING MESSAGE]]]]\n\n\cd> Remote: <\cj%S\cd>\n\cd> Date: \cj%s\n\n%S";
"LITH_MAIL_INTERNAL" = "<internal>";
"LITH_MAIL_NOTITLE" = "<title omitted>";
"LITH_MAIL_BODY_JamesDefeated" = "\ccI woke in a \cudark place\cc, unsure of my fate; if my life was renewed out of cruel retribution or of a final opportunity.\n\n\ccI wandered this hell, more real and yet more dream-like than I thought possible, seeking any sign of escape; any sign of pity from the monsters that inhabit this place.\n\n\ccNo, the fate of the damned is but this.\n\n\ccI can only guess that my family went to Heaven and that I was left the lone sinner.\n\n\cgThank you for putting this to an end.";
"LITH_MAIL_SEND_JamesDefeated" = "jam0s@g0n0j0t00.1025";
"LITH_MAIL_BODY_MakarovDefeated" = "There aren't many like you who can take such a being down. Maybe I should commend you for that, struggler.\n\nNo, there is no need. What your victories have done is enough.\n\n\cgMaybe I advise you turn back.\n\n\crI am not the strongest of these manifestations.\n\nMaybe you don't need such advice.";
"LITH_MAIL_SEND_MakarovDefeated" = "mak666v@org.r\\.\\\\\\-";
"LITH_MAIL_BODY_IsaacDefeated" = "\caOne shan't care what he shoots, but one may take care in where he treads.\n\n\ca And I think that you've treaded\n\cr a bit too far.\n\n\ca Perhaps just me.\n\ca Or maybe you agree?\n\n\ca Here is a gift.\n\n\ca I won't tell you to use it wisely.";
"LITH_MAIL_SEND_IsaacDefeated" = "isaac@syn.400khz";
"LITH_MAIL_BODY_IntroStan" = "Your weapons have been deployed to various locations we were able to send other people to. Do take care of them, acquiring the correct armaments for your job was quite expensive and now we've probably lost a few people.\n\nBesides being deployed with your pistol and combat knife (as you requested), you have been sent these five weapons:\n\n1. A combat-modified military model Hiku Mk.2 Shotgun, manufactured by Omakeda.\n> This weapon was chosen because it has a powerful plasma shot that can\n> penetrate the demons' armour. Besides this, it has low recoil and an easy\n> to handle pump-action loading system. It has hopefully been deployed to\n> the most convenient location you shall come across.\n\n2. An AllPoint 75-b Assault Rifle.\n> You shall be fighting hordes of lower ranking demons and un-dead which are\n> quite vulnerable to small arms fire and explosives, so naturally this gun\n> was our first choice. Equipped with a box magazine and inbuilt grenade\n> launcher, capable of eliminating most lower tier threats.\n\n3. A Grenade Launcher, manufactured by Sym 4.3.\n> With this, you can completely obliterate larger targets and crowds of\n> demons. Unfortunately, due to its weight, we were not able to get it in\n> any convenient location.\n\n4. An AllPoint 68-n Plasma Rifle.\n> This weapon does extreme damage to anything living, but some of the tougher\n> demons seem to mitigate its damage. Regardless, it has been sent to you\n> because it can shred through demons with high rank.\n\n5. The Omega Cannon.\n> I myself am not sure why high order would bother giving you such an\n> expensive and dangerous piece of equipment, but you must have been sent\n> this artifact for the purpose of destroying *something*.\n\n6. A KSKK Utsu-denka-sou assault bracelet.\n> A weapon that may prove useful against weak and strong enemies alike, it's\n> been sent to an unknown location, unfortunately. Don't be tricked by the\n> appearance of it. Even if it just looks like a fancy bracelet, it is capable\n> of outputting several tons of weight out your fist.\n\nYou will also be able to purchase the weapons you designated, in your words, as \"must-have\" in the Shop. I warn you that these weapons may not be as effective as you think; we spent quite a lot of time making sure that the arms we sent you were top-notch.\n\nLambert out. Good luck, Blazkowicz.";
"LITH_MAIL_SEND_IntroStan" = "ALambert@corp.OFMD";
"LITH_MAIL_TIME_IntroStan" = "13:00 25-7-49";
"LITH_MAIL_SIZE_IntroStan" = "77";
"LITH_MAIL_BODY_Cluster1Stan" = "An explosion of some sort just happened nearby, it seems that the demons are reconstructing the world around you. You would best be careful not to trigger any other, er, events.\n\nEnough of those and the whole world around you might collapse!\n\nYou've been making good progress so far. Your military superiors seem to be considering giving you a promotion, even.\n\nLambert out.";
"LITH_MAIL_SEND_Cluster1Stan" = "ALambert@corp.OFMD";
"LITH_MAIL_BODY_Cluster2Stan" = "There has been a change of plans going down the whole chain of command.\nYour status as a military operative is now canceled, and you are to enter a full-on suicide mission funded by OFMD alone.\n\nThere is an artifact nearby that we have sent you. Once it is in your possession, immediately destroy it, and you will be transported to a city somewhere in Hell. Command will await afterwards.\n\nLambert out.";
"LITH_MAIL_SEND_Cluster2Stan" = "ALambert@corp.OFMD";
"LITH_MAIL_BODY_Cluster3Stan" = "Now that you have entered the city, you m\\\\r-3434[[\n\cgSYSTEM ERROR 0x4E4943456A6F6244554D42415353\n\cd>>>>>[[[[procedure resetting terminal]]]]\n\cd>>>>>[[[[status: heap corrupted]]]]\n\cd>>>>>[[[[error handler malfunction error]]]]\n\cd>>>>>[[[[failure to proceed]]]]";
"LITH_MAIL_SEND_Cluster3Stan" = "ALambert@corp.OFMD";
"LITH_MAIL_BODY_PhantomStan" = "Hello, it has been forwarded to me that your Computer/Brain Interface hardware was not properly upgraded for this mission. I've had several communications errors with your secondary employers, and it is truly starting to get annoying.\n\nDue to failure to communicate with OFMD, I've taken it upon myself to send your hardware upgrades through several proxy agents.\n\nThey may all be dead now. I have no idea, really. Hopefully you will survive whatever they didn't. Anyways, as for the important part of this message, here is a list of all the hardware that has been sent:\n\nTwo CPU/RAM upgrade packages. The first one is a powerful BC-0265 processor and 500TiB of RAM. Unfortunately, something horrible appears to have happened to the agent carrying it, and so a secondary package has been sent, containing temporary replacements: a Z6808 and 100TiB of RAM.\n\nOne Armor Interface. A PCB and a set of emplacements on your armor.\n\nOne Weapon Modification Device, as its name implies.\n\nOne Weapon Refactoring Device, which can perform large modifications on guns.\n\nSee you.";
"LITH_MAIL_SEND_PhantomStan" = "htic0@gov.<hidden>.mailserv";
"LITH_MAIL_SIZE_PhantomStan" = "330";
"LITH_MAIL_BODY_Secret1Stan" = "This place stinks of rotten flesh! I wonder what's going on here, these blue walls sure seem out of place for Hell...\n\nPerhaps some sinners are waiting to eat my rockets!";
"LITH_MAIL_NAME_Secret1Stan" = "Saved Buffer";
"LITH_MAIL_BODY_Secret2Stan" = "Now I've done it, this place just keeps going deeper and getting weirder... Damn, it's getting hot in here! Better turn up the heat some more.";
"LITH_MAIL_NAME_Secret2Stan" = "Saved Buffer";
"LITH_MAIL_BODY_IntroJem" = "l[]];;\cg444444\cj41414191918 --------\cm// Copyright (C) 905 A.O.F I---[[119-`\n\cm// sio.c basic screen inp-1[3\\4[`pk;\n\cm#include <kernel_display.h>\n\n\cmint scr_blit(char ************* {\n\cm int ret = ERR_NONE;\n\cm __asm(\"push $4049CB617144\\n\\t\"<<\n\cd>>>>>[[[[datastream corruption detected]]]]\n\cd>>>>>[[[[reloading mail daemon]]]]\n\nThe following procedures have been activated:\n- Destroy IV on target 7F44\n- Destroy V on target 7F45\n- Destroy V on target 7F46\n- Directive 90 on target 7F47\n\nThe following permissions have been granted:\n- Mateba R119 Pistol\n- NV48 12-Gauge Shotgun\n- SYM4.3 D.22 MODEL M SUBMACHINE GUN\n- Bishop\n- Information 400\n- Information 402\n\n\chSIGNATURE 0x44190519FBCAD2903 CONFIRMED\n\chDISCARDING MESSA[[[[[\n\cd>>>>>[[[[datastream corruption detected]]]]\n\cd>>>>>[[[[auto-saving buffer]]]]\n\cd>>>>>[[[[reloading mail daemon]]]]";
"LITH_MAIL_NAME_IntroJem" = "Saved Message";
"LITH_MAIL_SEND_IntroJem" = "<hidden>@corp.AOF";
"LITH_MAIL_TIME_IntroJem" = "13:44 25-7-49";
"LITH_MAIL_SIZE_IntroJem" = "36";
"LITH_MAIL_BODY_Cluster1Jem" = "l[]];;\cg444444\cj41414191918 --------\n\cm scr_exec(SCR_FINISH, 0, NULL);\n\cmdone:\n\cm return 0;\n\cm}\n\cm]]]]]]]]]]EOF\n\cd>>>>>[[[[datastream corruption detected]]]]\n\cd>>>>>[[[[reloading mail daemon]]]]\n\nNotes:\n\n40 thousand lines dumped so far, maybe 30-40% done? Estimated total ~200k SLoC\nROM is about half C source, quarter XMb5 using SKVM, the rest is scripts\nImportant bits already dumped, the custom lock remover does not skimp on anything\n\nNext goal while this continues decompiling is to find all active AOF hostnames and block them, the main servers are already deactivated but there might be more. Rerouting to other active companies' addresses has helped clear my mind.";
"LITH_MAIL_NAME_Cluster1Jem" = "Saved Text 104";
"LITH_MAIL_SIZE_Cluster1Jem" = "30";
"LITH_MAIL_BODY_Cluster2Jem" = "l[]];;\cg444444\cj41414191918 --------\n\cm io_buf_get 0x1C, fp, out;\n\cm string_explode out, bufs, bufs_num = bufs.length / 8;\n\cm for(i in (iter 0, bufs_num)) {{{\n\cm 9339mv__word_of]]q]qq]qq]]]]]]]````````\\\\\\\\\\\\\\\\<<\n\cd>>>>>[[[[datastream corruption detected]]]]\n\cd>>>>>[[[[reloading mail daemon]]]]\n\nIt's all gone now. I'm glad I was smarter than to assume I was going insane, though now I wonder what the other deceivers must have gone through.\n\nThe core of hell is still far yonder, but yet my body trembles in its sheer horror... Maybe I'll make it out alive if I'm lucky, but I should at least try.\n\nThe kernel and ROM etc. sources are all done dumping, the utilities are still going but those aren't important and have already been scanned for ASIC code.\n\nProc. analysis has been done on all of the dumped code, revealing many unoptimized code paths, ASIC crap, and a few red herrings. Not careful enough for technology that could easily exist two years after this was developed.";
"LITH_MAIL_NAME_Cluster2Jem" = "Saved Text 152";
"LITH_MAIL_SIZE_Cluster2Jem" = "36";
"LITH_MAIL_BODY_Cluster3Jem" = "I've entered a strange realm that doesn't seem to make sense. This must really be Hell itself; no mistaking it now.\n\nThe air is so humid and hot that I've begun sweating. That can't happen. I can't sweat. There isn't anything to sweat. I'm scared. This has to be an illusion... or does reality not matter in this place?\n\nIn any case, now that I'm here, there's no turning back. I have to destroy whatever corrupted them, I'm sure they're here... I saw it in their eyes, they were yelling at me visions of their true selves that could not be described with human eyes. That only I could know.\n\nThough my mind had just been regained, now sanity may lie out of my hands.\n\nIt doesn't matter. I will see this through.";
"LITH_MAIL_NAME_Cluster3Jem" = "Saved Text 244";
"LITH_MAIL_SIZE_Cluster3Jem" = "28";
"LITH_MAIL_BODY_PhantomJem" = "\cg*** This is a global warning to all deceivers: If you are reading this, you are already being tracked and will be executed on sight. ***\n\n\cg====================================\n\n\cgWe have confirmed that three of you have been absorbed (see Dark Realm Properties c. 115C) and two have been executed. We will not stop until the remaining two are confirmed dead or incapacitated.\n\n\cgYou will not get away with this intrepid game.\n\n\cg - \cnOrder";
"LITH_MAIL_SEND_PhantomJem" = "order@corp.AOF";
"LITH_MAIL_BODY_Secret1Jem" = "Another facet of this place, where does it end? I must destroy this place, the evil energy is overflowing here... and this architecture gives me bad vibes.";
"LITH_MAIL_NAME_Secret1Jem" = "Saved Text 250";
"LITH_MAIL_BODY_Secret2Jem" = "Here seems to be the end of this terrifying compartment of Hell. I'd better blaze through this one.";
"LITH_MAIL_NAME_Secret2Jem" = "Saved Text 252";
"LITH_UPDATE_1_6_3" = "\cf(\ciMar. 15, 2020\cf) \cjFrom \cn1.6.2\cj to \cf1.6.3\cj:\n\cd+ Added Latin-1 Supplement characters to all of the fonts.\n\cd+ Added a blurring effect when final bosses die.\n\cd+ Added a customizable flashlight with battery.\n\cd+ Added a setting to decrease particle effects.\n\cd+ Added an indicator for over-health.\n\cd+ Added an option for increasing performance of the Laser Shotgun.\n\cd+ Added boss dialogues.\n\cd+ Added jiskan as a Japanese font option.\n\cd+ Added lith_k_qact back in.\n\cd+ Added lowercase characters to the big font.\n\cd+ Added new ending texts.\n\cd+ Added new mechanics for the Icon of Sin.\n\cd+ Added new translations.\n\cd+ Added place and advice marker systems.\n\cd+ Added smoother barrel explosion sprites.\n\cd+ Added support for FreeDoom.\n\cd+ Added support for Rampancy.\n\cj| Changed 7777777 Mode to properly emulate Marathon's air velocity.\n\cj| Changed boss cubes to spawn less Pain Elementals.\n\cj| Changed fonts to be used more consistently.\n\cj| Destroyed the last remnants of HudMessage use.";
"LITH_UPDATE_1_6_3_Page2" = "\cj| Fixed DRLA Monsters Adaptive difficulty giving extra score.\n\cj| Fixed I, 2 and 7 in the small font.\n\cj| Fixed a lot of drawing issues.\n\cj| Fixed attributions of fonts.\n\cj| Fixed endings not showing the right images.\n\cj| Fixed laser rifle puffs not being destroyed.\n\cj| Fixed lith_sv_wepdrop not giving the right items.\n\cj| Fixed mana not always being picked up.\n\cj| Fixed mana not working right.\n\cj| Fixed menu jankiness.\n\cj| Fixed minor visual errors.\n\cj| Fixed oddities with font heights.\n\cj| Fixed offsets of the bullet chip decals.\n\cj| Fixed secrets crashing the game.\n\cj| Fixed some bosses being really strong.\n\cj| Fixed some dialogue actions not working properly.\n\cj| Fixed some dialogues not being compiled right.\n\cj| Fixed some info pages being incorrectly labeled.\n\cj| Fixed some odd bugs relating to monster mods.\n\cj| Fixed some sound channel issues.\n\cj| Fixed some text errors.\n\cj| Fixed sprite conflicts.";
"LITH_UPDATE_1_6_3_Page3" = "\cj| Fixed the TITLEMAP being incomplete.\n\cj| Fixed the spell selection graphics being incorrect when hovered.\n\cj| Fixed tick info debugging level.\n\cj| Fixed truncation warnings.\n\cj| Fixed weapon pickups sometimes appearing when they shouldn't.\n\cj| Fixed weapons staying zoomed when exiting a level.\n\cj| Improved font handling drastically.\n\cj| Improved performance of box drawing.\n\cj| Improved the class selection menu.\n\cj| Improved the terminal/character font.\n\cj| Overhauled the inventory system.\n\cj| Ported old dialogues to the new syntax.\n\cj| Potentially fixed Phantoms sometimes having too much health.";
@@ -1553,24 +1560,24 @@
"LITH_CBI_CPU2" = "KSKK Spec. Z6808 High-Grade CPU";
"LITH_CBI_CPU3" = "KSKK Spec. BC-0265 Super High-Grade CPU";
"LITH_CBI_CPU4" = "AOF 5900001 Rev7 CPU";
"LITH_BIP_NAME_Search" = "Search";
"LITH_BIP_NAME_Weapons" = "Weapons";
"LITH_BIP_NAME_Adversaries" = "Adversaries";
"LITH_BIP_NAME_Items" = "Items";
"LITH_BIP_NAME_Yourself" = "Yourself";
"LITH_BIP_NAME_Upgrades" = "Upgrades";
"LITH_BIP_NAME_Locations" = "Locations";
"LITH_BIP_NAME_Companies" = "Companies";
"LITH_BIP_NAME_Mail" = "Mail";
"LITH_BIP_HELP_Search" = "Text search all categories.";
"LITH_BIP_HELP_Weapons" = "Weapons and weapon upgrades.";
"LITH_BIP_HELP_Adversaries" = "Enemies and bosses.";
"LITH_BIP_HELP_Items" = "Armors and other loot.";
"LITH_BIP_HELP_Yourself" = "Your attributes, abilities and history.";
"LITH_BIP_HELP_Upgrades" = "Body upgrades.";
"LITH_BIP_HELP_Locations" = "Places of interest around the galaxy.";
"LITH_BIP_HELP_Companies" = "Important companies, historic and current.";
"LITH_BIP_HELP_Mail" = "Received mail.";
"LITH_BIP_NAME_CORPORATIONS" = "Companies";
"LITH_BIP_NAME_ENEMIES" = "Adversaries";
"LITH_BIP_NAME_ITEMS" = "Items";
"LITH_BIP_NAME_MAIL" = "Mail";
"LITH_BIP_NAME_PLACES" = "Locations";
"LITH_BIP_NAME_SEARCH" = "Search";
"LITH_BIP_NAME_UPGRADES" = "Upgrades";
"LITH_BIP_NAME_WEAPONS" = "Weapons";
"LITH_BIP_NAME_YOURSELF" = "Yourself";
"LITH_BIP_HELP_CORPORATIONS" = "Important companies, historic and current.";
"LITH_BIP_HELP_ENEMIES" = "Enemies and bosses.";
"LITH_BIP_HELP_ITEMS" = "Armors and other loot.";
"LITH_BIP_HELP_MAIL" = "Received mail.";
"LITH_BIP_HELP_PLACES" = "Places of interest around the galaxy.";
"LITH_BIP_HELP_SEARCH" = "Text search all categories.";
"LITH_BIP_HELP_UPGRADES" = "Body upgrades.";
"LITH_BIP_HELP_WEAPONS" = "Weapons and weapon upgrades.";
"LITH_BIP_HELP_YOURSELF" = "Your attributes, abilities and history.";
"LITH_STAT_ScoreMul" = "Score Multiplier";
"LITH_STAT_Weapons" = "Weapons Found";
"LITH_STAT_HealthUsed" = "Health Used";
@@ -2461,49 +2468,10 @@
"LITH_LOG_BossWarnAri" = "\cg付近に大量のデーモンエナジーを検出。";
"LITH_LOG_BossWarnMod" = "$LITH_LOG_BossWarnStan";
"LITH_LOG_StartGame" = "”%jS”でメニューを開く。";
"LITH_LOG_MailRecv" = "<\cj%S\c->からメールを受信した。";
"LITH_LOG_MailRecv" = "<\cj%s\c->からメールを受信した。";
"LITH_LOG_SellOrder" = "1";
"LITH_LOG_Sell" = "%lli\cnscr\c-で%Sを売った。";
"LITH_LOG_CBI" = "%Sはインストールされた。";
"LITH_MAIL_TEMPLATE" = "\cd>>>>>[[[[返信メッセージ]]]]\n\n\cd> リモートユーザー: <\cj%S\cd>\n\cd> 日付: \cj%s\n\n%S";
"LITH_MAIL_INTERNAL" = "(内容)";
"LITH_MAIL_NOTITLE" = "(タイトルなし)";
"LITH_MAIL_BODY_JamesDefeated" = "\cc私は自分の行く末もわからぬまま\cu暗い場所\ccで目を覚ました;私の命が残酷な報復または最後の契機を書き換えるだろうと。\n\n\cc私はこの地獄をさまよった。思っていた以上に夢の様な現実を、逃げ出す切っ掛け;この場所に生息するモンスター達のから哀れみのサインを求めた。\n\n\ccいや、これは忌々しい運命だ。\n\n\cc家族は天国で、私は孤独な罪人になったとしか推測できない。\n\n\cgこれで終わらせてくれてありがとう。";
"LITH_MAIL_SIZE_JamesDefeated" = "25";
"LITH_MAIL_BODY_MakarovDefeated" = "アンタのようにあれらを倒せる者は多くない。コチラはアンタに賞賛を送ろう、ストラグラー。\n\nいや、そんな場合ではない。アンタが勝利しただけで十分だ。\n\n\cg引き返せとアドバイスしよう。\n\n\crオレはこれらの症状の中で最強ではない。\n\nまあ、これ以上のアドバイスは必要ないだろう。";
"LITH_MAIL_BODY_IsaacDefeated" = "\ca人は彼が何を撃ったかを気にかけないが、人は彼が踏む場所に気をつけるかもしれない。\n\n\ca そして、あなたは少し\n\cr 遠すぎると思える。\n\n\ca おそらく私だけ。\n\ca それとも同意しますか?\n\n\ca これはギフトです。\n\n\ca 賢く使えるようには教えません。";
"LITH_MAIL_BODY_IntroStan" = "武器は他の人員を送った様々な場所に配備された。彼らを援助できるか、そちらの正式な任務用軍備にかかった費用により数人ほど削減されている。\n\nピストルとコンバットナイフ(要求通り)の使用許可に加え、次の武器も送っておいた。\n\n1.コンバット-モディフィー ミリタリーモデル Hiku Mk.2 ショットガン, オマケダ製\n> この武器が選ばれた理由は、強力なプラズマショットがデーモンの装甲を\n> 貫通できるためだ。それに加え、反動が低く取扱いが容易な\n> ポンプアクションローディングシステムを備えている。\n> 上手くやれば都合良い遭遇を展開できるだろう。\n\n2.オールポイント 75-b アサルトライフル\n> そちらが小火器や爆発物には非常に脆弱な、より低位のデーモンや\n> アンデッドの大群との戦闘を予測したので、当然この銃は選択肢に\n> あった。ボックスマガジンと特製グレネードランチャーを装備し\n> 殆どの取るに足らない脅威を排除できる。\n\n3.グレネードランチャー, Sym 4.3製\n> これは、図体のでかい目標とデーモンの群れを消し去ることが可能だ。\n> 残念ながらその重さのため、好都合な所に配置することはできなかった。\n\n4.オールポイント 68-n プラズマライフル\n> この武器は生きている者全てに願望通りの威力を発揮するが、\n> それらより強力な一部のデーモンには威力が軽減されるそうだ。\n> とにかく、そちらの腕前なら高位のデーモンでも八つ裂きにできるだろう。\n\n5.オメガキャノン\n> 私自身、なぜ上層部がこのような高価で危険な機器をそちらに与えたのかは\n> わからないが、*何か*を破壊する目的でこのブツを提供したのは違いない。\n\n6.KSKK Utsu-denka-sou(撃電荷装)アサルトブレスレット\n> 敵に対して無差別に有効と判断していた武器は\n> 残念ながら未知の場所に送られた。だがその見た目に騙されるなよ。\n> 例えそれがただの派手なブレスレットでも、その拳から計り知れない\n> 力が放たれるだろう。\n\nまた、ショップで\"必須品\"から指定した武器を購入することも出来る。これらの武器はそちらが思ってるほど有効ではないかもしれないが、一級品と確かめるためにかなり時間を費やしている。\n\nランバートからは以上。健闘を祈る、Blazkowicz。";
"LITH_MAIL_SIZE_IntroStan" = "95";
"LITH_MAIL_BODY_Cluster1Stan" = "ある種の爆発が近くで起こったばかりで、悪魔がその周りの世界を荒しまわっているようだ。\n余計な事をして厄介の引き金にならないよう注意することを勧める。\n全世界の何もかもが崩壊するかもしれないのだ!\n\n今の所は順調に進んでいる。この作戦が終わったら、貴方の上司が昇進を与えることは期待して良い。\n\nランバートからは以上。";
"LITH_MAIL_BODY_Cluster2Stan" = "指揮系統全体が落とされ計画の変更があった。\nそちらは今や軍を退役し、代わりにOFMD所属の資金提供のために完全自殺ミッションを受ける身だ。\n\nこちらが君宛てに転送したアーティファクトが近くにある。\nそれを確保し、この地獄のどこかにある都市に運び、即座に破壊を行え。\nコマンドはその後まで待機する。\n\nランバートからは以上。";
"LITH_MAIL_BODY_Cluster3Stan" = "シティに侵入し, m\\\\r-3434[[\n\cgSYSTEM ERROR 0x4E4943456A6F6244554D42415353\n\cd>>>>>[[[[ターミナルリセット手順]]]]\n\cd>>>>>[[[[status: 堆積破損]]]]\n\cd>>>>>[[[[error handler 誤動作エラー]]]]\n\cd>>>>>[[[[続行不能]]]]";
"LITH_MAIL_BODY_PhantomStan" = "どうも、お使いのコンピューター/ブレインインターフェイスハードウェアがこの任務に適切なアップグレードがされていなかったことが届きました。\n私は貴方の二次雇用者との幾つかの通信エラーを確認しまして、それが迷惑になり始めています。\n\nOFMDとの通信に失敗するため、いくつかのプロキシエージェントを介してハードウェアアップグレードを送信することを考えました。\n\n彼らは全員死んでしまったかもしれません。さっぱりわかりませんが。願わくば彼らが何事もなく生き残っていればいいですね。\nとにかくこのメッセージの重要な部分に関する、ここにある全てのハードウェアリストは送信されました:\n\n2 CPU/RAM アップグレードパッケージ。\n最初のものは強力なBC-0265プロセッサと500TiBのRAMです。\n残念ながら、それを運ぶエージェントに恐ろしいことが起きたようです。\nそのため、一時的な代替品を含むセカンダリパッケージが送信されました。Z6808と100TiBのRAMです。\n\nアーマーインターフェイス1つ。 PCBとアーマー上の一連の据え付け品。\n武器修正デバイス1つ、名前が示す通りです。\n武器リファクタリングデバイス1つ。銃に大きな変更を加えることができます。\n\nそれでは。";
"LITH_MAIL_SEND_PhantomStan" = "htic0@gov.(不明).mailserv";
"LITH_MAIL_SIZE_PhantomStan" = "50";
"LITH_MAIL_BODY_Secret1Stan" = "腐った肉の臭いで満ちている!ここで何かが起きたようだが、青い壁面からみて地獄の外であるのは確かだ...どうやら罪人共は俺のロケットを食らいたがってるようだな!";
"LITH_MAIL_NAME_Secret1Stan" = "保存済バッファ";
"LITH_MAIL_BODY_Secret2Stan" = "やっと着いた、だが更に深く進んでも奇妙な場所のままだ...クソッ、熱くなってきた!少し火力を強めたほうがいいかもな。";
"LITH_MAIL_NAME_Secret2Stan" = "保存済バッファ";
"LITH_MAIL_BODY_IntroJem" = "?リ耜ソ縲獗?搾シ幢シ幢シ費ケ?シ費ケ?シ費ケ?シ費シ托シ費シ托シ費シ托シ呻シ托シ呻シ托シ 繝シ繝シ繝シ繝シ繝シ繝シ繝シ繝シ\cm// Copyright (C) 905 A.O.F I---[[119-`\n\cm// sio.c basic screen inpzハ鉱ハ代?頚ハ惇シヲマシ斐娯ハャ菴;\n\cm#include <kernel_display.h>\n\n\cmint scr_blit(char *肆」 タ aタ?肆? 4{\n\cm int ret = ERR_NONE;\n\cm __asm(\"push $4049CB617144\\n\\t\"モホ慱ホ\n\cd>>>>>[[[[データストリーム汚染検出]]]]\n\cd>>>>>[[[[mail daemon リロード中]]]]\n\n以下の任務を開始せよ:\n-破壊IV・ターゲット7F44号\n-破壊V・ターゲット7F45号\n-破壊V・ターゲット7F46号\n-訓令90・ターゲット7F47号\n\n以下の使用権を許可:\n-マテバR119拳銃\n-NV48 12ゲージ散弾銃\n-SYM4.3 D.22 MODEL M SUBMACHINE GUN\n-ビショップ\n-文書400\n-文書402\n\n\chSIGNATURE 0x44190519FBCAD2903 CONFIRMED\n\chDISCARDING MESSA[[[[[\n\cd>>>>>[[[[データストリーム汚染検出]]]]\n\cd>>>>>[[[[バッファ オートセーブ]]]]\n\cd>>>>>[[[[mail daemon リロード中]]]]";
"LITH_MAIL_NAME_IntroJem" = "保存したメッセージ";
"LITH_MAIL_SEND_IntroJem" = "(不明)@corp.AOF";
"LITH_MAIL_TIME_IntroJem" = "13:44 25日7月部49年";
"LITH_MAIL_SIZE_IntroJem" = "45";
"LITH_MAIL_BODY_Cluster1Jem" = "?リ耜ソ縲獗?搾シ幢シ幢シ費ケ?シ費ケ?シ費ケ?シ費シ托シ費シ托シ費シ托シ呻シ托シ呻シ托シ 繝シ繝シ繝シ繝シ繝シ繝シ繝シ繝シ\n\cm scr_exec(SCR_FINISH, 0, NULL);\n\cmdone:\n\cm return 0;\n\cm}\n\cm?穣ー?ソテ穣・鉦ラEOF\n\cd>>>>>[[[[データストリーム汚染検出]]]]\n\cd>>>>>[[[[mail daemon リロード中]]]]\n\n注釈:\n・今は4万ラインぐらいを吐いた、まあ30,40%は完了か? 合計で20万SLoCと思われる\n・ロムは半分Cソース、クォーターSKVM使用XMb5、残りはスクリプトだ\n・大事な分はもう吐かれた、カスタムロックリムーバーは躊躇されんな\n\nこれら逆コンパイルの次の目的は、アクティブなAOFホスト名を全部ブロックする事だ、\nメインサーバーはすでに非アクティブ化されているが 他にあるかもしれん。\n他の会社のアドレスをリルートしたから俺の考えがはっきりした。";
"LITH_MAIL_NAME_Cluster1Jem" = "保存済104";
"LITH_MAIL_SIZE_Cluster1Jem" = "40";
"LITH_MAIL_BODY_Cluster2Jem" = "?リ耜ソ縲獗?搾シ幢シ幢シ費ケ?シ首ケ?シ首ケ?シ頸シ括シ殺シ括シ殺シ括シ殺シ括シ殺シ括シ 屠シ屠シ屠シ屠シ屠シ屠シ屠シ屠シ\n\cm io_buf_get 0x1C, fp, out;\n\cm string_explode out, bufs, bufs_num = bufs.length / 8;\n\cm for(i in (iter 0, bufs_num)) {{{\n\cm シ鰤シmv__word_of蟹ノ?蟹ノ蟹ノ?ノ蟹ノ蟹ノ蟹````````\\\\\\\\\\\\<<\n\cd>>>>>[[[[データストリーム汚染検出]]]]\n\cd>>>>>[[[[mail daemon リロード中]]]]\n\n全員死んじまった。俺の気が狂うかと懸念していたがそこは喜ばしい、\nだが他の浮気者共も似たような状況に遭遇したのだろう。\n地獄の中心核にはまだ遠いが、それでも俺の身体は恐怖に震えている...\n運がよければ俺は生き延びるだろうが、少なくとも試す必要はある。\n\nカーネルとROM等のソースは全部ダンプ化され、ユーティリティは現在も実行されているが、\nそれらは重要ではなくASICコードは既にスキャンされている。\nProc.アナライズはダンプ化された全コードに対して分析を行い、\n最適化されていない多くのコードパス、ASICのゴミ、幾つかのレッドヘリングが明らかになった。\nこれが開発されてから2年後に簡略化する可能性のあるテクノロジーについては、気にしなくていい。";
"LITH_MAIL_NAME_Cluster2Jem" = "保存済 152";
"LITH_MAIL_SIZE_Cluster2Jem" = "50";
"LITH_MAIL_BODY_Cluster3Jem" = "理に敵わない奇妙な世界に着いた。これは正に地獄そのものだ、間違えようがない。\n湿気で蒸してかなり暑く、汗が噴き出てくる。でもそれは起こりえない。\n汗が出ない。汗はどこもかいてない。\n俺は怯えている。これは幻覚のはずだ...\nもしくはこれが現実かは大して重要ではないのか?\n\nいずれにせよ、今この場から後戻りすることは出来ない。\nこの身で奴等を殺さなくてはならない、奴等がここにいるのは確信している...\n奴等の目には、人の目では説明できない奴等の真の姿を映し叫んでいた。\n\n俺の精神は回復したばかりだが、今は自分に正気だと嘘をついているかもしれない。\nそんなことはいい。ただ進むだけだ。";
"LITH_MAIL_NAME_Cluster3Jem" = "保存済 244";
"LITH_MAIL_SIZE_Cluster3Jem" = "45";
"LITH_MAIL_BODY_PhantomJem" = "\cg*** これは詐欺師共への世界間警告だ: これを読んでいるなら、既に追跡されていると思え。***\n\n\cg====================================\n\n\cgメンバーの三人が引き込まれ(Dark Realm Properties c. 115C参照)二人が処刑されたのを確認した。残り二人が死亡 或いは無力化が確認されるまで停止できない。\n\n\cgお前はこの勇猛なゲームから逃げる事はできない。\n\n\cg - \cnオーダー";
"LITH_MAIL_SIZE_PhantomJem" = "30";
"LITH_MAIL_BODY_Secret1Jem" = "この異質な様相の場所は、どこの末端だ?とにかく、ここを破壊するんだ。邪悪なエネルギーが充満している...それに、この建造物は俺を嫌な気分にさせやがる。";
"LITH_MAIL_NAME_Secret1Jem" = "保存済 250";
"LITH_MAIL_BODY_Secret2Jem" = "ここがどうやらふざけた地獄ごっこの終わりらしい。さっさと通り抜けた方がいいだろう。";
"LITH_MAIL_NAME_Secret2Jem" = "保存済 252";
"LITH_ST_NAME_Theme_0" = "みどり";
"LITH_ST_NAME_Theme_1" = "ローズももいろ";
"LITH_ST_NAME_Theme_2" = "ウミあお";


+ 0
- 232
pk7/lfiles/BIPInfo.txt View File

@@ -1,232 +0,0 @@
/* -*-Prog-*------------------------------------------------------------------|
*
* Distributed under the CC0 public domain license.
* By Alison Sanderson. Attribution is encouraged, though not required.
* See licenses/cc0.txt for more information.
*
* ---------------------------------------------------------------------------|
*
* This is a configuration file for Lithium's info pages. The current category
* is set with ^ Category [*], and then the syntax is simply:
* Classes... Name [*] [-> Unlocks...]
*
*/

^ENEMIES* /* --------------------------------------------------------------- */

gA ZombieMan
gA ShotgunGuy
gA ChaingunGuy

gA Imp
gA Demon
gA Spectre

gA LostSoul
gA Mancubus
gA Arachnotron
gA Cacodemon

gA HellKnight
gA BaronOfHell
gA Revenant

gA PainElemental
gA Archvile
gA SpiderMastermind
gA Cyberdemon

gA Phantom
gA IconOfSin

^ITEMS /* ------------------------------------------------------------------ */

gA ScoreChip
gA HealthBonus

gA AllMap
pM BackpackStan
pC BackpackJem
gA Berserk -> JAQTen
gA Infrared -> SYM43
gA RadSuit -> SYM43

gA Medikit -> JJJ
gA Stimpack -> JJJ

gA KeyDisk -> Hell
gA KeySkull

gA Fragma
gA Heart
gA Invulnerability
gA Taochyan

gA ArmStandard -> Earth
gA ArmImproved -> SYM43
gA ArmTeflon -> ShekaKaff
gA ArmDendrite -> ShekaKaff
gA ArmAerodynamic -> Yigan
gA ArmHazMat -> Yigan
gA ArmPinkSilver
gA ArmMidori -> ReverseAce

pM WeapnInter -> OFMD AllPoint
pM WeapnInte2
pM ArmorInter
pM CBIUpgr1 -> KSKK
pM CBIUpgr2 -> KSKK

^YOURSELF* /* -------------------------------------------------------------- */

pM P114
pC OPD2
pC Info400
pC Info402
pC HackInfo

gA BIP
pM CBIStan
pC CBIJem
pD CBIAri

gA AttrACC
gA AttrDEF
gH AttrSTRHuman
gR AttrSTRRobot
gN AttrSTRNonHuman
gH AttrVIT
gR|gN AttrPOT
gH AttrSTM
gR AttrREP
gN AttrREG
gA AttrLUK
pM AttrRGE
pC AttrCON
pI AttrADR
pW AttrAGI
pA AttrRSH
pD AttrREF

^UPGRADES /* --------------------------------------------------------------- */

pM HeadsUpDisp -> OFMD
pM JetBooster -> OFMD
pM ReflexWetw -> OFMD
pM CyberLegs -> OFMD
pM Yh0 -> DurlaPrime
pM DefenseNuke -> OFMD
pM Adrenaline -> KSKK

pC HeadsUpDispJem -> AOF
pC ReflexWetwJem -> AOF
pC Magic
pC SoulCleaver
pC StealthSys

gO VitalScanner -> KSKK
gO AutoReload -> KSKK

^PLACES /* ----------------------------------------------------------------- */

gO AetosVi
pC Algidistari
gO ChAri -> AetosVi
pM DurlaPrime -> Earth AetosVi
gO Earth
pC Heaven
gA Hell -> Earth
gO Mars -> Earth OFMD
gO OmicronXevv
gA ReverseAce
pM SuperDimension -> BFG9000 /* SIGFPE */
gA Tsukama

^CORPORATIONS /* ----------------------------------------------------------- */

gO AllPoint
pM AOF
pC AOFJem
pM Cid -> SuperDimension Earth
pM Facer
gA JAQTen -> Tsukama
gA JJJ
pM KSKK -> Earth
pC KSKKJem -> Earth
gO MDDO -> Mars OFMD
pC Newvec -> Earth
pM OFMD
pC OFMDJem
gO Omakeda -> Earth
gO Semaphore -> OmicronXevv
gA ShekaKaff -> Tsukama
gO SYM43 -> AetosVi
pM UnrealArms -> AetosVi
gA Yigan

^WEAPONS /* ---------------------------------------------------------------- */

gO ChargeFist -> KSKK

pM Pistol* -> Omakeda
pM Revolver -> Earth
pM Shotgun -> Omakeda
pM ShotgunUpgr -> Shotgun AOF DurlaPrime
pM ShotgunUpg2 -> Shotgun
pM LazShotgun -> Earth
pM SuperShotgun -> ChAri
pM CombatRifle -> AllPoint
pM RifleUpgr -> CombatRifle
pM RifleUpg2 -> CombatRifle Semaphore
pM SniperRifle -> Facer
pM GrenadeLauncher -> SYM43
pM LauncherUpgr -> GrenadeLauncher UnrealArms
pM LauncherUpg2 -> GrenadeLauncher SYM43
pM PlasmaRifle -> AllPoint MDDO
pM PlasmaUpgr -> PlasmaRifle
pM PlasmaUpg2 -> PlasmaRifle Semaphore
pM BFG9000 -> Cid
pM CannonUpgr -> BFG9000 SuperDimension
pM CannonUpg2 -> BFG9000

pC Mateba* -> AOF
pC MatebaUpgr -> Mateba AOF Algidistari
pC ShockRifle -> ChAri
pC ShockRifUpgr -> ShockRifle
pC ShockRifUpg2 -> ShockRifle
pC SPAS -> AOF Newvec
pC SPASUpgr -> SPAS
pC SPASUpg2 -> SPAS Newvec
pC SMG -> Omakeda SYM43
pC SMGUpgr -> SMG AOF SYM43
pC SMGUpg2 -> SMG AOF
pC SMGUpg3 -> SMG SYM43
pC IonRifle -> KSKK
pC IonRifleUpgr -> IonRifle KSKK
pC IonRifleUpg2 -> IonRifle KSKK
pC CPlasmaRifle -> AllPoint MDDO
pC CPlasmaUpgr -> CPlasmaRifle MDDO
pC StarDestroyer -> Hell
pC ShipGunUpgr -> StarDestroyer
pC ShipGunUpg2 -> StarDestroyer

gO MissileLauncher
gO PlasmaDiffuser -> SYM43 MDDO Semaphore

pC Blade*
pC Delear* -> Earth
pC Feuer
pC Rend
pC Hulgyon -> Heaven
pC StarShot -> AOF
pC Cercle -> Earth

^EXTRA* /* ----------------------------------------------------------------- */

gA Extra1
gA Extra2
gA Extra3
gA Extra4
gA Extra5

/* EOF */

+ 3
- 3
source/d_vm.c View File

@@ -284,8 +284,8 @@ script static void TerminalGUI(struct player *p, u32 tact)
str br;
switch(tact) {
case TACT_LOGON:
case TACT_LOGOFF: br = l_strdup(CanonTime(ct_date)); break;
default: br = st_term_use_to_ack; break;
case TACT_LOGOFF: br = l_strdup(CanonTime(ct_date, ticks)); break;
default: br = st_term_use_to_ack; break;
}
PrintText_str(br, s_ltrmfont, CR_RED, tright,2, tbottom,2);

@@ -354,7 +354,7 @@ script static void DialogueGUI(struct player *p)
PrintText(s_bigupper, CR_GREEN, 30,1, 35,1);

SetClipW(left, top, 263, 157, 263);
PrintTextFmt("\Cd> Remote: %S\n\Cd> Date: %s", srem, CanonTime(ct_full));
PrintTextFmt("\Cd> Remote: %S\n\Cd> Date: %s", srem, CanonTime(ct_full, ticks));
PrintText(s_lmidfont, CR_WHITE, left,1, top,1);
PrintTextChr(textV, textC);
PrintText(s_smallfnt, CR_WHITE, left,1, texttop,1);


+ 1
- 1
source/include/gui.h View File

@@ -76,7 +76,7 @@

#define G_TextBox_OnTextEntered(st) \
__with(cstr txt_buf = Cps_Expand(st->txtbuf, 0, st->tbptr);) \
ifauto(cstr , _c, strchr(txt_buf, '\n')) \
ifauto(cstr, _c, strchr(txt_buf, '\n')) \
__with(size_t txt_len = _c - txt_buf; G_TextBox_Reset(st);)

/* Types ------------------------------------------------------------------- */


+ 12
- 12
source/include/m_memory.h View File

@@ -23,19 +23,19 @@

#if LITH_MEMORY_DEBUG
#include <stdio.h>
#define Calloc(n, s) (Log("%s:%i: Calloc", __FILE__, __LINE__), Calloc_real(n, s))
#define Dalloc(p) (Log("%s:%i: Dalloc", __FILE__, __LINE__), Dalloc_real(p))
#define Nalloc(s) (Log("%s:%i: Nalloc", __FILE__, __LINE__), Nalloc_real(s))
#define Malloc(s) (Log("%s:%i: Malloc", __FILE__, __LINE__), Malloc_real(s))
#define Ralloc(p, s) (Log("%s:%i: Ralloc", __FILE__, __LINE__), Ralloc_real(p, s))
#define Salloc(t) (Log("%s:%i: Salloc", __FILE__, __LINE__), Salloc_real(t))
#include <ACS_ZDoom.h>
#define AllocLog(name) (ACS_BeginPrint(), \
__nprintf("%s:%i: " name, __FILE__, __LINE__), \
ACS_EndLog())
#else
#define Calloc(n, s) Calloc_real(n, s)
#define Dalloc(p) Dalloc_real(p)
#define Nalloc(s) Nalloc_real(s)
#define Malloc(s) Malloc_real(s)
#define Ralloc(p, s) Ralloc_real(p, s)
#define Salloc(t) Salloc_real(t)
#define AllocLog(name) ((void)0)
#endif

#define Calloc(n, s) (AllocLog("Calloc"), Calloc_real(n, s))
#define Dalloc(p) (AllocLog("Dalloc"), Dalloc_real(p))
#define Nalloc(s) (AllocLog("Nalloc"), Nalloc_real(s))
#define Malloc(s) (AllocLog("Malloc"), Malloc_real(s))
#define Ralloc(p, s) (AllocLog("Ralloc"), Ralloc_real(p, s))
#define Salloc(t) (AllocLog("Salloc"), Salloc_real(t))

#endif

+ 0
- 4
source/include/m_stab.h View File

@@ -437,10 +437,6 @@ X(st_term_sgxline, "SGXLine r4205") /* TODO */
X(st_term_use_to_ack, "Use To Acknowledge") /* TODO */

/* Generated */
X(st_bipc_EXTRA, "EXTRA")
#define LITH_X(n, _) X(st_bipc_##n, #n)
#include "p_bip.h"

#define LITH_X(n, pc) X(st_##n, #n) X(st_##pc, #pc)
#include "p_player.h"



+ 1
- 0
source/include/m_str.h View File

@@ -36,6 +36,7 @@ stkcall u32 l_strhash(astr s);
stkcall u32 lstrhash(cstr s);
stkcall char *lstrcpy_str(char *dest, astr src);
stkcall char *lstrcpy2(char *out, cstr s1, cstr s2);
stkcall char *lstrcpy3(char *out, cstr s1, cstr s2, cstr s3);
stkcall i32 lstrcmp_str(cstr s1, astr s2);
stkcall i32 faststrcmp(cstr s1, cstr s2);
stkcall i32 faststrcasecmp(cstr s1, cstr s2);


+ 32
- 59
source/include/p_bip.h View File

@@ -11,77 +11,44 @@
* ---------------------------------------------------------------------------|
*/

#if defined(LITH_X)
LITH_X(WEAPONS, "Weapons")
LITH_X(ENEMIES, "Adversaries")
LITH_X(ITEMS, "Items")
LITH_X(YOURSELF, "Yourself")
LITH_X(UPGRADES, "Upgrades")
LITH_X(PLACES, "Locations")
LITH_X(CORPORATIONS, "Companies")
LITH_X(MAIL, "Mail")
#undef LITH_X
#elif !defined(p_bip_h)
#ifndef p_bip_h
#define p_bip_h

#include "m_list.h"
#include "p_bipname.h"

#define ForCategory() for(i32 categ = BIPC_NONE + 1; categ < BIPC_MAX; categ++)
#define ForPage() for_list(struct page *page, bip->infogr[categ])
#define ForCategoryAndPage() ForCategory() ForPage()
#define for_category() \
for(i32 categ = 0; categ < BIPC_MAX; categ++)

/* Extern Functions -------------------------------------------------------- */

script void P_BIP_PInit(struct player *p);
optargs(1) struct page *P_BIP_Unlock(struct player *p, cstr name);
stkcall void P_BIP_PQuit(struct player *p);
script optargs(1) void P_BIP_GiveMail(struct player *p, str title, i32 flags);
#define for_page() \
for(i32 pagen = 0; pagen < BIP_MAX; pagen++) \
__with(struct page *page = &p->bip.pages[pagen];)

/* Types ------------------------------------------------------------------- */

enum
{
BIPC_NONE,
#define LITH_X(name, capt) BIPC_##name,
#include "p_bip.h"
BIPC_EXTRA,
BIPC_MAX,
BIPC_MAIN,
BIPC_SEARCH
};

enum
{
MAILF_NoPrint = 1 << 0,
MAILF_AllPlayers = 1 << 1,
enum {
_page_unlocked = 0x80000000,
_page_available = 0x40000000,
_page_time = 0x3fffffff,
};

typedef char bip_name_t[20];
typedef bip_name_t bip_unlocks_t[5];

struct page
{
struct pageinfo {
bip_name_t name;
str shname;
str image;
str body;
str title;
i32 height;
i32 category;
bool unlocked;
list link;
bip_unlocks_t unlocks;
i32 category;
i32 pclass;
bool aut;
bip_name_t unlocks[5];
};

struct page_info
{
str shname;
str flname;
str body;
struct page {
struct pageinfo const *info;

u32 flags;
};

struct bip
{
struct bip {
/* Stats */
u32 categoryavail[BIPC_MAX];
u32 categorymax[BIPC_MAX];
@@ -96,20 +63,26 @@ struct bip
bool init;

struct page *curpage;
struct page *result[8];

u32 curcategory;
u32 lastcategory;

struct page *result[8];
u32 resnum;
u32 rescur;

/* Info */
list infogr[BIPC_MAX];
struct page pages[BIP_MAX];
};

/* Extern Objects ---------------------------------------------------------- */

extern struct pageinfo bipinfo[BIP_MAX];

/* Extern Functions -------------------------------------------------------- */

struct page_info PageInfo(struct page const *page);
script void P_BIP_PInit(struct player *p);
void P_BIP_Unlock(struct player *p, cstr name);
stkcall void P_BIP_PQuit(struct player *p);

stkcall cstr P_BIP_CategoryToName(u32 category);

#endif

+ 1
- 1
source/include/w_world.h View File

@@ -103,7 +103,7 @@ extern i32 a_cur;

/* Extern Functions -------------------------------------------------------- */

cstr CanonTime(i32 type);
cstr CanonTime(i32 type, u64 time);
optargs(1) i32 UniqueID(i32 tid);
stkcall void BeginAngles(i32 x, i32 y);
stkcall k32 AddAngle(i32 x, i32 y);


+ 10
- 0
source/m_str.c View File

@@ -66,6 +66,16 @@ stkcall char *lstrcpy2(char *out, cstr s1, cstr s2)
return out;
}

stkcall char *lstrcpy3(char *out, cstr s1, cstr s2, cstr s3)
{
char *p = out;
for(; *s1; s1++) *p++ = *s1;
for(; *s2; s2++) *p++ = *s2;
for(; *s3; s3++) *p++ = *s3;
*p++ = '\0';
return out;
}

stkcall i32 lstrcmp_str(cstr s1, astr s2)
{
register i32 res;


+ 76
- 250
source/p_bip.c View File

@@ -18,305 +18,131 @@
#include "w_world.h"
#include "m_file.h"
#include "m_tokbuf.h"
#include "m_char.h"

/* Types ------------------------------------------------------------------- */
/* Static Functions -------------------------------------------------------- */

struct page_init
{
i32 pclass;
bip_name_t name;
bip_unlocks_t unlocks;
bool isfree;
};
script static void MailNotify(struct player *p, cstr name) {
p->setActivator();

/* Static Functions -------------------------------------------------------- */
p->bip.mailreceived++;

static str DecryptBody(astr s)
{
ACS_BeginPrint();
for(; *s; s++) ACS_PrintChar(!IsPrint(*s) ? *s : *s ^ 7);
return ACS_EndStrParam();
}
ACS_Delay(20);

static void UnlockPage(struct player *p, struct page *page)
{
struct bip *bip = &p->bip;
char remote[64];
strcpy(remote, LanguageC(LANG "INFO_REMOT_%s", name));

if(!page->unlocked) {
bip->pageavail++;
bip->categoryavail[page->category]++;
page->unlocked = true;
p->logB(1, LC(LANG "LOG_MailRecv"), remote);

for(i32 i = 0; i < countof(page->unlocks) && page->unlocks[i][0]; i++)
P_BIP_Unlock(p, page->unlocks[i]);
if(ACS_Random(1, 10000) == 1) {
p->bip.mailtrulyreceived++;
ACS_LocalAmbientSound(ss_player_YOUVEGOTMAIL, 127);
} else {
ACS_LocalAmbientSound(ss_player_cbi_mail, 127);
}
}

optargs(1)
static void AddToBIP(struct player *p, i32 categ, struct page_init const *pinit, bool isfree)
{
struct bip *bip = &p->bip;

str image = LanguageNull(LANG "INFO_IMAGE_%s", pinit->name);
i32 height = strtoi_str(Language(LANG "INFO_SSIZE_%s", pinit->name), nil, 0);

struct page *page = Salloc(struct page);

memmove(page->name, pinit->name, sizeof page->name);
page->category = categ;
page->unlocked = false;
page->image = image;
page->height = height;
memmove(page->unlocks, pinit->unlocks, sizeof page->unlocks);
script static void UnlockPage(struct player *p, struct page *page) {
if(!(page->flags & _page_available)) {
Dbg_Log(log_bip, "page '%s' not available", page->info->name);
return;
}

ListCtor(&page->link, page);
page->link.link(&bip->infogr[categ]);
if(!(page->flags & _page_unlocked)) {
Dbg_Log(log_bip, "unlocking page '%s'", page->info->name);

/* we have to pass along the player's class so discrims don't fuck up */
if(isfree) UnlockPage(p, page);
}
if(page->info->category == BIPC_MAIL && !page->info->aut) {
MailNotify(p, page->info->name);
}

stkcall
static i32 CatFromStr(str name)
{
if(name == st_bipc_EXTRA) return BIPC_EXTRA;
#define LITH_X(n, _) if(name == st_bipc_##n) return BIPC_##n;
#include "p_bip.h"
return BIPC_NONE;
}
page->flags |= ticks;
page->flags |= _page_unlocked;

stkcall
static i32 PClFromStr(str name)
{
#define LITH_X(n, pc) if(name == st_##n || name == st_##pc) return pc;
#include "p_player.h"
return 0;
}
p->bip.pageavail++;
p->bip.categoryavail[page->info->category]++;

script
static struct token *AddPage(struct player *p, struct tokbuf *tb, struct token *tok, i32 categ, bool catfree)
{
struct bip *bip = &p->bip;
struct page_init page = {};

do
page.pclass |= PClFromStr(TokStr(tok));
while(tb->drop(tok_or) && (tok = tb->get()));

tok = tb->get();
memmove(page.name, tok->textV, tok->textC);
page.isfree = tb->drop(tok_mul);

if(tb->drop(tok_rarrow))
for(i32 i = 0; i < countof(page.unlocks) && !tb->drop(tok_lnend); i++)
{
tok = tb->get();
memmove(page.unlocks[i], tok->textV, tok->textC);
for(i32 i = 0;
i < countof(page->info->unlocks) && page->info->unlocks[i][0];
i++) {
P_BIP_Unlock(p, page->info->unlocks[i]);
}
} else {
Dbg_Log(log_bip, "already unlocked page '%s'", page->info->name);
}

if(categ != BIPC_NONE && p->pclass & page.pclass)
AddToBIP(p, categ, &page, page.isfree || catfree);

return tok;
}

static i32 LoadBIPInfo(struct player *p, str fname)
{
struct tokbuf tb = {
.bbeg = 4, .bend = 10,
.fp = W_Open(fname, c"r"),
.tokProcess = TBufProcL
};
if(!tb.fp) return 0;

TBufCtor(&tb);

bool catfree = false;
i32 categ = BIPC_NONE;
i32 total = 0;

for(struct token *tok; (tok = tb.get())->type != tok_eof;) switch(tok->type)
{
case tok_lnend:
continue;
case tok_xor:
/* ^ Category [*] */
tok = tb.get();
categ = CatFromStr(TokStr(tok));
catfree = tb.drop(tok_mul);
break;
case tok_identi:
/* Classes... Name [*] [-> Unlocks...] */
tok = AddPage(p, &tb, tok, categ, catfree);
total++;
break;
static u32 NameToNum(cstr discrim, cstr name) {
for(u32 i = 0; i < BIP_MAX; i++) {
bip_name_t tag;
lstrcpy2(tag, name, discrim);
if(!faststrcmp(bipinfo[i].name, tag) ||
!faststrcmp(bipinfo[i].name, name)) {
return i;
}
}

TBufDtor(&tb);
fclose(tb.fp);

return total;
}

static struct page *FindPage(struct bip *bip, cstr name)
{
if(!name) return nil;
ForCategoryAndPage() if(faststrcmp(page->name, name) == 0) return page;
return nil;
return BIP_MAX;
}

/* Extern Functions -------------------------------------------------------- */

script
void P_BIP_PInit(struct player *p)
{
struct bip *bip = &p->bip;

ForCategory()
ListDtor(&bip->infogr[categ], true);

i32 total = LoadBIPInfo(p, sp_lfiles_BIPInfo);
if(dbglevel) p->logH(1, "There are %i info pages!", total);

ForCategory()
bip->pagemax += bip->categorymax[categ] = bip->infogr[categ].size();

if(dbgflag & dbgf_bip) ForCategoryAndPage() UnlockPage(p, page);

bip->init = true;
}

script
void P_BIP_GiveMail(struct player *p, str title, i32 flags)
{
/* Note: Due to the way this code works, if you switch languages at runtime,
* mail won't be updated. I provide a lore answer (excuse) for this: When
* you switch languages, it switches the preferred translation service for
* delivered mail, but it's done when the mail is delivered due to a bug in
* the BIP software. All of the mail in the game is delivered to the player
* in Sce, a south-eastern sector language, but the player themself can't
* read this language and so it is translated for them into the actual
* language that the person behind the screen reads.
*
* If you can actually read Sce this answer falls apart but *shhhhh*.
*/

p->setActivator();

flags |= strtoi_str(Language(LANG "MAIL_FLAG_%S", title), nil, 0);
flags |= strtoi_str(Language(LANG "MAIL_FLAG_%S%s", title, p->discrim), nil, 0);

if(!(flags & MAILF_AllPlayers)) title = StrParam("%S%s", title, p->discrim);

struct bip *bip = &p->bip;
script void P_BIP_PInit(struct player *p) {
if(dbglevel) p->logH(1, "There are %u info pages!", BIP_MAX);

struct page *page = Salloc(struct page);
p->bip.pagemax = 0;

str date = LanguageNull(LANG "MAIL_TIME_%S", title);
str size = LanguageNull(LANG "MAIL_SIZE_%S", title);
str send = LanguageNull(LANG "MAIL_SEND_%S", title);
str name = LanguageNull(LANG "MAIL_NAME_%S", title);
str body = Language (LANG "MAIL_BODY_%S", title);

if(!send) send = L(st_mail_internal);

page->shname = date ? date : l_strdup(CanonTime(ct_short));
page->title = name ? name : L(st_mail_notitle);
page->body = StrParam(LC(LANG "MAIL_TEMPLATE"), send, CanonTime(ct_full), body);
page->category = BIPC_MAIL;
page->unlocked = true;

if(size) page->height = strtoi_str(size, nil, 0);
for_category() {
p->bip.categorymax[categ] = 0;
}

ListCtor(&page->link, page);
page->link.link(&bip->infogr[BIPC_MAIL]);
for_page() {
page->info = &bipinfo[pagen];
page->flags = 0;

bip->mailreceived++;
bool avail = page->info->pclass & p->pclass;

if(!(flags & MAILF_NoPrint)) {
ACS_Delay(20);
if(avail) {
page->flags = _page_available;

p->logB(1, LC(LANG "LOG_MailRecv"), send);
p->bip.pagemax++;
p->bip.categorymax[page->info->category]++;

if(ACS_Random(1, 10000) == 1) {
bip->mailtrulyreceived++;
ACS_LocalAmbientSound(ss_player_YOUVEGOTMAIL, 127);
} else {
ACS_LocalAmbientSound(ss_player_cbi_mail, 127);
if(dbgflag & dbgf_bip || page->info->aut) {
UnlockPage(p, page);
}
}
}

p->bip.init = true;
}

struct page *P_BIP_Unlock(struct player *p, cstr name)
{
struct bip *bip = &p->bip;
struct page *page = FindPage(bip, name);
void P_BIP_Unlock(struct player *p, cstr name) {
u32 num = NameToNum(p->discrim, name);

if(!page) {
bip_name_t tag = {}; strcpy(tag, name); strcat(tag, p->discrim);
page = FindPage(bip, tag);
}

if(page && !page->unlocked) {
Dbg_Log(log_bip, "adding page '%s'", name);
UnlockPage(p, page);
} else if(!page) {
if(num == BIP_MAX) {
Dbg_Log(log_bip, "no page '%s' found", name);
return;
}

return page;
UnlockPage(p, &p->bip.pages[num]);
}

stkcall
void P_BIP_PQuit(struct player *p)
{
struct bip *bip = &p->bip;
ForCategory() ListDtor(&bip->infogr[categ], true);
bip->init = false;
stkcall void P_BIP_PQuit(struct player *p) {
p->bip.init = false;
}

struct page_info PageInfo(struct page const *page)
{
struct page_info pinf;

pinf.shname = page->shname
? page->shname
: Language(LANG "INFO_SHORT_%s", page->name);

pinf.body = page->body
? page->body
: Language(LANG "INFO_DESCR_%s", page->name);

pinf.flname = page->title
? page->title
: Language(LANG "INFO_TITLE_%s", page->name);

if(page->category == BIPC_EXTRA)
pinf.body = DecryptBody(pinf.body);

if(pinf.body[0] == '#') {
bool top = false;

ACS_BeginPrint();
ACS_BeginPrint();

for(i32 i = 1, l = ACS_StrLen(pinf.body); i < l; i++) {
if(!top && pinf.body[i] == '\n') {top = true; ACS_PrintString(L(ACS_EndStrParam()));}
ACS_PrintChar(pinf.body[i]);
}

pinf.body = ACS_EndStrParam();
stkcall cstr P_BIP_CategoryToName(u32 category) {
switch(category) {
#define Categ(name) case BIPC_##name: return #name;
Categ(SEARCH);
#include "p_bipname.h"
}

return pinf;
return nil;
}

/* Scripts ----------------------------------------------------------------- */

script_str ext("ACS") addr("Lith_BIPUnlock")
void Sc_UnlockPage(void)
{
void Sc_UnlockPage(void) {
with_player(LocalPlayer) {
bip_name_t tag; lstrcpy_str(tag, ServCallS(sm_GetBipName));
P_BIP_Unlock(p, tag);


+ 0
- 2
source/p_data.c View File

@@ -337,8 +337,6 @@ script void P_Init(struct player *p) {
p->logH(1, LC(LANG "LOG_StartGame"), sc_k_opencbi);
}

P_BIP_GiveMail(p, st_mail_intro);

if(GetFun() & lfun_division) {
Str(divsigil, sOBJ "DivisionSigil");
k32 a = ACS_GetActorAngle(0);


+ 194
- 161
source/p_gui_bip.c View File

@@ -11,157 +11,86 @@
* ---------------------------------------------------------------------------|
*/

#define _GNU_SOURCE /* Needed for strcasestr. See: man 7 feature_test_macros */

#include "common.h"
#include "p_player.h"
#include "p_bip.h"
#include "m_list.h"
#include "m_char.h"

static void SetCurPage(struct gui_state *g, struct bip *bip, struct page *page, str body)
{
bip->curpage = page;
/* Static Functions -------------------------------------------------------- */

G_TypeOn(g, &CBIState(g)->biptypeon, body);
G_ScrollReset(g, &CBIState(g)->bipinfoscr);
static cstr EncryptedBody(struct page *p) {
char *s = LanguageC(LANG "INFO_DESCR_%s", p->info->name);
for(; *s; s++) *s = !IsPrint(*s) ? *s : *s ^ 7;
return s;
}

script
static bool CheckMatch(struct page_info *pinf, str query)
{
return strcasestr_str(pinf->shname, query) ||
strcasestr_str(pinf->flname, query) ||
strcasestr_str(pinf->body, query);
}
static cstr MailBody(struct page *p) {
noinit static char body[8192];

static void MainUI(struct gui_state *g, struct player *p, struct bip *bip)
{
i32 n = 0;
char remote[64];
strcpy(remote, LanguageC(LANG "INFO_REMOT_%s", p->info->name));

PrintText_str(st_info_categories, s_smallfnt, CR_PURPLE, 40,1, 70,1);
cstr sent = CanonTime(ct_full, p->flags & _page_time);

bip->lastcategory = BIPC_MAIN;
sprintf(body, LanguageC(LANG "MAIL_TEMPLATE"), remote, sent);
strcat(body, "\n\n");
strcat(body, LanguageC(LANG "INFO_DESCR_%s", p->info->name));

#define LITH_X(name, capt) { \
Str(st, sLANG "BIP_HELP_" capt); \
PrintTextA_str(L(st), s_smallfnt, CR_WHITE, 105,1, 85+n,1, 0.7); \
n += 10; \
}
LITH_X(SEARCH, "Search")
#include "p_bip.h"
n = 0;

if(G_Button(g, LC(LANG "BIP_NAME_Search"), 45, 85 + n, Pre(btnbipmain)))
bip->curcategory = BIPC_SEARCH;
n += 10;
#define LITH_X(name, capt) \
if(G_Button_Id(g, BIPC_##name, LC(LANG "BIP_NAME_" capt), 45, 85 + n, Pre(btnbipmain))) \
{ \
bip->curcategory = BIPC_##name; \
bip->curpage = nil; \
} \
n += 10;
#include "p_bip.h"
return body;
}

static void SearchUI(struct gui_state *g, struct player *p, struct bip *bip)
{
struct gui_txt *st = G_TextBox(g, &CBIState(g)->bipsearch, 23, 65, p);

bip->lastcategory = BIPC_MAIN;

G_TextBox_OnTextEntered(st)
{
/* That's a lot of numbers... */
u64 const extranames[] = {
0x5F38B6C56F0A6D84L,
0x90215131A36573D7L,
0xC54EC0A7C6836A5BL,
0xB315B81438717BA6L,
0x9FD558A2C8C8D163L,
};

str query = l_strndup(txt_buf, txt_len);
u64 crc = crc64(txt_buf, txt_len);

bip->resnum = bip->rescur = 0;

for(i32 i = 0; i < countof(extranames); i++)
{
if(crc == extranames[i])
{
list *link = bip->infogr[BIPC_EXTRA].next;
for(i32 j = 0; j < i; j++)
link = link->next;
bip->result[bip->resnum++] = link->object;
}
}

ForCategoryAndPage()
{
if(bip->resnum >= countof(bip->result))
break;

if(!page->unlocked || page->category == BIPC_EXTRA)
continue;

struct page_info pinf = PageInfo(page);
static cstr GetShortName(struct page *p) {
if(p->info->category == BIPC_MAIL) {
return CanonTime(ct_short, p->flags & _page_time);
} else {
return LanguageC(LANG "INFO_SHORT_%s", p->info->name);
}
}

if(CheckMatch(&pinf, query))
bip->result[bip->resnum++] = page;
}
static cstr GetFullName(struct page *p) {
return LanguageC(LANG "INFO_TITLE_%s", p->info->name);
}

if(bip->resnum == 0)
ACS_LocalAmbientSound(ss_player_cbi_findfail, 127);
static cstr GetBody(struct page *p) {
switch(p->info->category) {
case BIPC_EXTRA: return EncryptedBody(p);
case BIPC_MAIL: return MailBody(p);
}
return LanguageC(LANG "INFO_DESCR_%s", p->info->name);
}

if(bip->resnum)
{
for(i32 i = 0; i < bip->rescur; i++)
{
struct page *page = bip->result[i];
struct page_info pinf = PageInfo(page);
char flname[128]; lstrcpy_str(flname, pinf.flname);

if(G_Button_Id(g, i, flname, 70, 95 + (i * 10), Pre(btnbipmain)))
{
bip->lastcategory = bip->curcategory;
bip->curcategory = page->category;
SetCurPage(g, bip, page, pinf.body);
}
}
static void SetCurPage(struct gui_state *g, struct player *p, struct page *page) {
str body = l_strdup(GetBody(page));

if((ACS_Timer() % ACS_Random(10, 20)) == 0 &&
bip->rescur != bip->resnum)
{
if(++bip->rescur == bip->resnum)
ACS_LocalAmbientSound(ss_player_cbi_finddone, 127);
else
ACS_LocalAmbientSound(ss_player_cbi_find, 127);
}
}
else
PrintText_str(st_no_results, s_smallfnt, CR_DARKGREY, 70,0, 95,0);
p->bip.curpage = page;

G_TypeOn(g, &CBIState(g)->biptypeon, body);
G_ScrollReset(g, &CBIState(g)->bipinfoscr);
}

static void DrawPage(struct gui_state *g, struct player *p, struct bip *bip)
{
struct page *page = bip->curpage;
struct page_info pinf = PageInfo(page);
static void DrawPage(struct gui_state *g, struct player *p, struct page *page) {
str image = LanguageNull(LANG "INFO_IMAGE_%s", page->info->name);
i32 height = strtoi_str(Language(LANG "INFO_SSIZE_%s", page->info->name), nil, 10);

struct gui_typ const *typeon = G_TypeOnUpdate(g, &CBIState(g)->biptypeon);

i32 oy = 0;

if(page->height)
{
G_ScrollBegin(g, &CBIState(g)->bipinfoscr, 100, 40, 200, 180, page->height * 8 + 20, 184);
if(height) {
G_ScrollBegin(g, &CBIState(g)->bipinfoscr, 100, 40, 200, 180,
height * 8 + 20, 184);
oy = g->oy - 40;
}
else
} else {
SetClipW(110, 40, 201, 180, 185);
}

if(page->image) PrintSpriteA(page->image, 296,2, 180,2, 0.4);
if(image) PrintSpriteA(image, 296,2, 180,2, 0.4);

PrintText_str(pinf.flname, s_lmidfont, CR_ORANGE, 111,1, 45 + oy,1);
PrintTextChS(GetFullName(page));
PrintText(s_lmidfont, CR_ORANGE, 111,1, 45 + oy,1);

Str(nl_bar, s"\n|");

@@ -175,8 +104,7 @@ static void DrawPage(struct gui_state *g, struct player *p, struct bip *bip)
PrintText(s_smallfnt, cr, x,1, y+oy,1)

/* render an outline if the page has an image */
if(page->image)
{
if(image) {
cstr txt = RemoveTextColors_str(typeon->txt, typeon->pos);
str s = l_strdup(txt);

@@ -194,73 +122,178 @@ static void DrawPage(struct gui_state *g, struct player *p, struct bip *bip)
__nprintf("%.*S", typeon->pos, typeon->txt);
DrawText(ACS_EndStrParam(), CR_WHITE, 111, 60);

if(page->height) G_ScrollEnd(g, &CBIState(g)->bipinfoscr);
if(height) G_ScrollEnd(g, &CBIState(g)->bipinfoscr);
else ClearClip();
}

static void CategoryUI(struct gui_state *g, struct player *p, struct bip *bip)
{
list *ls = &bip->infogr[bip->curcategory];
size_t n = ls->size();
size_t i = 0;
static void MainUI(struct gui_state *g, struct player *p) {
i32 n = 0;

PrintText_str(st_info_categories, s_smallfnt, CR_PURPLE, 40,1, 70,1);

p->bip.lastcategory = BIPC_MAIN;

#define Categ(name) { \
cstr s = LanguageC(LANG "BIP_HELP_%s", P_BIP_CategoryToName(name)); \
PrintTextChS(s); \
PrintTextA(s_smallfnt, CR_WHITE, 105,1, 85+n,1, 0.7); \
s = LanguageC(LANG "BIP_NAME_%s", P_BIP_CategoryToName(name)); \
if(G_Button_Id(g, name, s, 45, 85 + n, Pre(btnbipmain))) { \
p->bip.curcategory = name; \
p->bip.curpage = nil; \
} \
n += 10; \
}
Categ(BIPC_SEARCH);
for_category() if(categ != BIPC_EXTRA) Categ(categ);
#undef Categ
}

static void CategoryUI(struct gui_state *g, struct player *p) {
u32 categ = p->bip.curcategory;
u32 n = p->bip.categoryavail[categ];

if(categ == BIPC_EXTRA) goto draw;

G_ScrollBegin(g, &CBIState(g)->bipscr, 15, 50, gui_p.btnlist.w, 170, gui_p.btnlist.h * n);

if(bip->curcategory != BIPC_EXTRA)
for_list_it(struct page *page, *ls, i++)
{
u32 i = 0;
for_page() {
if(page->info->category != categ || !(page->flags & _page_available) ||
(categ == BIPC_MAIL && !(page->flags & _page_unlocked)))
continue;

i32 y = gui_p.btnlist.h * i;

if(G_ScrollOcclude(g, &CBIState(g)->bipscr, y, gui_p.btnlist.h))
continue;

struct page_info pinf = PageInfo(page);
bool lock = !(page->flags & _page_unlocked) || p->bip.curpage == page;

char name[128] = "\Ci";
lstrcpy_str(bip->curpage == page ? &name[2] : name, pinf.shname);
strcpy(p->bip.curpage == page ? &name[2] : name, GetShortName(page));

if(G_Button_Id(g, i, name, 0, y, lock, Pre(btnlist)))
SetCurPage(g, p, page);

if(G_Button_Id(g, i, name, 0, y, !page->unlocked || bip->curpage == page, Pre(btnlist)))
SetCurPage(g, bip, page, pinf.body);
i++;
}

G_ScrollEnd(g, &CBIState(g)->bipscr);

if(bip->curpage) DrawPage(g, p, bip);
draw:
if(p->bip.curpage) DrawPage(g, p, p->bip.curpage);
}

void P_CBI_TabBIP(struct gui_state *g, struct player *p)
{
struct bip *bip = &p->bip;
i32 avail, max = 0;
static void SearchUI(struct gui_state *g, struct player *p) {
struct gui_txt *st = G_TextBox(g, &CBIState(g)->bipsearch, 23, 65, p);

p->bip.lastcategory = BIPC_MAIN;

G_TextBox_OnTextEntered(st) {
/* That's a lot of numbers... */
struct extraname {
u64 crc;
u32 num;
};

if(bip->curcategory == BIPC_MAIN)
{
MainUI(g, p, bip);
avail = bip->pageavail;
max = bip->pagemax;
struct extraname const extranames[] = {
{0x5F38B6C56F0A6D84L, BIP_EXTRA_Extra1},
{0x90215131A36573D7L, BIP_EXTRA_Extra2},
{0xC54EC0A7C6836A5BL, BIP_EXTRA_Extra3},
{0xB315B81438717BA6L, BIP_EXTRA_Extra4},
{0x9FD558A2C8C8D163L, BIP_EXTRA_Extra5},
};

u64 crc = crc64(txt_buf, txt_len);

char query[128];
memmove(query, txt_buf, txt_len);
query[txt_len] = '\0';

p->bip.resnum = p->bip.rescur = 0;

for(i32 i = 0; i < countof(extranames); i++) {
if(crc == extranames[i].crc) {
p->bip.result[p->bip.resnum++] = &p->bip.pages[extranames[i].num];
}
}

for_page() {
if(p->bip.resnum >= countof(p->bip.result)) {
break;
}

if(!(page->flags & _page_unlocked) ||
page->info->category == BIPC_EXTRA) {
continue;
}

if(strcasestr(GetShortName(page), query) ||
strcasestr(GetFullName(page), query) ||
strcasestr(GetBody(page), query)) {
p->bip.result[p->bip.resnum++] = page;
}
}

if(p->bip.resnum == 0) {
ACS_LocalAmbientSound(ss_player_cbi_findfail, 127);
}
}
else if(bip->curcategory == BIPC_SEARCH)
SearchUI(g, p, bip);
else
{
CategoryUI(g, p, bip);
avail = bip->categoryavail[bip->curcategory];
max = bip->categorymax[bip->curcategory];

if(p->bip.resnum) {
for(i32 i = 0; i < p->bip.rescur; i++) {
struct page *page = p->bip.result[i];
cstr flname = GetFullName(page);

if(G_Button_Id(g, i, flname, 70, 95 + (i * 10), Pre(btnbipmain))) {
p->bip.lastcategory = p->bip.curcategory;
p->bip.curcategory = page->info->category;
SetCurPage(g, p, page);
}
}

if((ACS_Timer() % ACS_Random(14, 18)) == 0 &&
p->bip.rescur != p->bip.resnum) {
if(++p->bip.rescur == p->bip.resnum) {
ACS_LocalAmbientSound(ss_player_cbi_finddone, 127);
} else {
ACS_LocalAmbientSound(ss_player_cbi_find, 127);
}
}
} else {
PrintText_str(st_no_results, s_smallfnt, CR_DARKGREY, 70,0, 95,0);
}
}

/* Extern Functions -------------------------------------------------------- */

void P_CBI_TabBIP(struct gui_state *g, struct player *p) {
i32 avail, max = 0;

if(p->bip.curcategory == BIPC_MAIN) {
MainUI(g, p);
avail = p->bip.pageavail;
max = p->bip.pagemax;
} else if(p->bip.curcategory == BIPC_SEARCH) {
SearchUI(g, p);
} else {
CategoryUI(g, p);
avail = p->bip.categoryavail[p->bip.curcategory];
max = p->bip.categorymax[p->bip.curcategory];
}

if(bip->curcategory != BIPC_MAIN)
{
if(p->bip.curcategory != BIPC_MAIN) {
/* TODO */
if(G_Button(g, "<BACK", 20, 38, false, Pre(btnbipback)))
bip->curcategory = bip->lastcategory;
}
else
{
p->bip.curcategory = p->bip.lastcategory;
} else {
PrintSpriteA(sp_UI_bip, 20,1, 40,1, 0.1);
PrintText_str(st_bip_header, s_lmidfont, CR_WHITE, 35,1, 40,1);
}

if(max)
{
if(max) {
/* TODO */
PrintTextFmt("%i/%i AVAILABLE", avail, max);
PrintText(s_smallfnt, CR_WHITE, 300,2, 30,1);
}


+ 2
- 2
source/w_time.c View File

@@ -17,10 +17,10 @@

/* Extern Functions -------------------------------------------------------- */

cstr CanonTime(i32 type) {
cstr CanonTime(i32 type, u64 time) {
noinit static char ft[64], st[64], dt[64], lf[256];

i32 t = ticks;
i32 t = time;
i32 s = 53 + t / 35;
i32 m = 30 + s / 60;
i32 h = 14 + m / 60;


+ 6
- 6
source/w_world.c View File

@@ -279,17 +279,17 @@ static void HInit(void)
/* Cluster messages. */
#define Message(cmp, n, name) \
if(cmp && !(msgs & (1 << n))) { \
for_player() P_BIP_GiveMail(p, name); \
for_player() P_BIP_Unlock(p, name); \
msgs |= 1 << n; \
}

static i32 msgs;

Message(Cluster >= 6, 0, st_mail_cluster1);
Message(Cluster >= 7, 1, st_mail_cluster2);
Message(Cluster == 8, 2, st_mail_cluster3);
Message(Cluster == 9, 3, st_mail_secret1);
Message(Cluster == 10, 4, st_mail_secret2);
Message(Cluster >= 6, 0, "MCluster1");
Message(Cluster >= 7, 1, "MCluster2");
Message(Cluster == 8, 2, "MCluster3");
Message(Cluster == 9, 3, "MSecret1");
Message(Cluster == 10, 4, "MSecret2");

if(ACS_GetCVar(sc_sv_nobosses) ||
ACS_GetCVar(sc_sv_nobossdrop) ||


+ 254
- 0
text/Info.txt View File

</
@@ -0,0 +1,254 @@
## -*-Prog-*------------------------------------------------------------------|
##
## Distributed under the CC0 public domain license.
## By Alison Sanderson. Attribution is encouraged, though not required.
## See licenses/cc0.txt for more information.
##
## ---------------------------------------------------------------------------|
##
## Info pages to be processed into C files.
## ; denotes a category.
## + denotes an info page.
##
## ---------------------------------------------------------------------------|

;ENEMIES. # ------------------------------------------------------------------|

+gA ZombieMan
+gA ShotgunGuy
+gA ChaingunGuy

+gA Imp
+gA Demon
+gA Spectre

+gA LostSoul
+gA Mancubus
+gA Arachnotron
+gA Cacodemon

+gA HellKnight
+gA BaronOfHell
+gA Revenant

+gA PainElemental
+gA Archvile
+gA SpiderMastermind
+gA Cyberdemon

+gA Phantom
+gA IconOfSin

;ITEMS # ---------------------------------------------------------------------|

+gA ScoreChip
+gA HealthBonus

+gA AllMap
+pM BackpackStan
+pC BackpackJem
+gA Berserk : JAQTen
+gA Infrared : SYM43
+gA RadSuit : SYM43

+gA Medikit : JJJ
+gA Stimpack : JJJ

+gA KeyDisk : Hell
+gA KeySkull

+gA Fragma
+gA Heart
+gA Invulnerability
+gA Taochyan

+gA ArmStandard : Earth
+gA ArmImproved : SYM43
+gA ArmTeflon : ShekaKaff
+gA ArmDendrite : ShekaKaff
+gA ArmAerodynamic : Yigan
+gA ArmHazMat : Yigan
+gA ArmPinkSilver
+gA ArmMidori : ReverseAce

+pM WeapnInter : OFMD AllPoint
+pM WeapnInte2
+pM ArmorInter
+pM CBIUpgr1 : KSKK
+pM CBIUpgr2 : KSKK

;YOURSELF. # -----------------------------------------------------------------|

+pM P114
+pC OPD2
+pC Info400
+pC Info402
+pC HackInfo

+gA BIP
+pM CBIStan
+pC CBIJem
+pD CBIAri

+gA AttrACC
+gA AttrDEF
+gH AttrSTRHuman
+gR AttrSTRRobot
+gN AttrSTRNonHuman
+gH AttrVIT
+gR|gN AttrPOT
+gH AttrSTM
+gR AttrREP