GearHead/0000755000175000017500000000000010640175276011164 5ustar kaolkaolGearHead/doc/0000755000175000017500000000000010640175276011731 5ustar kaolkaolGearHead/doc/Credits.txt0000644000175000017500000000230110476274414014064 0ustar kaolkaolFor support, promotion, and just being great in general: Igor Savin Bjorn Bergstrom Kornel "Anubis" Kisielewicz Aquillion Johnny DMonic Wyld Karde Michalis Kamburelis Michael Deutschmann Tung Nguyen For the Linux port: Philip Chimento Mikolaj Celuch Philipp Lucas Joseph Larsen For artwork: Mike Horvath Terrain, cursors, major editing of just about everything Condor, Rover Nicolas Rotunno Petrach Paul Pekkarinen Kojedo Piotr Leszczynski Ultari, Zerosaiko Celso Meireles Alves Raptor Omega Vespa, Neko, Osprey, Badger, Wraith, Gigas, many more... Ladene Kosaka Portraits fmunoz.geo Portraits Phil Mun~oz Portraits Unknown Roach For algorithms, bug reports, and other good things: Aaron Lambert ABCGi Alex Duncan Arthur J. O'Dwyer Bohdan Linda Bisyamon45 Christian Schmidt Daniel Lowenstein Dinthalion Gerry Quinn Hansjorg Malthaner Isaac Kuo Joachim Meissner John Q. Smith Jonathan Santaana Kenneth Whitehouse Malte Helmert Michael Sauer Peter Cordes R. Alan Monroe R. Dan Henry Seiya Shanya Almafeta Slava Tom Demuyt Uriah Otting Vasily Savin William Davis GearHead/doc/KnownBugs.txt0000644000175000017500000000251210111132554014370 0ustar kaolkaolOnce using ; to switch targets switched to target not on map, then crashed Mouse movement doesn't work on edge of map; can't leave map Can't get item if in same tile as an obstacle XMoveTowardsSpot sometimes gets stuck on obstacles No way to stop cursor from blinking in ASCII mode on certain OSs If a repair skill is used on a tile, and there's nothing on the tile that needs repairs, and there's also a metaterrain gear on the tile, the normal "You can't find any damage to repair!" message won't be printed. Sometimes in SDL mode character portrait gets forgotten Screen doesn't refresh when trapdoor discovered in ASCII mode Sometimes monsters vanish beneath corpses in ASCII mode NPCs won't run from or avoid fire Amnesia entry story stopped advancing once; no cause found; not replicated ForceChat command can't be called in same line as scene change command If lost battle because of ejection, mecha not lost NPC can't/don't open doors At low play level, enemies difficult to find in random encounters Sometimes model deployed inside closed door, other metaterrain obstacle Can't change mecha while inside of mecha RPG save files from before v0.830 shouldn't be used in new version RPG save files from before v0.700 won't work in new version Using the history command before there are 5 msgs will cause strange display GearHead/doc/TheRules.txt0000644000175000017500000001011310061603210014176 0ustar kaolkaolTHE RULES OF GEARHEAD CONSTRUCTION RULES v1.0 Mecha System INVENTORY RULES *Illegal inventory for master gears must be explicitly excluded *Legal inventory for other types must be explicitly defined Master gears may not equip: MetaTerrain MetaTerrain may not equip: MetaTerrain Mounting Points may equip: weapons, move systems Hands may equip: weapons Arms and Tails may equip: armor, shields Other Modules may equip: armor Weapons may equip (only if they themselves are invcom): WeaponAddOn A gear may only equip one item of any specific type SUBCOMPONENT RULES *Legal subcomponent types must be explicitly defined No two siblings may share the same CyberSlot SAtt At most one movement system of specific type per location At most one support system of specific type per location At most one Module/Body per location (i.e. a mek can only have one body) At most one holder of specific type per location, except... Module/Body may have up to two holders installed At most one ammunition gear per location Mecha may have as subcoms: Modules, Modifiers (mecha type only) Body Modules may have: Cockpits, Weapons, MoveSys, Holders (Mount), Sensors, Support, Electronics Arm Modules may have: Cockpits, Weapons, MoveSys, Holders (Mount + Hand), Sensors, Electronics Other Modules may have as subcoms: Cockpits, Weapons, MoveSys, Holders (Mount), Sensors, Electronics Characters may have as subcoms: Modules, Modifiers (chara type only) Cockpits may have as subcoms: Characters Physical Shields may have as subcoms: Weapons External Armor may have as subcoms: Weapons, Movement Systems, Electronics Weapon/Projectile may have as subcoms: Ammo/Projectile Weapon Add-Ons may have as subcoms: Weapons Weapon/Missile may have as subcoms: Ammo/Missile Props may have any gears as subcoms If cockpit located in head, +1 bonus to MV and TR Armor value of any component may not exceed Mecha Size Mecha must have exactly one Body module Size of Body module must equal size of Mecha Modules may be no larger than Mecha Size + 1 Ammunition in a Weapon can't exceed the magazine rating Modules size may be in the range from 1 to 10 Mecha size may be in the range from 1 to 10 Weapon size may be in the range from 1 to 25 Mecha must have exactly one cockpit Any module may have at most one weapon mount Any module may have at most one hand Hands may only be mounted in Arm modules Support Systems may only be mounted in Body Only one support system of each type may be mounted Engine size must be the same as mecha size ExArmor may range in size from 0 to 10 Shields may range in size from 1 to 10 Props may range in size from 1 to 100 if total wing points >= mecha size, 25% bonus to flight Storage modules get a +2 bonus to armor rating MOVEMENT SYSTEMS Legs: Full movement rate is attained when S(Legs) + N(Legs) = S(Body) * 2 Movement is lost when the total number of functional legs drops to half EXPERIENCE RULES +1 XP for avoiding attack +1 XP for hitting target +5 XP for destroying target master gear +1 XP for destroying other gear +1 XP per natural Measure Of Success ADVANCEMENT RULES Skills may be improved up to rank 15 Attributes may be improved if sufficient skill ranks are met ADVENTURE STRUCTURE Adventure Gear Sub Scene Gears Sub Map Features Teams Personas Inv NPCs Items End Inv Plot Gears Sub Meta-Personas Plot Gears Inv NPCs to be placed during plot Items to be placed during plot end Dynamic Scene Gears { Note that dynamic scenes may be defined } { exactly as regular scene gears, but they get } { deleted after the player exits them. } Global NPCs { These NPCs can potentially appear in } { multiple scenes, as defined by their } { Locations SAtt. Also, if they are either } { allies or enemies of the PC, they can } { possibly appear in Dynamic encounters. } Faction Gears end GearHead/doc/Character.txt0000644000175000017500000001577110231364140014363 0ustar kaolkaol************************************* *** GEARHEAD CHARACTER MANUAL *** ************************************* This file describes the stats and skills which are available to GearHead characters. There's a lot of information here, so if this is your first time playing you may be better off just reading the introduction.txt file and coming back to this one after you have a bit more experience. ************************** *** CHARACTER STATS *** ************************** 01. Reflexes If an action has to do with fine motor control, chances are that it will be based on Reflexes. 02. Body Feats of strength, endurance, and physical conditioning are governed by Body. This also determines your health points and how much equipment you can carry. 03. Speed If an action involves either movement or reaction time, chances are that it will be based on Speed. 04. Perception Noticing things and feats of spatial perception are covered by Perception. 05. Craft Creating items, repairing things, and using tools are all actions which are based on Craft. 06. Ego Actions involving force of will are based on Ego. 07. Knowledge Knowledge determines how many skills your character can learn without receiving an experience penalty. 08. Charm The ability to get along well with other people without holding a gun to their head is determined by Charm. ********************* *** THE SKILLS *** ********************* 01. Mecha Gunnery (Reflexes) This skill is used when attacking with projectile or beam weapons which do Class 10 Damage or less. 02. Mecha Artillery (Perception) This skill is used when attacking with missiles or ranged weapons which do Class 11 Damage or greater. 03. Mecha Weapons (Reflexes) This skill is used when attacking with mecha-mounted close combat weapons. It is also used to parry with a weapon or shield. 04. Mecha Fighting (Speed) This skill is used when attacking with a mecha's arms, legs, and other limbs. 05. Mecha Piloting (Reflexes) The ability to control a mecha and, quite importantly, to evade enemy fire. 06. Small Arms (Reflexes) This skill covers rifles and pistols with a Damage Class or 10 or lower. 07. Heavy Weapons (Perception) This skill covers personal missile launchers, miniguns, and other large human scale weapons. It also covers the use of most grenades. 08. Armed Combat (Reflexes) This skill covers swords, knives, axes, spears, and other close combat weapons. It is also used to parry with a weapon or shield. 09. Martial Arts (Body) The use of one's own body parts as weapons. 10. Dodge (Speed) The ability to get out of the way in a hurry. 11. Awareness (Perception) The ability to notice things at a distance. In game terms, the ability to spot enemy units while they are behind cover. 12. Initiative (Speed) This skill helps to determine how quickly a character can attack in combat. 13. Vitality (Body) An experienced character's learned resistance to pain and injury. This skill increases a character's health points. 14. Survival (Craft) The ability to survive if lost in the woods. 15. Mecha Repair (Craft) The ability to fix mecha. 16. Medicine (Knowledge) A doctor's ability to treat long term illness and injury. If a limb is reduced to 0 HP, medical skill may be used to treat it. 17. Electronic Warfare (Craft) The ability to use ECM and other EW systems. 18. Spot Weakness (Craft) This skill improves the chance of scoring a critical hit in combat. It doesn't work when making burst fire attacks. 19. Conversation (Charm) This skill determines interaction rolls while chatting politely. Also, if you have a high conversation skill NPCs are more likely to provide useful information while chatting. 20. First Aid (Craft) Knowledge of emergency medicine, and the ability to treat injuries while in the field. 21. Shopping (Charm) A combination of bargain hunting and haggling. A character with this skill will ensure the lowest possible price for any purchase. 22. Bio Technology (Knowledge) This skill covers the repair and maintenance of advanced biological constructs. 23. General Repair (Craft) This skill allows a character to fix most kinds of human scale equipment. 24. Cybertech (Ego) Sort of a cross between medicine and mecha tech, Cybernetics is the science of augmenting human bodies with mechanical components. This skill is needed to prevent the side effects associated with excessive cybernetics use. 25. Stealth (Speed) This skill allows a character to hide more effectively. It is automatically used if the character is in some terrain which provides cover, and if the character is traveling at cruise speed or slower. 26. Athletics (Body) This skill allows a character to perform physically tiring actions for a longer time than normally possible. It increases the number of stamina points available. 27. Flirtation (Charm) A character with this skill can get a better reaction from NPCs of the opposite gender. 28. Intimidation (Ego) The ability to make threats which will be believed. This skill is often used when dealing with unfriendly NPCs. It may also be used when your PC is trying to sound like a tough guy (or gal). 29. Science (Knowledge) This skill covers knowledge of physics, chemistry, and biology. It might not be a particularly useful skill for a mecha pilot, but everyone needs a hobby. This skill is sometimes used when talking with NPCs about scientific matters. 30. Concentration (Ego) A character with this skill is better able to work at mentally challenging tasks. It increases the number of mental points available. 31. Mecha Engineering (Knowledge) Used when altering a mecha. 32. Code Breaking (Craft) Ability to circumvent locks, passwords, and other security measures. 33. Weight Lifting (Body) Increases the amount of equipment your character may carry. 34. Mysticism (Ego) Knowledge about religion and spiritual matters. 35. Performance (Charm) Ability to play musical instruments and otherwise entertain people. Using this skill costs both SP and MP. 36. Resistance (Ego) Improves your chance to avoid negative status effects such as poisoning, burns, and so on. Also helps to keep your character in good spirits when the going gets rough. 37. Investigation (Perception) Ability to spot hidden doors and locate clues. 38. Robotics (Knowledge) Ability to construct robot pets from spare parts. Using this skill costs mental points and, of course, the parts. 39. Leadership (Charm) This skill increases the number of lancemates who may accompany you at one time. 40. Dominate Animal (Ego) You can tame wild animals. 41. Pick Pockets (Craft) You can steal money and items from NPCs. Using this skill is a chaotic act, and is likely to make you somewhat unpopular. GearHead/doc/ASL_messages.txt0000644000175000017500000000632610020571630014771 0ustar kaolkaol******************************* *** HOW MESSAGES WORK *** ******************************* Messages just got a bit more complex. So much so, in fact, that they now require their very own document. The ArenaScript message system will now support random message lists and conditional messages. The best part is, these changes are entirely backwards-compatable. I'm hoping that these new capabilities will make the writing of dialogues much easier. There are two kinds of messages covered by these changes: "msg" types and "prompt" types. ADDING MULTIPLE MESSAGES Sometimes it's helpful to have multiple messages which are randomly selected, just to keep the NPC from saying the same thing every time. To do this, add a new message to the list with the same label base as the original message plus "_" plus a unique identifier. For instance... msg1 msg1_1 msg2 msg2_1 msg2_2 prompt1 prompt1_1 One of the messages will be chosen at random. Theoretically there's an equal probability of each, unless conditions are used as well. ADDING MESSAGE CONDITIONS A condition may be added to any primary or secondary message by attaching a separate condition line to the list. A condition line has the same label as the message, but starts with "C". for example... msg1 Cmsg1 The Accept command is used in the condition to indicate that it has been accepted. Duh. If a condition is attached to the primary message, then it must be true or no message at all can be returned. Conditions applied to secondary messages apply only to that message. For example: msg1 CMsg1 msg1_1 Cmsg1_1 If V1 > 0, the primary condition is met, so msg1 can be printed. If V1=1, the condition for msg1_1 is also met, so it may be printed as well. If V1=2 then the primary condition is met so msg1 may be printed, but the condition for msg1_1 is failed so it won't be. All the messages whose conditions are met may be printed. One message from the accepted group will be chosen at random. Obviously, you should try to make sure that there's at least one message that will guaranteeably be printed, otherwise the NPC could end up saying nothing. With prompts, that may not be a bad thing, since an empty prompt won't be added to the menu. PRACTICAL EXAMPLE My first example, taken from the Mecha Sporch arena manager... Msg1_1 CMsg1_1 Msg1_2 CMsg1_2 Note that there is no primary message. If the PC's reaction score is over 20, he gets one message. If it's 20 or lower he gets a different one. Alternate messages may be added based on personality traits or anything else. GearHead/doc/terrain list.txt0000644000175000017500000000127210011360764015062 0ustar kaolkaol 1. Open Ground 2. Light Forest 3. Heavy Forest 4. L1 Water 5. Rubble 6. Pavement 7. Swamp 8. L1 Hill 9. L2 Hill 10. L3 Hill 11. Rough Ground 12. Low Wall 13. Residential Wall 14. Stone Floor 15. Stone Wall 16. Generic Floor 17. Dirt 18. Hospital Wall 19. Threshold 20. Blue Carpet 21. L2 Water 22. L3 Water 23. Generic Wall 24. Gold Wall 25. Red Carpet 26. Wooden Floor 27. Wooden Wall 28. Tile Floor 29. (Rusty) Steel Wall 30. Marble Floor 31. Earth Wall 32. Shop Wall 33. Fortress Wall 34. (Shiny) Steel Wall 35. Industrial Wall 36. (tawdry) Shop Wall 37. Restaurant Wall 38. Garage Wall 39. Sand 40. Wreckage 41. Organic Floor 42. Organic Wall GearHead/doc/Config.txt0000644000175000017500000001140210364713542013672 0ustar kaolkaolCONFIGURATION FILE SUPPORT GearHead now has configuration file support. Yay! To create a configuration file, make a new text file named "arena.cfg" in the same directory as the arena executable. To this file you can add various labels which will alter the behavior of the program. Here's an overview of what the configuration file is capable of: REDEFINE GAME KEYS To redefine a game key, you're going to have to know the command's proper name. This can be found via the in-game help menu. Just type the command's name followed by the new key you want to use for it. For instance, to redefine the ApplySkill command so that it is activated by the "n" key, you'd use the following line: ApplySkill n Note that no checking is done to ensure that the keys are unique. If you assign two commands to the same key, only one of them will work. CONTROL ANIMATION SPEED You can redefine the animation speed, if you'd like combat animations to proceed faster or slower. To change the animation delay to 100 you'd use the following line: AnimSpeed 100 Note that the lower the AnimSpeed value, the faster the animations will be. Default values are 100 for ASCII and 50 for SDL. SET CONTROL TYPES There are three commands that cover this: MechaControl, CharaControl, and WorldControl. Each one can be assigned either M for Menu-based input or R for RogueLike input. For example, to change things so that your mecha is controlled using the RogueLike interface, use the following line: MechaControl R SET WEAPON ATTACK OPTION You can set the default burst value for each type of burst-firing weapon. There are three commands that cover this: MissileBV, BallisticBV, and BeamGunBV. They can be assigned four possible values: Off, 1/4, 1/2, and Max. To set the default missile BV to 1/2 load, use the following line: MissileBV 1/2 CONTROL DIRECT XP By default, direct skill XP will not cause the PC to learn new skills. This is to prevent the PC from learning unwanted skills. If you would like to enable the learning of skills from direct XP, add the following label to your configuration file: DIRECTSKILLOK NOAUTOSAVE Whenever your character visits a new location, the campaign is saved to disk. Some people don't like this behavior... using the label NOAUTOSAVE will disable this. ALWAYS SAVE CHARACTER Normally, when a character enters an adventure, the CHA file is deleted and doesn't get restored until the adventure is finished. By setting the label ALWAYSSAVECHARACTER you can override this behavior. DISABLE COMBAT TAUNTS If the game runs slowly on your computer, disabling combat taunts may help. Yes, it's pathetic, I know... type NOCOMBATTAUNTS in your config file to achieve this. CONTROL ALPHA BLENDING For SDL mode only. If you don't like the transparency effect, or it it doesn't run well on your computer, use NOALPHA to disable it. You can set the amount of transparency with "ALPHALEVEL x"- enter a value from 0 (transparent) to 255 (opaque). CONTROL NUMBER OF PLOTS PER ADVENTURE The number of plots currently in play can have a great effect on the speed of your game. The default maximum number of plots is 50; to reduce this (and hopefully get things moving faster) use "NUMPLOTS x". For example, to reduce the maximum number of plots to 30, insert the following line in the config file: NUMPLOTS 30 LIMIT PLOT LOADING TO START OF SCENE Normally the game will load new plots every 5 minutes. This may cause a noticeable pause on some computers. To change things so that plots are only loaded when entering or exiting a scene, add LoadPlotsAtStart to your config file. CONTROL SIZE OF ASCII SCREEN You can control the size of the screen with SCREENWIDTH and SCREENHEIGHT. The minimum size for the screen is 80x25. ACTIVATE MINI-MAP You can activate the mini-map by adding MINIMAPON to your config file. PLAY IN WINDOW You can play in a window on your main screen by adding WINDOW to the config file. You can play in fullscreen mode by adding FULLSCREEN to the config file. DISABLE MOUSE You can disable the mouse with the NOMOUSE option. ENABLE NAMES-ABOVE_HEADS Add NAMESON to your config file, and the names of all gears on the map will appear above their heads. DISABLE PILLAGING Add NOPILLAGE to your config file to not automatically pillage everything on the map after winning a mission. ENABLE TACTICS MODE [experimental] Add USETACTICSMODE to the config file, and the player will be able to control lancemates directly in mecha combat. This mode is experimental and may result in the game crashing or other unexpected behavior. You have been warned. GearHead/doc/MDLref.txt0000644000175000017500000001237107512703230013576 0ustar kaolkaolSPECIFICATIONS FOR THE GEARHEAD MECHA DESCRIPTION LANGUAGE (MDL) % {Comments} - Any line whose first significant character is a % will be treated as a comment and its content ignored Adventure - This command creates a new Adventure gear - Equivalent to GEAR GG_Adventure,0,0 Arch {Archetype Name} - This command is used to create a new CHARACTER gear with string attribute Name - This may be used to create a list of character types for use in a scenario, without needing to define each NPC individually. ARMOR {Value} - Declares armor value for a module - The armor value may be no greater than mecha size Attribute <{String}> - The format for declaring a string attribute is as above - The string part of the attribute must be enclosed in alligator mouths as shown - If a line of the file contains a < character, the entire line is treated as a string attribute and its contents stored as such Chara - Creates a new character GEAR - Equivalent to GEAR GG_Chara,0,0 - Characters may only be subcomponents to cockpits - Default scale 0, default nature MEAT CharDesc - Allows certain aspects of a Character gear to be set. - Gender and personality traits may be set using this command. - OLD may be used to set character age past 40, YOUNG to set character age under 20. CPIT - Declares a cockpit gear END - Returns to parent of active gear GATE {ID} - Adds a MapFeature/Gate to a SCENE gear. - Equivalent to GEAR GG_MapFeature GS_Gate ID - EVENT string attribute can record custom script to be executed upon entry GEAR {G} {S} {V} - Lazy way to declare a gear record - New GEAR is placed as the sibling of the current GEAR Mass {Adjust Value} - Changes the mass of the current gear by a positive or negative amount. Mecha {Form} {Size} - Creates a new mecha GEAR - Functionally equivalent to GEAR GG_Mecha,Form,Size - Size may be from 1 to 10 - Mecha may only be subcomponents to submecha cockpits - Default scale 2, default nature METAL MOD {Module Type} - Creates new module as subcom of current PRIMARY - Modules must be placed as either root items or as the subcoms of masters NPC {Archetype Name} - Loads the archetype file, copies the desired NPC type, and gives it a random name. - NPC cannot be the first gear-producing command in a file, in order to prevent possible infinite recursion. PERSONA {CID} - This command creates a new persona gear, which is used when the player tries talking with an NPC - A Character ID can be shared by several NPCs if they react to the PC in exactly the same way. - Assign a CID to an NPC using the SetPersona command. ROOM {Width} {Height} - This command adds a MapFeature/Room to the scene - Dimensions given will be partially randomized SCALE {Scale} - Sets the SCALE field of the current gear - Characters are Scale 0, most mecha are Scale 2 SCENE {Number} {Scale} - Defines a new SCENE gear with the provided ID number SETALLY {ally 1} {ally 2} ... - Sets allied teams for the current team gear - Sets allied factions for the current faction gear (+10 react) SETENEMY {enemy 1} {enemy 2} ... - Sets enemy teams for the current team gear - Sets enemy factions for the current faction gear (-10 react) SETKEYITEM {NID} - Sets a Narrative ID for the current gear. - Key items have special properties; specifically they may be used by scripting language commands. SETPERSONA {CID} - Sets a Character ID for the current gear. SETTEAM {Team ID} - Sets the team for a character or mecha in a scene - Should only be applied to masters, but this is not enforced SIZE {Value} - Set the V field of a gear to Value SKILL {Skill ID Code} {Skill Rank} - Sets a skill for an archetype NPC - Skill ID codes may be found in SKILLMAN.TXT STAT {Slot} {Value} - Lazy way to declare a gear's stats STATLINE {V1} {V2} {V3} ... - Define stats from 1 to N SUB , INV - GEAR declaration which follows is placed as child of current gear PLOT {ID} - Add a new PLOT gear with the provided ID number. - PLOT ID numbers are not meant to be unique identifiers; they will be used for identifying subplots when the plot advances. TEAM {number} - Adds a new team gear with the specified ID number **************************** *** MACRO DEFINITIONS *** **************************** The file GameData\ghpmacro.txt can be used to define commonly used gears. The first character in the macro definition tells what kind of macro it is; the rest are parameters to be fed into whatever kind of thing is being built. "G" = Construct a gear. Parameters G, S, V descriptors. "S" = Assign a stat value. Paramaeters Stat Number, Stat Value. "N" = Assign a numeric attribute. Parameters G, S, V descriptors. A parameter can be a straightforward numeric value, like "5" or "-27". It can also be variable, read from the gear file being loaded, in which case it will be "?". If it is meant to be read from the gear file but has a default value, it should be a "?" followed immediately by the default, like "?9" or "?-27". The easiest way to figure it all out may be to go look at GameData\ghpmacro.txt and see how it's put together. GearHead/doc/xranplot.txt0000644000175000017500000000466110205741230014332 0ustar kaolkaolENEMY TYPE U = Unknown (0) C = Character (1) F = Faction (2) MYSTERY TYPE R = Resolved (0) U = Unknown (1) F = Family Secret (2) A = Amnesia (3) N = PC is Not Human (4) I = Searching for Item (5) BAD THING R = Resolved (0) U = Unknown (1) F = Family died (2) I = Incriminated (3) S = Seeking Revenge (4) X = Ex-Member of Enemy (5) L = Lost Love (not introduced) (6) When the lost love is introduced, change XRB to Resolved STARTING SCENARIOS Family died mysteriously* UFF Lunar refugee* FUS Total Amnesia* UAU Orphan* UFU Ex-Member of Aegis* FUX PLOTS Must gain enemy's attention* C?? F?? Need money for sibling* ?FF ??R Investigate cause* ??F ??I C?? F?? Family home must be reclaimed* ?F? ?R? Plantation under attack* F?? Meet me in two days* ?A? C?? F?? ?N? Assassins!* U?? C?? F?? Have a price on head* F?? Doctor Kim was Kidnapped!* UF? C?? F?? ?N? Enemy sighted in _Loc_ C?? ?F? Must recover artifact ?F? ?R? C?? Must capture witness ??I C?? F?? ??R ??U Answers lie in lab ?N? F?? ?R? Faction must lose F?? Faction strike team in town F?? Archaeological Dig CA? ?N? ?F? Cyclops seeks PC ?N? CR? FR? I didn't do it! C?F C?? F?? Too dangerous to live FR? ENDINGS Must defeat enemy C?? Must destroy faction F?? STANDARDS FOR STORY/PLOT DESIGN % This is the standard controller for the extra-random stories. GoCheckClue GoNoClue Msg5 hour GoLoadEpisode GoCheckHint .xplot .xend .xhint --------------- XRAN_a### plots --------------- Narrative 1 = Enemy (Character) if N1=0, no specific character enemy at the moment Narrative 2 = Enemy (Faction) if N2=0, no specific faction enemy at the moment Narrative 3 = Scene for next episode S101 = Load new episode when S101 = 1 S102 = # PC Wins S103 = Difficulcy Level, load ending when S103>75 S104 = # Wins when level last increased S105 = Have received location clue GearHead/doc/talking.txt0000644000175000017500000000235607474202430014123 0ustar kaolkaol********************** *** CONVERSATION *** ********************** The towns and cities of the GearHead RPG campaign are full of characters for your PC to talk with. ******************************* *** CONVERSATION DISPLAY *** ******************************* The first bar in the conversation display, indicated by a smiley face, represents how much the NPC likes your character. If the bar is green, it means that you are getting along well together. If it's yellow, that means the NPC has no opinion about your character one way or the other. If the bar is red, that means the NPC doesn't like your character, and may even be hostile. The second bar in the conversation display, indicated by "Zz", represents the NPC's patience. ******************************* *** CONVERSATION OPTIONS *** ******************************* Chatting can do a number of useful things for your character. First, it's the best way to improve your reaction score with the NPC. There are numerous benefits to being well-liked. Shopkeepers will lower their prices for you, certain characters may offer you jobs, and you're more likely to hear useful information while chatting. Second, chatting may provide you with some useful rumors. GearHead/doc/ASL_Refernce.txt0000644000175000017500000006755010205741324014725 0ustar kaolkaol================================= *** ARENASCRIPT REFERENCE *** ================================= 0.NOTES This is your guide to the Adventure gear, and how things work internally in the GearHead RPG campaign. There are three datatypes which get used for everything in GearHead- gears, Numerical Attributes (abreviated NAtts) and String Attributes (abreviated SAtts). You may want to browse through gears.pp just to familiarize yourself with these data types before going on. Commands which are marked as INTERACTION COMMANDs are meant to be used in Persona gears only; they will probably cause strange results if invoked from a Scene or a Plot. Commands which are marked as RPG MODE COMMANDs generally assume the existance of a single PC on team one. They may work in tactical mode, but may be unpredictable if there's more than one player-controlled character. This document was written primarily for my own reference. If it is of use to anyone else, that's just super. 1.HOW THINGS WORK Certain game events place triggers in a list. At the end of each game second, if there are any triggers pending, these are checked against the scene gear, the plots, and the factions to see if there are any events waiting for the triggers placed. If an event is found it is then invoked. This might make more sense if you take a look at how the adventure is put together. This is an overview of the adventure's structure: * Adventure Gear * Sub * Scene Gears * Sub * Map Features * Sub * MetaTerrain * End * Teams * Personas * Inv * NPCs * Items * Props * End * Inv * Plot Gears (Active) * Sub * Meta-Personas * Plot Gears (Inactive) * Inv * NPCs to be placed during plot * Items to be placed during plot * end * Dynamic Scene Gears * { Note that dynamic scenes may be defined } * { exactly as regular scene gears, but they get } * { deleted after the player exits them. } * Global NPCs * { These NPCs can potentially appear in } * { multiple scenes, as defined by their } * { Locations SAtt. Also, if they are either } * { allies or enemies of the PC, they can } * { possibly appear in Dynamic encounters. } * Faction Gears * inv * Plot Gears (Active) * Story Gears (Active) * inv * Plot Gears (Active) * end * end * Story Gears * inv * Plot Gears (Active) * end * end When a trigger is set, at the end of the game second, that trigger is passed to the scene gear, to all active plots, to all active stories, and to all active factions. It is therefore quite possible that the same trigger could invoke several different events from several different sources. Most triggers, though, will probably pass without triggering anything. The trigger is passed to the scene gear last. So, if there are any triggered events in the plots/factions/stories, these will be executed first. Script events are stored as string attributes in the gears they are attached to. The trigger for a given event is the string attribute's label. 1.TRIGGERS { Automatically activate interaction with NPC. } !TALK [CID] This isn't really a trigger- it's one of the new commands for the HandleTriggers procedure. When this trigger is encountered an interaction with the requested NPC is automatically started, if possible. { FROZEN EVENT } FRZ[label] Similar to the GOTO trigger, this trigger may be used to indicate an event which is stored for later use by the COMPOSE command. { GET ITEM } GET[ID Number] This trigger is set when an item which has a narrative ID is picked up by the player. { INTERNAL JUMP } .[label] GO[label] This trigger is used to create a line of script which may not be directly triggered by game events, but which may be called by an ELSE or a GOTO command. { INTERACTION - GREETINGS } GREETING This line is executed when the conversation starts. { NUMBER OF UNITS CHANGED } NU[team] This trigger is placed whenever something happens to decrease the number of master gears in play on a team. { INTERACTION - MENU EVENTS } RESULT[number] This event is called when a specific item is chosen from the interaction menu. { START OF GAME } START This trigger is automatically generated at the start of each call to PlayScene. { TAKE DOWN } TD[uid] This trigger is placed when a gear posessing a Unique ID has been destroyed. For mecha it is placed when the unit becomes nonoperational, so for example it will be placed if the pilot is killed or ejects even if the mecha itself is still working. { TEAM MOVEMENT } TM[team] This trigger is placed whenever a gear belonging to a particular team changes map squares. Note that if there's more than one mek in this unit, this trigger could be placed several times in rapid succession. { NPC ELIMINATED a.k.a. unique takedown } UTD[cid] This trigger is placed when a gear posessing a Character ID has been destroyed. 2.EVENT COMMANDS ADDCHAT [number] %%% INTERACTION COMMAND %%% This procedure will add a new entry to the Interact menu. The text for the new entry must be stored as Prompt[number], and the event that will be performed when this entry is selected is stored as Result[number]. ADDREACT [value] %%% INTERACTION COMMAND %%% This procedure will add a positive or negative value to the NPC's reaction score. ADVANCEPLOT [subplot number] This procedure will advance the currently active plot to the listed subplot. If the subplot cannot be found, the plot will be removed. SubPlots are located in the subcomponents of the current plot; see therules.txt for an overview of how an adventure is constructed. Each SubPlot is given an ID number when created by the Plot command. All sibling subplots should have different ID numbers, but otherwise they need not be unique. ATTACK [Team1] [Team2] This command will cause Team1 to immediately attack Team2. CASHPRIZE [value] %%% RPG MODE COMMAND %%% This procedure will give the PC some money. COMPOSE [trigger label] [parameter] [cmd line identifier] This procedure may be used to add a new event to the list. The trigger for the new event is TRIGGER plus the numeric parameter PARAMETER. IDENTIFIER is the trigger of the line which is to be used as the event; typically, this will start with the "FRZ" tag. DELETECHAR [Character ID] This procedure will remove a character from the campaign. The ID number provided is the CID set by SetPersona. See MDLref.txt. DELETEFACTION [Faction ID] This procedure will set a faction to inactive status. All characters belonging to this faction have their FacID cleared and their Renowned reputation reduced by 30. All other gears belonging to this faction have their FacID cleared. DELETEKEYITEM [Narrative ID] This procedure will remove a key item from the campaign. The ID number provided is the Narrative ID set by SetKeyItem. See MDLref.txt. DYNAMIC [Scale] [Point Value] [NU1 label] [NU2 label] This command creates a dynamic encounter. It's like a way to access the arena "Enter Combat" control from RPG mode. SCALE is the map scale for the encounter; if you're planning a giant robot combat, choose 2. (NOTE: At the moment Scale 0 encounters can't be generated) Point Value is the number of challenge points that will be used to select the enemy mecha. It will be stored as a Numeric Attribute, Script Value 0 in the dynamic scene. NU1 and NU2 point to frozen script lines (see FRZ, COMPOSE) to be inserted in the dynamic scene with triggers NU1 and NU2 (see NU). These script lines generally control the exit conditions for the dynamic scene. The scene ID number for the encounter created will be the same as the ID number of the scene from which DYNAMIC was called. Use the RETURN command to return to the previous scene. E= This command sets a value for one of the ELEMENT stats of the currently being used plot. Note that this can be a very dangerous thing to do!!! You should only modify the value of stats that don't have associated game items. ENCOUNTER [enemy%] [ally%] [description label] This command seeks Global NPCs to add to the current dynamic or staged encounter. Enemies are added to Team 2, allies are added to Team -1. Note that the actual occurence of enemies/allies will probably be less than the requested percentage, since the PC might not have enough appropriate contacts. The description string (indicated by the provided label) should contain character description terms (see CHARACTER SEARCH below) and may also contain instructions for the hook to be generated. Hook instructions are preceded by a '+'. HOOK ITEMS: +ECRA (enemy can run away), +PCRA (player can run away) ENDCHAT %%% INTERACTION COMMAND %%% Ends a conversation by clearing the interaction menu. EXIT [code] This command will exit the current gameboard or scenario, returning [code] to the calling procedure. FORCECHAT [CID] This command will start a conversation between the PC and the specified NPC. G= [idnum] [value] This command may be used to assign the value of global variable IDNUM. G+ [idnum] [value] This command may be used to add a quantity to the current value of global variable IDNUM. GOTO [label] This command will search for script line LABEL, then invoke it. IF= [value1] [value2] If value1 = value2, continue on with this line. If not, jump to LABEL. The LABEL must be formatted as the trigger of the line to use next. IFFACTION [FID] If the requested faction is active, continue on with this line. Otherwise branch to the label. IFKEYITEM [NID] If any of the PC gears currently on the map are in posession of an item with the specified Narrative ID, continue on with this line. Otherwise branch to the label. IFM [mekid] If the specified mecha is functional and on the map, continue with this line. Otherwise, goto label. IFPERSONA [CID] If the specified persona can be found and is alive, continue with this line. Otherwise, goto label. IFYESNO [desc msg] ["yes" msg] ["no" msg] This procedure displays a menu, and asks the user to make a choice. If the "yes" choice is chosen that's a success, otherwise it's a failure. The three parameters refer to MSG strings- see PRINT and SAY for more info. Note that calling this procedure during a conversation will mess up the interaction display. Create conversation menus using the NewChat, AddChat, and EndChat commands. L= [idnum] [value] This command may be used to assign the value of local variable IDNUM. L+ [idnum] [value] This command may be used to add a quantity to the current value of local variable IDNUM. MDYNAMIC [Scale] [Point Value] [MDesc Label] [NU1 label] [NU2 label] Works exactly like the DYNAMIC command, but fills the resultant encounter with monsters instead of regular enemies. PV is the sum of the monster size ratings. MDesc points to a script line which holds the monster descriptions- see the TYPE SAtt below for a description of possible monster descriptors. MECHAPRIZE [script line label] %%% RPG MODE COMMAND %%% Team one will be given a shiny new mecha. Yay! The label provided should indicate a line which holds the filename of the mecha to load. If the specified file has more than one mecha variant in it, one of the variants will be chosen at random. See the test scene, Hogye Mines L5 for an example of this command. MORETEXT [script line label] This command will attempt to load the requested file (the filename is located in the script line pointed to by the parameter) from the Series/ directory, then display the file in the text browser. NEWCHAT %%% INTERACTION COMMAND %%% This command resets the conversation menu with the standard options. P= [idnum] [value] This command may be used to assign the value of plot variable IDNUM. Plot variables are those that are located inside of PLOT gears. P+ [idnum] [value] This command may be used to add a quantity to the current value of plot variable IDNUM. See notes above. PCENEMY [cid] The requested NPC will become an enemy of the player character. PRINT [idnum] This command will print a message in the dialog area. REPUTATION [rep num] [value] This command affects the reputation of the PC. The reputation type index numbers are: 1: Heroic (+) / Villainous (-) 2: Lawful (+) / Chaotic (-) 3: Sociable (+) / Shy (-) 4: Easygoing (+) / Passionate (-) 5: Cheerful (+) / Melancholy (-) 6: Renowned (+) / Wangtta (-) 7: Pragmatic (+) / Spiritual (-) Use a positive value to improve the (+) reputation, or a negative value to improve the (-) reputation. RETREAT [team ID] When this command is invoked, all the functioning masters belonging to the listed team are removed from the map. A Number Of Units trigger is then set. RETURN This functions like EXIT, but the return code is equal to the ID number of the current scene. RUNAWAY [CID] When this command is invoked, the character with the requested CID is sought on the game board, then removed from the map. A NU trigger is then set. SAVEPOS %%% RPG MODE COMMAND %%% This command will record the current location of the PC in the scene gear. If there's more than one master on team one at the moment, it'll save the position of one of them. The next time this scene is entered, the first team one master deployed on the map will appear at the saved coordinates. SAY [idnum] %%% INTERACTION COMMAND %%% This command will print a message in the interaction message area. SAYANYTHING %%% INTERACTION COMMAND %%% This command will print a random, though potentially useful, message in the interaction message area. SCHOOL [skill list identifier] %%% INTERACTION COMMAND %%% This command lets the NPC teach the PC some things about skills. It passes the provided line on to the OpenSchool procedure, or an empty line if the requested one can't be found. The line should contain a list of the skill indicies that the NPC can teach (separated by spaces, as usual). See doc/character.txt for a list of the indicies for each skill. SEEKTERR [terrain type] %%% RPG MODE COMMAND %%% This command will assign a value to SCRIPT_Terrain_To_Seek. When the player moves to a new level, his or her starting position will try to match the terrain specified. SETPLAYERFACTION [faction ID] %%% RPG MODE COMMAND %%% This command will set the player's FACTION value, both in the PC character record and also in the root ADVENTURE record. SETSCENEFACTION [scene ID] [faction ID] This command will change the Faction ID of a given scene to the provided value. It will perform the following additional operations upon the affected scene: 1) Move all members of other factions to different scenes; 2) Insert in scene three random pilots belonging to the new faction. SHOP [wares identifier] %%% INTERACTION COMMAND %%% This command passes the provided line on to the OpenShop procedure. If the line cannot be found, this command passes a blank string instead. The Wares line should contain a list of gear "G"eneral descriptors which will be used to construct the list of items for sale. The MECHA command may be added to the wares string. This will add some meks to the shopping list, and allow the player to sell mecha to this shopkeeper. The MEXTRA command may be added to the wares string. This will add some mecha-scale equipment to the wares list. STAGED [Label] [Point Value] This procedure works like DYNAMIC. It creates a dynaic encounter and stocks it with mecha. Unlike DYNAMIC, this procedure loads the scene from disk. The filename should be in a line pointed to by LABEL; it may contain wildcards. STORYLINE [script line label] This command forcibly inserts a plot script into an adventure. If for some reason the plot cannot be inserted- either because the requested file is not found or because not all of the plot elements can be initialized- the ELSE clause is executed. TIME [delay] This causes the game clock to advance by the specified amount. TORD [team] [order ] This command allows you to issue orders to an entire team at once. The parameter ORDER is a label which describes the order to be issued; some orders require additional parameters. ASS: Assassinate [target ID] GO: Goto Spot [X] [Y] SD: SeekAndDestroy PASS: Passive The default actions of this procedure are as follows: If the order has one parameter, it's assumed to be a mek UID and stored in ATarget unless otherwise controlled. If it has two parameters, they are assumed to be map coordinates and are stored in GX,GY unless otherwise controlled. If the parameters are to be treated otherwise a special case must be added to 'arenascript.pp'. TREPUTATION [team number] [rep num] [value] This functions exactly like the REPUTATION command, but it affects a team other than the player team. V= [idnum] [value] This command may be used to assign the value of variable IDNUM. V+ [idnum] [value] This command may be used to add a quantity to the current value of variable IDNUM. XPV [experience award] %%% RPG MODE COMMAND %%% Gives a number of free experience points to the PC. 3.MISCELLANEOUS ?M[team number] ?P[team number] This function will return the Unique ID of a random (M)echa or (P)ilot from the specified team. If no active members of the team are found, this function returns 0. @[gear ID] This function will return the ID number of the root gear for the gear pointed to by the ID. COMTIME This variable returns the current combat time, as stored in the game board. D[Die Size] This returns a random number between 1 and the value provided. The die size must be a positive integer. E[idnum] This returns the ID value from the specified plot element. EScene [idnum] This returns the scene ID number where a given plot element is located. FacAct [idnum] Returns the action code for the given faction. 0=AtPeace, 1=AtWar FacMem [idnum] This returns the number of NPCs belonging to this faction. FacScene [idnum] This returns the number of scenes controlled by the listed faction. G[idnum] This allows a "global" variable to be used instead of a constant value. Global variables are those which are stored in the root adventure gear. HOSTILEFACTIONS This function returns the number of hostile factions currently active in the adventure world. A faction is listed as hostile if it has the MILITARY type, and also if it has any active, MILITARY enemies. L[idnum] This allows a "local" variable to be used instead of a constant value. "Local" variables are stored in the GameBoard/Scenario gear; if the event source is the scenario itself, using L[idnum] is equivalent to using V[idnum]. LOOKER[X]%[Y] This SAtt can be included in a scene to give a map tile a special description when viewed. MSG[idnum] <[Text Message Here.]> Game messages are stored as string attributes in the same place as the events. NPCREP [CID] [idnum] This expression returns the value of one of the requested NPC's reputations. P[idnum] This expression allows the value of variable [idnum] to be used in a procedure, rather than a constant. Variables accessed in this way are stored in the currently active PLOT gear. PCFAC This function returns the ID number of the PC's faction. If the PC does not belong to any faction, it will return 0. PCMEKS This expression returns the number of mecha on team 1, whether they are currently on the map or off of it. Useful for deciding whether or not the PC can take part in mecha missions, or for deciding whether or not a generous NPC will give the PC a new mecha... PCREP [idnum] %%% INTERACTION COMMAND %%% This expression returns the value of one of the PC's reputations. PCSCALE %%% RPG MODE COMMAND %%% This function returns the scale of the PC's root gear. Generally it will be 0 if the PC is on foot, or greater if the PC is in a mecha. PROMPT[idnum] <[Text Message Here.]> %%% INTERACTION COMMAND %%% The text for interaction menu items is stored here. REACT %%% INTERACTION COMMAND %%% This variable returns the value of I_Reaction. REWARD [threat value] [percent] This command returns the standard reward value for a combat mission of the listed threat value. Percent may be used to alter the reward gained based upon such factors as whether or not the player got salvage, etc. SCENEFACTION [scene ID] This function returns the faction for the requested scene. If the scene cannot be found, or has no faction assigned, this function returns zero. SCENEID This variable returns GB^.Scene^.S, which should be the unique ID for this particular location. SKROLL [Skill Number] %%% RPG MODE COMMAND %%% This function returns the result of a player character skill roll. T[team number] This variable returns the number of operational masters on the provided team. THREAT [Reputation] [Percent] This function returns a threat value appropriate for a character with the given reputation. Normally scenarios will choose a threat value of Rep + d30 or so, allowing for some variety. The percent scales the value before it is returned, so that an easy or difficult encounter can be generated for the threat value provided. V[idnum] This expression allows the value of variable [idnum] to be used in a procedure, rather than a constant. Variables accessed in this way are stored in whatever the current Source gear is. 4.MESSAGE FORMATTING COMMANDS \ELEMENT [idnum] This formatting command inserts the name of the plot element referred to. If called from outside of a plot, this could print garbage. \MEK [idnum] This formatting command will be replaced by the name of the specified mecha or character. \PC Name of the PC. \PERSONA [idnum] This formatting command will be replaced by the name of the specified persona. \PILOT [idnum] This formatting command will be replaced by the name of the specified mecha's pilot. \SCENE [idnum] This formatting command will be replaced by the name of the specified location. \VAL [value] This formatting command will be replaced by the value indicated. 5.OTHER STRING ATTRIBUTES OF NOTE ELEMENT1 ... ELEMENT8 When defining a PLOT gear, up to 8 elements may be associated with it. The first word in the element description should refer to what kind of element this is- see below for the choices available. The other words in the element description are traits that must belong to the gear which is selected when the plot is invoked. ( CHARACTER: See Character Search below for information. SCENE: Dungeon, Town, Scale[n] ITEM: Currently items cannot be sought, but may be Prefab. FACTION: Military, Corporate, ATWar, AtPeace GRAB: [n] - Grabs element from parent story PREFAB: Prefabricated Element. The element is not sought from the adventure, but is instead taken from the INV components of the plot. The first PREFAB element will draw the first item from INV, the next the second item, and so on. ) EVENT Placed in a GATE gear. This SATT overrides the default script set by the RMG when this gate is entered. See "Hogye Mines L5" for an example of this SATT in use. FITS Placed in an EXARMOR gear. This SAtt describes what sort of masters can wear the armor. Characters get the same descriptors as listed above under ELEMENT. Mecha get only their form name. HOME This SAtt contains the name of one of the map features. If a character has this string attribute, they will try to be deployed somewhere within the requested map feature, if it can be found. LOCATIONS When placed in a NPC, this SATT indicates that the NPC is global. It contains a list of all the scenes which the NPC can move to. PLACE This string determines where a PREFAB element will be placed. The first word in a PLACE string must be the number of the previous element with which to associate this one. The remaining words may contain instructions for the placement procedure; in the case of a character, this will be the TEAMDATA information. See that SATT description below. This string attribute is placed in the root gear of the prefab element. RUMOR This SAtt can be placed in a number of different gears. It provides a rumor which may come up while the player is chatting with an NPC. PLOT RUMORS: ![n] is replaced with the name of the listed element. TEAMDATA This string attribute should belong to a NPC. It provides information about what sort of team the NPC ought to be a member of. COMMANDS: enemy, ally, wmon, Command names (see TORD cmd) TYPE When this string element is assigned to a Team that has its random encounter value set, it determines what kind of monsters will be placed when random monsters are generated. When this string element is assigned to a monster, it determines if that critter will be selected by any particular random encounter generator, and also may determine the monster's weaknesses against slaying-weapons and the like. When this string is associated with a weapon, it stores the attack attributes. When this string attribute is associated with a faction, scene, or just about anything else, it is used to pick a random thing by plots and stories. 6.CHARACTER SEARCH This was initially filed under ELEMENT above, but it has become a more general utility so I've moved it here. CHARACTER: Sex:M, Sex:F, Young, Old, Heroic, Villainous, Lawful, Chaotic, Sociable, Shy, Easygoing, Passionate, Cheerful, Melancholy, Reflexes, Body, Speed, Perception, Craft, Ego, Knowledge, Charm, Job Description (see ANPCdefault.txt), ArchEnemy, ArchAlly, Family, Lover, HasMecha, YesPlot, NoPlot Descriptions starting with ! are relative elements. These don't describe intrinsic properties of the NPC itself, but instead relations between the NPC and other things. !C [plot element index] Comrade command. This element must belong to the same faction as the requested element. !E [plot element index] This element must belong to a faction which is the enemy of the faction to which the requested element belongs. Clear as mud. !F [plot element index] Far, must be in different scene from listed element. This is only meaningful if the character search is happening from a plot. !G Global, allows possibility to select global NPCs. !LanceMate (exclusive tag; lancemates won't be selected without it) Allows possibility to select lancemates. If a lancemate is requested, then only lancemates may be chosen. !M [Faction ID] The element must belong to the requested faction. Useful for making sure that a selected element has no faction affiliation. !N [plot element index] Near, must be in same scene as listed element. This is only meaningful if the character search is happening from a plot. !X [plot element index] eXcluding, must not be an ally of the faction of the listed element. This is only meaningful if the character search is happening from a plot. 7.HOOK STRUCTURE greeting V999 = Intimidation roll target V1000 = Experience Award for successful intimidation prompt1 prompt2 prompt3 Msg1 Msg2 Msg3 Msg4 Msg5 GearHead/doc/Introduction.txt0000644000175000017500000001033307466604604015157 0ustar kaolkaol******************************** *** GEARHEAD QUICK START *** ******************************** There are two things which really separate GearHead from most other ASCII-based RPGs. First, movement is somewhat more complex. Second, you get to pilot giant robots. Movement in GearHead is a bit more complex than it is in most other roguelikes, but once you get used to it I hope you'll enjoy it. Your character has direction, speed, and altitude. These three values are shown in the navigational display, on the left hand side of the character info window. The display should look something like this: + <- Direction Indicator G 0 <- Altitude Indicator S = ^----------- Speed Indicator The arrow indicates direction; in this case the character is facing NorthEast. The number at the center of the arrow indicates altitude. If the number is grey, it means the character is standing at that specified height. If the number is blue, it means the character is standing at that depth underwater. Finally, speed is indicated by the letters "G" and "S". If "G" is highlighted the character is moving, while if "S" is highlighted the character is standing still. There are two ways to move your character. The first method is similar to most other roguelikes- use the arrow keys or the numeric keypad to walk in any of the eight basic directions. The second method is called "turtle movement"- use the "[" and "]" keys to rotate your character, "=" to walk and "+" to run. ************************* ************************** *** BASIC MOVEMENT *** *** TURTLE MOVEMENT *** ************************* ************************** 7 8 9 + Run = Walk 4 6 [ ] Rotate 1 2 3 ******************************* *** INFORMATION OVERLOAD *** ******************************* Creating a first character in GearHead may be a daunting task. There are loads of options to choose from, eight stats to balance, and thirty skills to decide between. There should be a number of characters already located in the SaveGame directory. These are the ones that I've used during play testing, so they should all be fairly experienced. If you don't want to make up your own character right away you can start by playing with these. If you do want to create a character, my advice is to decide between being good at personal scale combat or being good at mecha scale combat. Stick a lot of points into the appropriate defense (either Dodge or Mecha Piloting) and at least one of the attack skills. This should help you survive until you gain enough experience points to start broadening your abilities. ************************* ********************** ******************** *** PERSONAL COMBAT *** *** MECHA COMBAT *** *** ALL COMBAT *** ************************* ********************** ******************** Small Arms Mecha Gunnery Initiative Heavy Weapons Mecha Artillery Vitality Armed Combat Mecha Weapons Spot Weakness Martial Arts Mecha Fighting Dodge Mecha Piloting If your character is good at personal combat, the first thing you'll probably want to do in Hogye is visit KiRin MegaMart. Here you can buy all kinds of weapons and armor. Once you are fully equipped, head down into the mines to gain some experience. It's been rumored that when the mine closed a lot of heavy machinery got left behind. If you can make it to the fifth level of the mines, you'll find out just how heavy that equipment was... If your character is good at mecha combat, the first thing you'll probably want to do is obtain a mecha. You can't just find one lying around in the street, you know. Fortunately there are a number of kind people in Hogye (and at least one not so kind person) who will give you a mecha for free. Head to Mecha Sporch and talk to the proprietor; say that you want to compete in the arena, but that you don't own a mecha. He'll tell you what to do. GearHead/doc/man_chara.txt0000644000175000017500000001457210122043060014370 0ustar kaolkaol% MANAGING YOUR CHARACTER Doc Jan 30 2004 *********************************** *** MANAGING YOUR CHARACTER *** *********************************** The most important command for taking care of your PC is the View Character interface, accessed by pressing "C". From here you can take care of most of your character's needs. BACKPACK This option allows you to view your character's worldly goods. The backpack is divided into two area. The top area is your equipment; these are the items which your PC is currently using. The bottom area is your inventory; these are the items which your PC is carrying but isn't currently using. You can switch back and forth between inventory and equipment by pressing the '/' key. The backpack menu can also be accessed during exploration mode. Press 'i' to view your inventory, or 'e' to view your equipment. VIEW INJURIES Your PC's health point total is always shown in the info window, but for a more detailed overview of your character's health you can always use the View Injuries option. If your character is moving slowly, or doesn't seem to be using one of his arms, come here to see if his limbs have been damaged. TRAINING Spending experience points is what is good in life. From the training sub-menu it is possible to view all your skills, to improve them, to learn new skills, and once you are sufficiently advanced to even improve your PC's statistics. Your character will pay more for training if too many skills are known. The total number of skills your character can have without penalty is determined by the Knowledge stat. FIELD HQ The Field HQ allows you to handle all of your PC's wargear. All items which your PC owns but which are too heavy to be carried personally may be viewed and edited here. See the MANAGING YOUR MECHA doc for more information. TALENTS Talents are special things your character can do that most people can't. You only get a limited number of talents, so choose them wisely. XP TALENTS 0 1 10,000 2 30,000 3 60,000 4 100,000 5 Purchasing a talent costs 1000XP. ANATOMIST Because of your anatomical knowledge, you are able to target an opponent's vital points. (+1 Penetration versus living targets) PreRequisite: Medicine +5 ANIMAL TRAINER You are good at teaching your pets how to do tricks. (new pets gain XP bonus) PreRequisite: Dominate Animal +5 BADASS The angrier you get, the harder you fight. (Bonus to combat skills while bad morale) PreRequisite: Must be melancholy BISHOUNEN You are androgynously beautiful. (may use Flirtation skill with all NPCs, regardless of gender) PreRequisite: Charm 15 BODY BUILDER You are totally pumped up. (+2 Body) PreRequisite: Weight Lifting +5 BORN TO FLY You are an expert with flying mecha. (+3 Mecha Piloting while flying) PreRequisite: Mecha Piloting +5 BUSINESS SENSE You are very good at negotiating favorable deals. (+25% to most mission cash rewards) PreRequisite: Shopping +5 COMBAT MEDIC You are capable of performing emergency medicine in dangerous places. (First Aid and Medicine take 1/3 normal time) PreRequisite: First Aid +5 CYBERPSYCHO Your body is adjusted to cyberware, it's just your mind that suffers. (May avoid trauma by spending MP) PreRequisite: Body 15 DIPLOMATIC In conversation, you can avoid controversial topics. (may avoid reaction loss due to personality clash) PreRequisite: Ego 15 EXTROPIAN You are philosophically prepared to deal with the loss of your humanity. (may have one implant per 3 points Cybertech with no chance of disfunction) PreRequisite: Cybertech 5 GATE CRASHER You're very good at destroying inanimate objects. (+2 penetration against inanimate objects) PreRequisite: Must be passionate HAP-KI-DO You are an expert at self defense. (May block attacks using Martial Arts) PreRequisite: Martial Arts +5 HARD AS NAILS You don't feel pain like normal people. (All attacks against PC are at -2 Penetration) PreRequisite: Resistance +5 HULL DOWN As long as you aren't flying, you can position your mecha so as to prevent critical hits. (All attacks against walking or rolling mecha are at -3 Penetration) PreRequisite: Electronic Warfare +5 IDEALIST BLOOD Your ancestry includes some genetic engineering. (+1 to three random stats) JACK OF ALL TRADES You can do a little bit of everything. (May use unknown skills without -2 penalty) PreRequisite: Craft 15 KUNG-FU Your hands are lethal weapons. (+3 Penetration for Martial Arts attacks) PreRequisite: Martial Arts +5 NINJITSU Your surprise attacks are deadly. (damage bonus when attacking unseen) PreRequisite: Stealth +5 PRESENCE You have mastered a commanding stage presence. (+2 Charm) PreRequisite: Performance +5 ROAD HOG You are an expert with cars and other wheeled vehicles. (+2 Mecha Piloting while rolling) PreRequisite: Mecha Piloting +5 SAVANT You have more skills than is normal for a person of your intelligence. (can learn 5 more skills without penalty) SCIENTIFIC METHOD Your scientific training has made you very good at discovering new things. (+2 Knowledge) PreRequisite: Science +5 SNIPER One shot is all you ever need. (bonus to single fire damage rolls) PreRequisite: Spot Weakness +5 STRENGTH OF FAITH You have the power of faith on your side. (+2 Ego) PreRequisite: Mysticism +5 STUNT DRIVING As long as you're going fast, you can find a way to avoid most attacks. (may reroll dodge if traveling at full speed) PreRequisite: Speed 15 SURE FOOTED You are an expert with walkers and zoanoids. (+2 Mecha Piloting while walking) PreRequisite: Mecha Piloting +5 TECH VULTURE When awarded salvage, you'll grab everything worth taking. (can salvage individual modules from defeated mecha) PreRequisite: Mecha Repair +5 GearHead/doc/man_mecha.txt0000644000175000017500000000607207606117734014412 0ustar kaolkaol% MANAGING YOUR MECHA Doc Jan 6 2003 ******************************* *** ******************************* *** MANAGING YOUR MECHA *** ******************************* When you start the game you will most likely have little more than the clothes you wear and a few credits for some basic equipment. Later on you will acquire new weapons, armor, and eventually the most prized item in this game world- a mecha. In GearHead, Wargear is defined as any item which your PC owns but which is too heavy to be carried personally. Mecha fall into this category, as do mecha-scale weapons. To view, assign, and edit your wargear you'll need to use the Field HQ interface. This can be accessed through the View Character menu, or by pressing the 'H' key in exploration mode. You will be presented with a list of your character's wargear. Selecting an item will bring you to a sub-menu, from which you can perform various actions depending upon the wargear's type and condition. INVENTORY MANAGEMENT Every mecha has its own inventory and equipment lists, just like your PC has. To access a mecha's carried items you can select the View Inventory command It is possible to trade items between mecha. Select the item you wish to trade, then choose the Transfer Item option. You will then be able to move the item to a different mecha. ALLOCATING ITEMS When you buy a mecha-sized weapon at the store it does not go to your PC's inventory. To use the item you'll need to select it in the Field HQ, then transfer it to the mecha you want to equip it on. REPAIRING ITEMS If a part is damaged you may want to try repairing it yourself instead of bringing it to the shop. Repair options will only be shown in the Field HQ if there is some damage that needs to be repaired, and if the PC knows the required skill. CUSTOMIZING YOUR MECHA Selecting the Examine Parts option will bring up a complete list of all the components making up this mecha. To remove a part from your mecha, select it from the list and choose Remove Part. Not all parts can be removed: some parts are so integral to a design that they cannot be replaced. If the removed part survived the extraction process, it will be placed in the mecha's inventory. It is also possible to install components into a mecha. In order to be installed, the item must be located in the mecha's inventory. Select the item you want, and then choose the Install Part option. You will be presented with a list of legal installation slots, or an error message if the selected item cannot be installed. While installing and removing components keep an eye on the stat display located above the parts list. This display will keep track of how your modifications affect the mecha's speed, maneuverability, and other statistics. You may want to try removing parts from one mecha, then transferring them to be installed on another. In order to remove and install parts most effectively, your character should know the Mecha Engineering skill. GearHead/doc/man_umek.txt0000644000175000017500000001501710061710604014255 0ustar kaolkaol% UNDERSTANDING YOUR MECHA Doc Jan 6 2003 ************************************ *** UNDERSTANDING YOUR MECHA *** ************************************ Maneuverability, abbreviated as MV on the display, indicates how agile your mecha is. A high MV score will allow you to dodge attacks in combat more easily. Targeting, abbreviated as TR on the display, indicates how good your onboard targeting systems are. A high TR score will allow you to hit enemies more often in combat. Sensors, abbreviated as SE on the display, indicates how much information about the outside world your mecha passes on to you. A high score means that your mecha has a wonderful sensor package, with resolution enhancers and target highlighters. A low score could mean that you're forced to stare out a tiny window at the front of your cockpit while listening for pings from your obsolete radar unit. Mass is listed in either kg or tons, depending upon the scale of the mecha being described. It doesn't have much direct effect upon the game, but it does determine the base values for maneuverability, targeting, and speed. ************************** *** TYPES OF MECHA *** ************************** Mecha can be built according to one of several design types. There are a few things that all mecha have in common. They are all constructed from a series of modules. They all require a body module, a cockpit, an engine, a gyroscope, and sensors. Battroids are traditional giant robots. They usually have two arms, two legs, and a head but can vary significantly from this plan. They have good maneuverability and targeting scores. Battroids don't have any special bonuses other than their versatility, but then again they don't have any special weaknesses either. Groundhuggers are low-lying wheeled or hover vehicles. Because of their sloped design and compact propulsion, groundhuggers have a better targeting score and better armor protection than battroids. However, their maneuverability is worse. Possibly the greatest advantage that groundhuggers have is their ability to use the turret module; weapons mounted in a turret may be fired in a 360-degree arc. Zoanoids are mecha built in the form of animals. Often these mecha are designed to resemble either big cats or dinosaurs. Because their frame construction exactly mirrors that of a living creature, these mecha have incredible strength and maneuverability. Unfortunately this design also prevents zoanoid mecha from optimizing their weapon arrays, so their targeting score suffers. Arachnoids are walking tanks. They usually resemble spiders, though they may have as few as two legs. Their legs provide a great range of motion and they therefore have better maneuverability than groundhuggers, while the stability of their form gives them a better targeting score than battroids. Arachnoid mecha can make use of turret modules. *********************** *** MECHA COMBAT *** *********************** The best way to survive an attack is to not get hit. If you're a mecha pilot, this means that you're going to have to practice the Mecha Piloting skill. It is this skill which determines whether or not any attack will hit your mecha. A good MV score, some cover, and a long distance between yourself and the opponent will also help you to avoid attacks. Of course, not even the best pilot is going to dodge every shot. Fortunately mecha have very thick armor. The first couple of shots in any battle are likely to bounce off this protection without causing any apparent damage. However, with each hit the armor gets a little bit weaker. Eventually the armor will give way and the mecha will collapse like a house of cards. Weapons like machine guns and swarm missiles are good for weakening armor, since they can hit the target several times with each attack. High damage non-repeating weapons like gauss rifles and beam swords are more likely to penetrate armor on the first hit, but don't tend to weaken the armor as well as a low damage weapon with a high burst value. Most mecha have at least one weapon of each type, allowing them to choose an attack suited to their opponent's skill level and armor rating. The ultimate weapon would have both a high burst value and high damage, but it would likely be both prohibitively expensive to manufacture and too heavy to mount on anything short of a Monstrous. **************************** *** ATTACK ATTRIBUTES *** **************************** ANTI-AIR Flying targets are harder to hit. Anti-Air weapons ignore this penalty. ARMORPIERCING Armor-Piercing weapons are good at penetrating armor. Your target gets only half armor protection from attacks of this type. BLAST Blast weapons affect everything in a radius from their detonation point. BRUTAL Brutal weapons cause a lot of messy, obvious damage. They eat through armor at twice the normal rate. DRONE Drone weapons release a number of small robotic airplanes which will then attack your enemies. EXTEND Extended melee weapons may be used to attack at a target up to two squares distant, as opposed to regular melee weapons which are limited to a range of one. FLAIL Flails are flexible weapons. They may not be easily blocked or parried. GAS Gas weapons do no damage, but release a toxic gas which can quickly kill living beings. HYPER Hyper weapons are particularly devastating. They deal damage to every component piece of a target simultaneously. INTERCEPT A weapon with the Intercept attack attribute may be used to shoot down incoming missiles. LINE A line attack affects every target in a straight line. OVERLOAD These weapons cause electrical interference to an enemy mecha's powerplant. SCATTER Instead of dealing a single powerful hit, scatter weapons divide their damage into multiple smaller attacks, thereby spreading out over more of the target. SMOKE Smoke weapons cause no damage, but may be used to provide cover. SWARM Swarm weapons spread out to attack multiple targets simultaneously. THROWN Throwable melee weapons may be thrown. The range depends on your character's BODY stat. THROWN, RETURNING Some throwing weapons will return to the user after they've been thrown. Things like boomerangs and rocket-powered tridents fall in this category. GearHead/doc/typelist.txt0000644000175000017500000000266410523645546014361 0ustar kaolkaolTYPES LIST GEAR GENERAL DESCRIPTORS -10: Story -9 : Plot -8 : Map Feature -7 : Adventure -6 : Faction -5 : Persona -4 : Team -3 : Scene -2 : Unit -1 : Delete this gear 0 : Mecha 1 : Module 2 : Character 3 : Cockpit / Submecha Storage 4 : Weapon System 5 : Ammunition 6 : Movement System 7 : Holder 8 : Sensor System 9 : Support Equipment 10 : Shield 11 : External Armor 12 : Swag 13 : Prop 14 : Electronics (ghsensor.pp) 15 : MetaTerrain (ghprop.pp) 16 : Usables (ghswag.pp) 17 : Repair Fuel (ghswag.pp) 18 : Consumable (ghswag.pp) 19 : Modifier (ghmodule.pp) 20 : Weapon Add-On (ghweapon.pp) NUMERICAL ATTRIBUTE GENERAL DESCRIPTORS -6 : ParaLocation -5 : Visibility Marker {locale.pp} -4 : Episode Data -3 : Weapon Modifiers -2 : Action Data -1 : Location Data / Game Map Coordinates 0 : Script Variable (ArenaScript.pp) 1 : Skill (GHChar.pp) 2 : Gear Options (gear.pp) 3 : Character Description (GHChar.pp) 4 : Experience Record (GHChar.pp) 5 : Personal Variables (interact.pp) 6 : Relationship Score (interact.pp) 7 : Narrative Variables (gears.pp) 8 : Faction Score (interact.pp) 9 : Condition (ghchars.pp) 10 : Relationship Type (interact.pp) 11 : Statistic Improvement Level (ghchar.pp) 12 : Damage (damage.pp) 13 : SDL Frame Number (gears.pp) 14 : Status Effect Counter (ghweapon.pp) 15 : Prefrences (gears.pp) 16 : Talents (ghchars.pp) 17 : Scene Data (locale.pp) GearHead/doc/ASLref.txt0000644000175000017500000002400410155572100013572 0ustar kaolkaol1. TRIGGERS 5MIN Generated every five minutes APPLAUSE Using performance skill, favorable result CLEANUP Story is ending, do plot cleanup ENC[encounter level] World map encounter; 1=Combat,2=Special,3=Boon END Trigger placed when scene ends EWM[scene number] Objection Check: Enter via world map FACWIN[faction ID] Faction has won a story FACLOSE[faction ID] Faction has lost a story FIRE! Trigger set when a fire starts on map GET[ID Number] Get item which has Narrative ID GREETING First label called when interact started HALFHOUR Generated every half hour of game time HOUR Generated every hour of game time JUMPSTART0 Used to jump-start a recently advanced plot KEY[ID Number] Objection Check; Item used/activated LOCAL[ID Number] Triggers a local event NPCOPENDOOR Request sent when NPC wants to open a door NU[team] Number of masters on team has changed QUARTER Generated every 6 hours (1/4 of a day) RESULT[number] Called when interact menu item selected REVEAL Called when hidden metaterrain is discovered START First trigger placed when scene entered TD[uid] Model on gameboard removed from play THIEF! Trigger set whenever PC botches a PickPockets roll TM[team] Member of given team has moved UPDATE Sent to all objects on gameboard at start and when requested USE First label called when prop activated UTD[cid] Model with Character ID has been destroyed *** DEBUG TRIGGERS ONLY *** PLAYERVILLAIN Player has gained villainous reputation from DeclarationOfHostilities procedure. I'm hoping to use this to finally track down all the bugs. 2. BASIC COMMANDS ACCEPT Return TRUE from ConditionAccepted ADDCHAT [number] Add prompt[num] to interact menu ADDREACT [value] Alter NPC reaction score ADVANCEPLOT [subplot number] Advance to sub-plot AIRRAIDSIREN All NPCs will flee the gameboard ALERT [msg number] Display a text message the PC won't ignore ATTACK [Team1] [Team2] Team1 will attack Team2 BATCHLOADPLOT [label] [n] Load a number of plots all at once, subject to config file option BLOCK Erase trigger, prevent further events BOMB Blow up current scene CASHPRIZE [value] Give player money COMPOSE [trigger label] [parameter] [cmd line identifier] Create new script event DELETECHAR [Character ID] Eliminate NPC DELETEFACTION [Faction ID] Deactivate faction DELETEKEYITEM [Narrative ID] Eliminate key item DRAWTERR [x] [y] [terrain] Alter the gameboard DYNAMIC [Scale] [Point Value] [NU1 label] [NU2 label] Start a dynamic scene DYNANPC [cid] [team] Insert NPC into dynamic scene E= Set Plot Element EMAIL [idnum] Store message for PC in source gear ENCOUNTER [enemy%] [ally%] [description label] Add NPCs to a dynamic scene ENDCHAT Delete all items from interact menu ENDSTORY Delete source story, pass CLEANUP to plots EXIT [code] Leave current scene with exit code EXPRESSDELIVERY Have shopkeeper ship mecha from another town FORCECHAT [CID] Force conversation with NPC FREEZENPC [CID] Remove NPC from play; store as global G= [idnum] [value] Set global variable G+ [idnum] [value] Add global variable GLOBALSTORYPATTERN [scene label] [story label] loads as many stories as possible matched to as many scenes as possible with no duplication of either GOTO [label] Jump to another line in the program HISTORY [idnum] Add message to adventure history IF= [value1] [value2] IF# [value1] [value2] If V1 <> V2... IFFACTION [FID] If faction is active... IFFACTIONENEMY [FID] If faction is arch-enemy of PC... IFG [value1] [value2] If V1 > V2... IFKEYITEM [NID] If PC has key item... IFM [uid] If root level gear is active... IFNOOBJECTIONS [trigger label] [parameter] If the produced trigger is not blocked... IFNPCARCHENEMY [UID] If NPC is arch-enemy of PC... IFPERSONA [CID] If NPC is alive... IFSCENE [label] If current scene matches description... IFSTORYLESS If SOURCE has no linked story... IFYESNO [desc msg] ["yes" msg] ["no" msg] L= [idnum] [value] Set local variable L+ [idnum] [value] Add local variable LOADD [script line label] Load a dynamic scene MAGICMAP Makes all tiles on current map visible MDYNAMIC [Scale] [PC Encounter Level] [MDesc Label] [NU1 label] [NU2 label] Create dynamic scene with monsters MECHAPRIZE [script line label] Give PC a mecha MEMO [idnum] Store reminder for PC in source gear MORETEXT [script line label] Display text file from disk MOREMEMO [tag] View memos of type [tag] - EMAIL,MEMO,NEWS MOVECHAR [CID] [Scene ID] Move a character to the requested scene MOVEKEYITEM [NID] [Scene ID] MSTAGED [Label] [UPV] [MDesc Label] Like Staged, with monsters MSTOCKD [UPV] [MDesc Label] Stock dynamic encounter with monsters N= Set Story Element NEWCHAT Reset interact menu NEWD [scale] Create a new dynamic scene NEWS [idnum] Store global news message in source gear NPCABSOLUTELEVEL [NPC] [%] Scales all skill values by percent P= [idnum] [value] Set plot variable P+ [idnum] [value] Add plot variable PCENEMY [cid] NPC will become PC's enemy PRINT [idnum] Display message in console area PURGESTORY Pass CLEANUP to and delete story plots REPUTATION [rep num] [value] Alter PC's reputation RETREAT [team ID] Remove team from the gameboard RETURN Exit a dynamic scene RUNAWAY [CID] Remove NPC from the gameboard S= [idnum] [value] Set story variable S+ [idnum] [value] Add story variable SAVEPOS Remember PC's current location SAY [idnum] Display message in interact area SAYANYTHING Say meaningless random message SCHOOL [skill list identifier] PC can train skills SEEKGATE [scene ID] Player will enter next map at entry of specified scene ***IMPORTANT*** Only works if called after Exit, Return, etc SEEKTERR [terrain type] Set where PC will enter next scene SETPLAYERFACTION [faction ID] SETSCENEFACTION [scene ID] [faction ID] SHOP [wares identifier] STAGED [Label] [Point Value] Load dynamic scene from disk STARTSTORY [script line label] Load a story STOCKD [UPV] Stock dynamic encounter with enemies STORYLINE [script line label] Load a plot TIME [delay] Advance game clock TMSTOCKD [team] [upv] [label] Stock dynamic scene team with monsters TORD [team] [order ] Set orders for team TRANSFORM [frame] Switch a prop's appearance to alternate state TREPUTATION [team number] [rep num] [value] Set rep for team TRIGGER [base] [value] Add an event trigger to the queue TSTOCKD [team] [upv] Stock dynamic scene team with mecha UPDATEPROPS Sends an "UPDATE" trigger to all gears on gameboard V= [idnum] [value] Set source variable V+ [idnum] [value] Add source variable VMSG [ident] [value] Print standard value message WMECHA [team] [upv] Stock current scene with mecha XPV [experience award] Give PC experience XRANPLOT [label] Load plot using experimental Extra Randomness 3. BASIC FUNCTIONS ?M[team number] Random mecha UID ?P[team number] Random pilot UID @[gear ID] UID of root-level gear * [A] [B] Returns A * B CHATNPCID CID of interact NPC COMTIME D[Die Size] E[idnum] Plot element value EScene [idnum] Element's scene ID FacMem [idnum] Number of members FacScene [idnum] Number of controlled scenes FXPNeeded [level] Number of faction XP for next level G[idnum] Global variable value HOSTILEFACTIONS Number of active, military factions with active, military enemies L[idnum] Local variable value MAPTILE [X] [Y] Terrain value of tile X,Y N[idnum] Story (Narrative) element value NPCREP [CID] [idnum] NPC's reputation score P[idnum] Plot variable value PCFAC PC's faction ID PCMEKS Number of meks PC owns PCREP [idnum] PC's reputation score PCSCALE Scale of PC's root level gear PCUID PC's unique ID PCX PC X position PCY PC Y position PCSKILLVAL [skill] Highest rank in skill from PC, lancemates RANGE [uid1] [uid2] Range between two gears by UID REACT Reaction score with interact NPC REWARD [threat value] [percent] Good salary for combat mission S[idnum] Story variable SCENEFACTION [scene ID] Scene's faction ID SCENEID ID of current scene SELFUID Source's unique ID SKROLL [Skill Number] PC makes a skill roll T[team number] Number of active masters on team THREAT [Reputation] [Percent] Good difficulcy value for mission V[idnum] Source variable value WMTHREAT [Reputation] Good WMon difficlulcy value for level 4. MESSAGE FORMATTING STRINGS \DATE [time] Converts [time] to game display format \FACRANK [FID] [Rank] Faction rank name \PC The PC's name \RANK PC's rank name 5. GEAR GRABBERS GRABLOCAL [uid] Grabs a model from gameboard 6. GRABBED GEAR COMMANDS DELETEGG Deletes the grabbed (physical) gear DEPLOYGG [team] Places the grabbed gear in the current scene GABSOLUTELEVEL [%] Scale skill values by percent GADDNATT [G] [S] [V] GIVEGG Gives the grabbed (physical) gear to PC GMENTAL The grabbed gear will waitaminute and 1MP GMORALEDMG [Morale] Adds morale damage to the grabbed gear GNEWPART [label] Adds new item, monster, NPC to game board GRUNAWAY If easily found on map, GG runs away GQUITLANCE The grabbed gear quits the lance GSETNATT [G] [S] [V] GSETSATT [key] [info label] GSETSTAT [Slot] [Value] GSKILLLEVEL [Reputation] Scales skill points to set level GSKILLXP [Skill] [XP] Gives skill-specific experience to GG IFGARCHALLY True if GG an arch-ally of PC IFGARCHENEMY True if GG an arch-enemy of PC IFGINPLAY True if GG on map and operational IFGOK True if GG exists and not destroyed IFGSEXY True if NPC GG exists and is sexy to PC MOVEGG [Scene ID] Moves the grabbed (physical) gear 7. GRABBED GEAR FUNCTIONS 8. METACOMMANDS !Talk [CID] Forces conversation with NPC GearHead/randchar.pp0000644000175000017500000007074710334666270013325 0ustar kaolkaolunit randchar; { This unit contains the nuts and bolts of the GearHead } { character generator. } { GearHead: Arena, a roguelike mecha CRPG Copyright (C) 2005 Joseph Hewitt This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. The full text of the LGPL can be found in license.txt. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } interface uses gears; Const RC_DirList = Series_Directory + OS_Search_Separator + OS_Current_Directory; BaseStatPts = 80; MaxStartingSkill = 5; Function SkillDesc( N: Integer ): String; Procedure SaveChar( PC: GearPtr ); Function CharacterCreator: GearPtr; Procedure GenerateNewPC; implementation {$IFDEF SDLMODE} uses gearutil,ghchars,texutil,ui4gh,sdlgfx,sdlinfo,sdlmenus; {$ELSE} uses gearutil,ghchars,texutil,ui4gh,congfx,coninfo,conmenus,context; {$ENDIF} {$IFDEF SDLMODE} var RCPC: GearPtr; RCPromptMessage,RCDescMessage,RCCaption: String; Procedure RandCharRedraw; { Redraw the screen for SDL. } begin DrawCharGenBorder; if RCPC <> Nil then CharacterDisplay( RCPC , Nil ); NFGameMsg( RCDescMessage , ZONE_CharGenDesc , InfoGreen ); NFCMessage( RCPromptMessage , ZONE_CharGenPrompt , InfoGreen ); if RCCaption <> '' then NFCMessage( RCCaption , ZONE_CharGenCaption , InfoGreen ); end; {$ENDIF} Function SkillDesc( N: Integer ): String; { Return a description for this skill. The main text is taken } { from the messages.txt file, plus the name of the stat which } { governs this skill. } var msg: String; begin msg := ''; { Error check- only provide description for a legal skill } { number. Otherwise just return an empty string. } if ( N >= 1 ) and ( N <= NumSkill ) then begin msg := '[' + UpCase( StatName[SkillMan[N].Stat] ) + '] ' + MsgString( 'SKILL_' + BStr( N ) ); end; SkillDesc := msg; end; Procedure SaveChar( PC: GearPtr ); { Save this character to disk, in the "SaveGame" directory. } var Leader: GearPtr; FName: String; { Filename for the character. } F: Text; { The file to write to. } begin Leader := PC; while ( Leader <> Nil ) and ( ( Leader^.G <> GG_Character ) or ( NAttValue( Leader^.NA , NAG_CharDescription , NAS_CharType ) <> 0 ) ) do Leader := Leader^.Next; if Leader = Nil then Exit; FName := Save_Character_Base + GearName(Leader) + Default_File_Ending; Assign( F , FName ); Rewrite( F ); WriteCGears( F , PC ); Close( F ); end; Function SelectMode: Integer; { Prompt the user for a mode selection. } var RPM: RPGMenuPtr; G: Integer; begin RPM := CreateRPGMenu( MenuItem , MenuSelect , ZONE_CharGenMenu ); AddRPGMenuItem( RPM , MsgString( 'RANDCHAR_SMOp0' ) , 0 ); AddRPGMenuItem( RPM , MsgString( 'RANDCHAR_SMOp1' ) , 1 ); {$IFDEF SDLMODE} RCPromptMessage := MsgString( 'RANDCHAR_SMPrompt' ); RCDescMessage := MsgString( 'RANDCHAR_SMDesc' ); RCCaption := ''; G := SelectMenu( RPM , @RandCharRedraw ); {$ELSE} CMessage( MsgString( 'RANDCHAR_SMPrompt' ) , ZONE_CharGenPrompt , InfoHilight ); GameMsg( MsgString( 'RANDCHAR_SMDesc' ) , ZONE_CharGenDesc , InfoGreen ); G := SelectMenu( RPM ); {$ENDIF} DisposeRPGMenu( RPM ); SelectMode := G; end; Function SelectGender: Integer; { Prompt the user for a gender selection. } var RPM: RPGMenuPtr; G: Integer; begin RPM := CreateRPGMenu( MenuItem , MenuSelect , ZONE_CharGenMenu ); AddRPGMenuItem( RPM , GenderName[ NAV_Male ] , NAV_Male ); AddRPGMenuItem( RPM , GenderName[ NAV_Female ] , NAV_Female ); {$IFDEF SDLMODE} RCDescMessage := MsgString( 'RANDCHAR_SGDesc' ); RCPromptMessage := MsgString( 'RANDCHAR_SGPrompt' ); RCCaption := ''; G := SelectMenu( RPM , @RandCharRedraw ); {$ELSE} GameMsg( MsgString( 'RANDCHAR_SGDesc' ) , ZONE_CharGenDesc , InfoGreen ); CMessage( MsgString( 'RANDCHAR_SGPrompt' ) , ZONE_CharGenPrompt , InfoGreen ); G := SelectMenu( RPM ); {$ENDIF} DisposeRPGMenu( RPM ); ClrZone( ZONE_CharGenPrompt ); ClrZone( ZONE_CharGenDesc ); SelectGender := G; end; Function SelectAge: Integer; { Prompt the user for character age. } var RPM: RPGMenuPtr; T: Integer; begin RPM := CreateRPGMenu( MenuItem , MenuSelect , ZONE_CharGenMenu ); for t := -4 to 10 do begin AddRPGMenuItem( RPM , BStr( T + 20 ) + ' years old' , T ); end; {$IFDEF SDLMODE} RCDescMessage := MsgString( 'RANDCHAR_SADesc' ); RCPromptMessage := MsgString( 'RANDCHAR_SAPrompt' ); RCCaption := ''; T := SelectMenu( RPM , @RandCharRedraw ); {$ELSE} GameMsg( MsgString( 'RANDCHAR_SADesc' ) , ZONE_CharGenDesc , InfoGreen ); CMessage( MsgString( 'RANDCHAR_SAPrompt' ) , ZONE_CharGenPrompt , InfoGreen ); T := SelectMenu( RPM ); {$ENDIF} DisposeRPGMenu( RPM ); SelectAge := T; end; Procedure GenerateFamilyHistory( PC: GearPtr; var Cash: LongInt; CanEdit: Boolean ); { Roll for jobs for both parents. } const Parental_XP = 210; var RPM: RPGMenuPtr; JobList,F,M: SAttPtr; N: Integer; Bio1: String; { Procedures block. } Procedure ApplyParentalBonus( SA: SAttPtr ); var skills: Array [1..8] of integer; B: String; N,T: Integer; begin { Error check - SA might be NIL. } { Extract the bonus string. } if SA <> Nil then B := RetrieveAString( SA^.Info ) else B := ''; { See what's in there. } N := 0; for t := 1 to 8 do begin skills[t] := ExtractValue( B ); if skills[t] > 0 then Inc( N ); end; { Apply bonuses. } if N > 0 then begin for t := 1 to 8 do begin if skills[ t ] > 0 then AddNAtt( PC^.NA , NAG_Experience , NAS_Skill_XP_Base + skills[ t ] , Parental_XP div N ); end; end else begin AddNAtt( PC^.NA , NAG_Experience , NAS_TotalXP , ( Parental_XP * 2 ) div 3 ); end; end; begin RPM := CreateRPGMenu( MenuItem , MenuSelect , ZONE_CharGenMenu ); AddRPGMenuItem( RPM , MsgString( 'RANDCHAR_FHAccept' ) , 1 ); AddRPGMenuItem( RPM , MsgString( 'RANDCHAR_FHDecline' ) , -1 ); if CanEdit then begin {$IFDEF SDLMODE} RCPromptMessage := MsgString( 'RANDCHAR_FHPrompt' ); RCDescMessage := MsgString( 'RANDCHAR_FHDesc' ); RCCaption := ''; {$ELSE} CMessage( MsgString( 'RANDCHAR_FHPrompt' ) , ZONE_CharGenPrompt , InfoHilight ); GameMsg( MsgString( 'RANDCHAR_FHDesc' ) , ZONE_CharGenDesc , InfoGreen ); {$ENDIF} end; JobList := LoadStringList( Jobs_File ); repeat { Decide upon the family history here, giving skill points } { and whatever. } { Determine the jobs of both the father and the mother. } if Random(3) <> 1 then F := SelectRandomSAtt( JobList ) else F := Nil; if Random(3) <> 1 then M := SelectRandomSAtt( JobList ) else M := Nil; if ( F <> Nil ) and ( M <> Nil ) then begin { Both father and mother had jobs worth mentioning. } if F = M then begin Bio1 := MsgString( 'RANDCHAR_FHBothParents1' ) + RetrieveAPreamble( F^.Info ) + MsgString( 'RANDCHAR_FHBothParents2' ); end else if Random( 2 ) = 1 then begin Bio1 := MsgString( 'RANDCHAR_FM1' ) + RetrieveAPreamble( F^.Info ); Bio1 := Bio1 + MsgString( 'RANDCHAR_FM2' ) + RetrieveAPreamble( M^.Info ) + MsgString( 'RANDCHAR_FM3' ); end else begin Bio1 := MsgString( 'RANDCHAR_MF1' ) + RetrieveAPreamble( M^.Info ); Bio1 := Bio1 + MsgString( 'RANDCHAR_MF2' ) + RetrieveAPreamble( F^.Info ) + MsgString( 'RANDCHAR_MF3' ); end; end else if F <> Nil then begin { Father had a special job; Mother didn't. } Bio1 := MsgString( 'RANDCHAR_F1' ) + RetrieveAPreamble( F^.Info ) + MsgString( 'RANDCHAR_F2' ); end else if M <> Nil then begin { Mother had a special job; Father didn't. } Bio1 := MsgString( 'RANDCHAR_M1' ) + RetrieveAPreamble( M^.Info ) + MsgString( 'RANDCHAR_M2' ); end else begin { Neither father nor mother had a special job. } Bio1 := MsgString( 'RANDCHAR_WCF' ); end; { Display the created biography for the user. } {$IFDEF SDLMODE} SetSAtt( PC^.SA , 'BIO1 <' + Bio1 + '>' ); {$ELSE} GameMsg( Bio1 , ZONE_Biography , InfoGreen ); {$ENDIF} { Decide whether to accept or decline this family history. } if CanEdit then begin {$IFDEF SDLMODE} N := SelectMenu( RPM , @RandCharRedraw ); {$ELSE} N := SelectMenu( RPM ); {$ENDIF} end else begin N := 1; end; until N = 1; ApplyParentalBonus( F ); ApplyParentalBonus( M ); SetSAtt( PC^.SA , 'BIO1 <' + Bio1 + '>' ); CharacterDisplay( PC , Nil ); DisposeRPGMenu( RPM ); DisposeSATt( JobList ); end; Procedure AllocateStatPoints( PC: GearPtr; StatPt: Integer ); { Distribute the listed number of points out to the PC. } var RPM: RPGMenuPtr; PCStats: Array [1..NumGearStats] of Integer; T: Integer; Function StatSelectorMsg( N: Integer ): String; var msg: String; begin msg := StatName[ N ]; {$IFDEF SDLMODE} while TextLength( Game_Font , msg ) < ( ZONE_CharGenMenu.W - 50 ) do msg := msg + ' '; {$ELSE} while Length( msg ) < 12 do msg := msg + ' '; {$ENDIF} msg := msg + BStr( PCStats[ N ] + PC^.Stat[ N ] ); StatSelectorMsg := msg; end; begin { Zero out the base stat line, and make sure minimum values are met. } for t := 1 to NumGearStats do begin PCStats[ T ] := 0; if PC^.Stat[ T ] < 1 then begin PC^.Stat[ T ] := 1; Dec( StatPt ); end; end; { Create the menu & set up the display. } {$IFDEF SDLMODE} RPM := CreateRPGMenu( MenuItem , MenuSelect , ZONE_CharGenMenu ); {$ELSE} RPM := CreateRPGMenu( MenuItem , MenuSelect , ZONE_SkillGenMenu ); {$ENDIF} RPM^.Mode := RPMNoCleanup; {$IFDEF SDLMODE} RCDescMessage := MsgString( 'RANDCHAR_ASPDesc' ); RCPromptMessage := ''; {$ELSE} GameMsg( MsgString( 'RANDCHAR_ASPDesc' ) , ZONE_CharGenDesc , InfoGreen ); DrawExtBorder( ZONE_SkillGenDesc , BorderBlue ); {$ENDIF} for t := 1 to NumGearStats do begin AddRPGMenuItem( RPM , StatSelectorMsg( T ) , 1 , MsgString( 'STAT_' + BStr( T ) ) ); end; AddRPGMenuItem( RPM , MsgString( 'RANDCHAR_ASPDone' ) , 2 ); RPM^.dtexcolor := InfoGreen; {$IFDEF SDLMODE} AttachMenuDesc( RPM , ZONE_CharGenDesc ); {$ELSE} AttachMenuDesc( RPM , ZONE_SkillGenDesc ); {$ENDIF} { Add RPGKeys for the left and right buttons, since these will be } { used to spend & retrieve points. } {$IFDEF SDLMODE} AddRPGMenuKey( RPM , RPK_Right , 1 ); AddRPGMenuKey( RPM , RPK_Left , -1 ); {$ELSE} AddRPGMenuKey( RPM , KeyMap[ KMC_East ].KCode , 1 ); AddRPGMenuKey( RPM , KeyMap[ KMC_West ].KCode , -1 ); {$ENDIF} repeat {$IFDEF SDLMODE} RCCaption := MsgString( 'RANDCHAR_ASPPrompt' ) + BStr( StatPt ); T := SelectMenu( RPM , @RandCharRedraw ); {$ELSE} CMessage( MsgString( 'RANDCHAR_ASPPrompt' ) + BStr( StatPt ) , ZONE_CharGenPrompt , InfoHilight ); T := SelectMenu( RPM ); {$ENDIF} if ( T = 1 ) and ( RPM^.selectitem <= NumGearStats ) and ( StatPt > 0 ) then begin { Increase Stat } { Only do this if the player has enough points to do so... } if ( StatPt > 1 ) or ( PCStats[ RPM^.selectitem ] < NormalMaxStatValue ) then begin { Increase the stat. } Inc( PCStats[ RPM^.selectitem ] ); { Decrease the free stat points. Take away 2 if } { this stat has been improved to the normal maximum. } Dec( StatPt ); if PCStats[ RPM^.selectitem ] > NormalMaxStatValue then Dec( StatPt ); { Replace the message line. } RPMLocateByPosition(RPM , RPM^.selectitem )^.msg := StatSelectorMsg( RPM^.selectitem ); end; end else if ( T = -1 ) and ( RPM^.selectitem <= NumGearStats ) then begin { Decrease Stat } if PCStats[ RPM^.selectitem ] > 0 then begin { Decrease the stat. } Dec( PCStats[ RPM^.selectitem ] ); { Increase the free stat points. Give back 2 if } { this stat has been improved to the normal maximum. } Inc( StatPt ); if PCStats[ RPM^.selectitem ] >= NormalMaxStatValue then Inc( StatPt ); { Replace the message line. } RPMLocateByPosition(RPM , RPM^.selectitem )^.msg := StatSelectorMsg( RPM^.selectitem ); end; end; until T = 2; { Copy temporary values into the PC record. } for T := 1 to NumGearStats do PC^.Stat[T] := PC^.Stat[T] + PCStats[T]; { Spend remaining stat points randomly. } if StatPt > 0 then RollStats( PC , StatPt ); { Get rid of the menu. } DisposeRPGMenu( RPM ); { Clear the menu area. } {$IFNDEF SDLMODE} ClrZone( ZONE_CharGenMenu ); {$ENDIF} end; Procedure EasyStatPoints( PC: GearPtr; StatPt: Integer ); { Allocate the stat points for the PC mostly randomly, making sure there are no } { obvious deficiencies. } var T: Integer; begin { Every stat needs at least 10 in it. } for t := 1 to NumGearStats do begin PC^.Stat[ T ] := 10; StatPt := StatPt - 10; end; { Spend remaining stat points randomly. } if StatPt > 0 then RollStats( PC , StatPt ); end; Procedure ApplyJobBonus( PC: GearPtr; var Cash: LongInt; JobString: String ); { Apply the bonuses gained from this job to the PC record. } var Skill,N: Integer; FX,Name: String; begin { Apply skill bonuses. } FX := RetrieveAString( JobString ); Name := RetrieveAPreamble( JobString ); N := 0; { The PC gets a +1 to each job skill. } while FX <> '' do begin Skill := ExtractValue( FX ); if ( Skill > 0 ) and ( Skill <= NumSkill ) then begin AddNAtt( PC^.NA , NAG_Skill , SKill , 1 ); Inc( N ); end; end; { The fewer skills the PC has, the more cash he'll get. } if N < 5 then Cash := Cash + ( 5 - N ) * 20000; { Record the player's job. } SetSAtt( PC^.SA , 'JOB <' + Name + '>' ); end; Procedure SelectJob( PC: GearPtr; var Cash: LongInt ); { Select a job from the standard job list, then give out skill points } { and take away cash. } var RPM: RPGMenuPtr; JobList,Job: SAttPtr; N: Integer; begin RPM := CreateRPGMenu( MenuItem , MenuSelect , ZONE_CharGenMenu ); {$IFDEF SDLMODE} RCPromptMessage := MsgString( 'RANDCHAR_JobPrompt' ); RCDescMessage := MsgString( 'RANDCHAR_JobDesc' ); RCCaption := ''; {$ELSE} CMessage( MsgString( 'RANDCHAR_JobPrompt' ) , ZONE_CharGenPrompt , InfoHilight ); GameMsg( MsgString( 'RANDCHAR_JobDesc' ) , ZONE_CharGenDesc , InfoGreen ); {$ENDIF} JobList := LoadStringList( Jobs_File ); { Fill out the menu. } N := 1; Job := JobList; while Job <> Nil do begin AddRPGMenuItem( RPM , RetrieveAPreamble( Job^.Info ) , N ); Inc( N ); Job := Job^.Next; end; RPMSortAlpha( RPM ); {$IFDEF SDLMODE} N := SelectMenu( RPM , @RandCharRedraw ); {$ELSE} N := SelectMenu( RPM ); {$ENDIF} if N <> -1 then begin { Find the job that was chosen. } Job := JobList; while N > 1 do begin Job := Job^.Next; Dec( N ); end; ApplyJobBonus( PC , Cash , Job^.Info ); end; DisposeRPGMenu( RPM ); DisposeSAtt( JobList ); end; Procedure RandomJob( PC: GearPtr; var Cash: LongInt ); { Select a job from the standard job list, then give out skill points } { and take away cash. } var JobList,Job: SAttPtr; begin JobList := LoadStringList( Jobs_File ); Job := SelectRandomSAtt( JobList ); ApplyJobBonus( PC , Cash , Job^.Info ); DisposeSAtt( JobList ); end; Procedure AllocateSkillPoints( PC: GearPtr; SkillPt: Integer ); { Distribute the listed number of points out to the PC. } var RPM: RPGMenuPtr; PCSkills: Array [1..NumSkill] of Integer; T,SkNum: Integer; Function SkillSelectorMsg( N: Integer ): String; var msg: String; begin msg := SkillMan[ N ].Name; {$IFDEF SDLMODE} while TextLength( Game_Font , msg ) < ( ZONE_CharGenMenu.W - 50 ) do msg := msg + ' '; {$ELSE} while Length( msg ) < 20 do msg := msg + ' '; {$ENDIF} msg := msg + BStr( NAttValue( PC^.NA , NAG_Skill , N ) + PCSkills[ N ] ); SkillSelectorMsg := msg; end; Function NumPickedSkills: Integer; var SkT,NPS: Integer; begin NPS := 0; for SkT := 1 to NumSkill do begin if ( NAttValue( PC^.NA , NAG_Skill , SkT ) > 0 ) or ( PCSkills[ Skt ] > 0 ) then Inc( NPS ); end; NumPickedSkills := NPS; end; begin { Zero out the base skill values. } for t := 1 to NumSkill do begin PCSkills[ T ] := 0; end; { Create the menu & set up the display. } {$IFDEF SDLMODE} RPM := CreateRPGMenu( MenuItem , MenuSelect , ZONE_CharGenMenu ); {$ELSE} RPM := CreateRPGMenu( MenuItem , MenuSelect , ZONE_SkillGenMenu ); {$ENDIF} RPM^.Mode := RPMNoCleanup; {$IFDEF SDLMODE} RCDescMessage := MsgString( 'RANDCHAR_SkillDesc' ); RCPromptMessage := ''; RCCaption := ''; {$ELSE} GameMsg( MsgString( 'RANDCHAR_SkillDesc' ) , ZONE_CharGenDesc , InfoGreen ); DrawExtBorder( ZONE_SkillGenDesc , BorderBlue ); {$ENDIF} for t := 1 to NumSkill do begin AddRPGMenuItem( RPM , SkillSelectorMsg( T ) , T , SkillDesc( T ) ); end; RPMSortAlpha( RPM ); AddRPGMenuItem( RPM , MsgString( 'RANDCHAR_ASPDone' ) , -2 ); RPM^.dtexcolor := InfoGreen; {$IFDEF SDLMODE} AttachMenuDesc( RPM , ZONE_CharGenDesc ); {$ELSE} AttachMenuDesc( RPM , ZONE_SkillGenDesc ); {$ENDIF} { Add RPGKeys for the left and right buttons, since these will be } { used to spend & retrieve points. } {$IFDEF SDLMODE} AddRPGMenuKey( RPM , RPK_Right , 1 ); AddRPGMenuKey( RPM , RPK_Left , -1 ); {$ELSE} AddRPGMenuKey( RPM , KeyMap[ KMC_East ].KCode , 1 ); AddRPGMenuKey( RPM , KeyMap[ KMC_West ].KCode , -1 ); {$ENDIF} repeat {$IFDEF SDLMODE} RCCaption := MsgString( 'RANDCHAR_ASPPrompt' ) + BStr( SkillPt ); T := SelectMenu( RPM , @RandCharRedraw ); {$ELSE} if TooManySkillsPenalty( PC , NumPickedSkills ) > 0 then begin CMessage( MsgString( 'RANDCHAR_ASPPrompt' ) + BStr( SkillPt ) , ZONE_CharGenPrompt , EnemyRed ); end else begin CMessage( MsgString( 'RANDCHAR_ASPPrompt' ) + BStr( SkillPt ) , ZONE_CharGenPrompt , InfoHilight ); end; T := SelectMenu( RPM ); {$ENDIF} if ( T > 0 ) and ( SkillPt > 0 ) then begin { Increase Skill } { Figure out which skill we're changing... } SkNum := RPMLocateByPosition(RPM , RPM^.selectitem )^.value; { Only increase if the skill < 10... } if ( SkNum > 0 ) and ( SkNum <= NumSkill ) and ( PCSkills[ SkNum ] < MaxStartingSkill ) and ( SkillPt >= PCSkills[ SkNum ] ) then begin if PCSkills[ SkNum ] = 0 then begin Dec( SkillPt ); end else begin SkillPt := SkillPt - PCSkills[ SkNum ]; end; Inc( PCSkills[ SkNum ] ); { Replace the message line. } RPMLocateByPosition(RPM , RPM^.selectitem )^.msg := SkillSelectorMsg( SkNum ); end; end else if ( T = -1 ) then begin { Decrease Skill } { Figure out which skill we're changing... } SkNum := RPMLocateByPosition(RPM , RPM^.selectitem )^.value; { Only decrease if the skill > 0... } if ( SkNum > 0 ) and ( SkNum <= NumSkill ) and ( PCSkills[ SkNum ] > 0 ) then begin if PCSkills[ SkNum ] = 1 then begin Inc( SkillPt ); end else begin SkillPt := SkillPt + PCSkills[ SkNum ] - 1; end; Dec( PCSkills[ SkNum ] ); { Replace the message line. } RPMLocateByPosition(RPM , RPM^.selectitem )^.msg := SkillSelectorMsg( SkNum ); end; end; until T = -2; { Copy temporary values into the PC record. } for T := 1 to NumSkill do AddNAtt( PC^.NA , NAG_Skill , T , PCSkills[T] ); { Convert remaining skill points into experience points. } if SkillPt > 0 then AddNAtt( PC^.NA , NAG_Experience , NAS_TotalXP , SkillPt * 100 ); { Get rid of the menu. } DisposeRPGMenu( RPM ); { Clear the menu area. } {$IFNDEF SDLMODE} ClrZone( ZONE_CharGenMenu ); {$ENDIF} end; Procedure RandomSkillPoints( PC: GearPtr; SkillPt: Integer ); { Allocate out some sensible skill points to hopefully keep this beginning character } { alive. } const NumBeginnerSkills = 13; BeginnerSkills: Array [1..NumBeginnerSkills] of Byte = ( 11, 12, 13, 14, 15, 18, 20, 21, 23, 25, 26, 30, 33 ); PointsForLevel: Array [1..5] of Byte = ( 1,2,4,7,11 ); Function CheckLevel( L: Integer ): Integer; { If the requested skill level is too great for the } { number of skill points posessed, reduce it. } begin if SkillPt < 1 then Exit( 0 ); while SkillPt < PointsForLevel[ L ] do Dec( L ); CheckLevel := L; end; var t,L,tries,X1,X2: Integer; begin { First give decent Mecha Piloting and Dodge scores. } t := Random( 2 ) + 4; AddNatt( PC^.NA , NAG_Skill , 5 , T ); SkillPt := SkillPt - PointsForLevel[ t ]; t := Random( 2 ) + 4; AddNatt( PC^.NA , NAG_Skill , 10 , T ); SkillPt := SkillPt - PointsForLevel[ t ]; { Give some Conversation. } t := Random( 3 ) + 1; AddNatt( PC^.NA , NAG_Skill , 19 , T ); SkillPt := SkillPt - PointsForLevel[ t ]; { Add combat skills. } { The default character will get three decent combat skills for } { mecha and another three for personal. } X1 := Random( 4 ) + 1; X2 := Random( 4 ) + 1; for t := 1 to 4 do begin if T <> X1 then begin L := CheckLevel( 2 + Random( 4 ) ); AddNAtt( PC^.NA , NAG_Skill , T , L ); if L > 0 then SkillPt := SkillPt - PointsForLevel[ L ]; end; if T <> X2 then begin L := CheckLevel( 2 + Random( 3 ) ); AddNAtt( PC^.NA , NAG_Skill , T + 5 , L ); if L > 0 then SkillPt := SkillPt - PointsForLevel[ L ]; end; end; { Add miscellaneous skills. } tries := 500; while ( SkillPt > 0 ) and ( tries > 0 ) do begin Dec( tries ); t := BeginnerSkills[ Random( NumBeginnerSkills ) + 1 ]; if NAttValue( PC^.NA , NAG_Skill , T ) <= 1 then begin L := CheckLevel( 3 + Random( 3 ) ); AddNAtt( PC^.NA , NAG_Skill , T , L ); SkillPt := SkillPt - PointsForLevel[ L ]; end; end; if SkillPt > 0 then AddNAtt( PC^.NA , NAG_Experience , NAS_TotalXP , SkillPt * 100 ); end; Procedure SetTraits( PC: GearPtr ); { Set some personality traits for the PC. } var RPM: RPGMenuPtr; N,Traits: Integer; begin { Create the menu and set up the display. } RPM := CreateRPGMenu( MenuItem , MenuSelect , ZONE_CharGenMenu ); RPM^.Mode := RPMNoCleanup; {$IFDEF SDLMODE} RCDescMessage := MsgString( 'RANDCHAR_STDesc' ); {$ELSE} GameMsg( MsgString( 'RANDCHAR_STDesc' ) , ZONE_CharGenDesc , InfoGreen ); {$ENDIF} { Add the personality traits to the menu. There are two traits which } { cannot be selected at the time of character generation and instead } { have to be earned through play- Heroic/Villainous and Renowned/Wangtta. } { v0.850: Lawful/Chaotic cannot be set at the start of play either. } for N := 3 to Num_Personality_Traits do begin if N <> Abs( NAS_Renowned ) then begin { Store the positive traits as 1... , } { the negative ones as 1+Num_Personality_Traits... } AddRPGMenuItem( RPM , PTraitName[ N , 1 ] , N ); AddRPGMenuItem( RPM , PTraitName[ N , 2 ] , N + Num_Personality_Traits ); end; end; RPMSortAlpha( RPM ); AddRPGMenuItem( RPM , MsgString( 'RANDCHAR_STCancel' ) , -1 ); Traits := 3; repeat {$IFDEF SDLMODE} RCPromptMessage := MsgString( 'RANDCHAR_STPrompt' ) + BStr( Traits ); RCCaption := ''; N := SelectMenu( RPM , @RandCharRedraw ); {$ELSE} CMessage( MsgString( 'RANDCHAR_STPrompt' ) + BStr( Traits ) , ZONE_CharGenPrompt , InfoHilight ); N := SelectMenu( RPM ); {$ENDIF} if N > Num_Personality_Traits then begin { The PC is placing negative points into this trait. } N := N - Num_Personality_Traits; AddNAtt( PC^.NA , NAG_CharDescription , -N , -25 ); Dec( Traits ); end else if N > 0 then begin { The PC is placing positive points into this trait. } AddNAtt( PC^.NA , NAG_CharDescription , -N , 25 ); Dec( Traits ); end; until ( N = -1 ) or ( Traits = 0 ); { Get rid of the menu. } DisposeRPGMenu( RPM ); { Clear the menu area. } {$IFNDEF SDLMODE} ClrZone( ZONE_CharGenMenu ); {$ENDIF} end; {$IFDEF SDLMODE} Procedure SelectSprite( PC: GearPtr ); { Select a sprite for the PC's portrait. } var RPM: RPGMenuPtr; PList: SAttPtr; P,N: Integer; begin RPM := CreateRPGMenu( MenuItem , MenuSelect , ZONE_CharGenMenu ); AddRPGMenuItem( RPM , MsgString( 'RANDCHAR_NextPicture' ) , 1 ); AddRPGMenuItem( RPM , MsgString( 'RANDCHAR_LastPicture' ) , 2 ); AddRPGMenuItem( RPM , MsgString( 'RANDCHAR_AcceptPicture' ) , -1 ); if NAttValue( PC^.NA , NAG_CharDescription , NAS_Gender ) = NAV_Male then begin PList := CreateFileList( Graphics_Directory + 'por_m_*.*' ); end else begin PList := CreateFileList( Graphics_Directory + 'por_f_*.*' ); end; RCDescMessage := ''; RCPromptMessage := MsgString( 'RANDCHAR_PicturePrompt' ); RCCaption := ''; P := 1; repeat CleanSpriteList; SetSAtt( PC^.SA , 'SDL_PORTRAIT <' + RetrieveSAtt( PList , P )^.Info + '>' ); N := SelectMenu( RPM , @RandCharRedraw ); if N = 1 then begin Inc( P ); if P > NumSatts( PList ) then P := 1; end else if N = 2 then begin Dec( P ); if P < 1 then P := NumSatts( PList ); end; until N = -1; DisposeSAtt( PList ); DisposeRPGMenu( RPM ); end; {$ENDIF} Function CharacterCreator: GearPtr; { This is my brand-spankin' new character generator. It is meant } { to emulate the interactive way in which characters are generated } { for such games as Mekton and Traveller. } const MODE_Regular = 1; MODE_Easy = 0; var PC: GearPtr; M: Integer; N,StatPt,SkillPt,Cash: LongInt; name: String; begin ClrScreen; DrawCharGenBorder; M := SelectMode; if M = -1 then Exit( Nil ); { Start by allocating the PC record. } PC := NewGear( Nil ); PC^.G := GG_Character; InitGear( PC ); StatPt := 100; SkillPt := 50; Cash := 35000; {$IFDEF SDLMODE} SetSAtt( PC^.SA , 'SDL_COLORS <49 91 161 252 212 195 150 112 89>' ); {$ENDIF} { First select gender, keeping in mind that the selection may be } { cancelled. } N := SelectGender; if N = -1 then begin DisposeGear( PC ); Exit( Nil ); end else begin SetNAtt( PC^.NA , NAG_CharDescription , NAS_Gender , N ); end; {$IFNDEF SDLMODE} CharacterDisplay( PC , Nil ); {$ENDIF} { Next select age. } if M = MODE_Regular then begin N := SelectAge; SetNAtt( PC^.NA , NAG_CharDescription , NAS_DAge , N ); CharacterDisplay( PC , Nil ); end else begin N := Random( 10 ) - Random( 5 ); SetNAtt( PC^.NA , NAG_CharDescription , NAS_DAge , N ); end; { Adjust cash & free skill points based on Age. } AddNAtt( PC^.NA , NAG_Experience , NAS_TotalXP , ( N + 5 ) * 25 ); Cash := Cash - N*3000; {$IFDEF SDLMODE} RCPC := PC; {$ENDIF} if M = MODE_Regular then begin GenerateFamilyHistory( PC , Cash , True ); end else begin GenerateFamilyHistory( PC , Cash , False ); end; CharacterDisplay( PC , Nil ); { Allocate stat points. } if M = MODE_Regular then begin AllocateStatPoints( PC , StatPt ); CharacterDisplay( PC , Nil ); end else begin EasyStatPoints( PC , StatPt ); end; { Select a job. } if M = MODE_Regular then begin SelectJob( PC , Cash ); CharacterDisplay( PC , Nil ); end else begin RandomJob( PC , Cash ); end; { Allocate skill points. } if M = MODE_Regular then begin AllocateSkillPoints( PC , SkillPt ); CharacterDisplay( PC , Nil ); end else begin RandomSkillPoints( PC , SkillPt ); end; { Set personality traits. } if M = MODE_Regular then begin SetTraits( PC ); CharacterDisplay( PC , Nil ); end; { Store cash. } if Cash < 1 then Cash := 1; Cash := Cash + Random( 100 ); AddNAtt( PC^.NA , NAG_Experience , NAS_Credits , Cash ); CharacterDisplay( PC , Nil ); { Select a name. } { If no name is entered, this cancels character creation. } {$IFDEF SDLMODE} { In SDLMode, before selecting a name, finalize the portrait. } SelectSprite( PC ); name := GetStringFromUser( MsgString( 'RANDCHAR_GetName' ) , @RandCharRedraw ); {$ELSE} name := GetStringFromUser( MsgString( 'RANDCHAR_GetName' ) ); {$ENDIF} if Name <> '' then begin SetSAtt( PC^.SA , 'name <'+name+'>'); CharacterDisplay( PC , Nil ); end else begin DisposeGear( PC ); end; { Clear the screen, and return the PC. } ClrScreen; CharacterCreator := PC; end; Procedure GenerateNewPC; { Call the character creator, and save the resultant } { character to disk. } var PC: GearPtr; begin PC := CharacterCreator; if PC <> Nil then begin { Write this character to disk. } SaveChar( PC ); { Get rid of the PC gear. } DisposeGear( PC ); end; end; end. GearHead/cosplay.pas0000644000175000017500000001551110563352310013334 0ustar kaolkaolProgram cosplay; {$APPTYPE GUI} {$DEFINE SDLMODE} uses sdl,sdlgfx,sdlmenus,gears,texutil,ui4gh,sdl_image; const NumStandardColors = 35; StandardColors: Array [1..NumStandardColors] of TSDL_Color = ( ( r:200; g: 0; b: 0 ) , ( r:200; g:200; b: 0 ) , ( r: 0; g:200; b: 0 ), ( r:136; g:141; b:101 ) , ( r: 66; g:121; b:119 ) , ( r:201; g:205; b:229 ), ( r:235; g:147; b:115 ) , ( r: 1; g: 75; b: 67 ) , ( r: 49; g: 91; b:161 ) , ( r:130; g:143; b:114 ) , ( r:103; g: 3; b: 45 ) , ( r: 88; g:113; b: 86 ) , ( r:123; g: 63; b: 0 ) , ( r: 6; g: 42; b:120 ) , ( r:199; g:188; b:162 ) , ( r:122; g: 88; b:193 ) , ( r: 56; g: 26; b: 81 ) , ( r:157; g:172; b:183 ) , ( r:168; g:153; b:230 ) , ( r:150; g:112; b: 89 ) , ( r:244; g:216; b: 28 ) , ( r:245; g:213; b:160 ) , ( r:116; g:100; b: 13 ) , ( r: 36; g: 46; b: 22 ) , ( r:112; g: 28; b: 28 ) , ( r:255; g:107; b: 83 ) , ( r:166; g: 47; b: 32 ) , ( r:152; g: 61; b: 97 ) , ( r:255; g:212; b:195 ) , ( r:208; g: 34; b: 51 ) , ( r:234; g:180; b: 88 ) , ( r:142; g: 62; b: 39 ) , ( r: 80; g: 80; b: 85 ) , ( r: 0; g: 0; b: 0 ) , ( r:255; g:255; b:255 ) ); StandardColorNames: Array [1..NumStandardColors] of String = ( 'Pure Red', 'Pure Yellow', 'Pure Green', 'Avocado', 'Jade', 'Aero Blue', 'Apricot', 'Aquamarine', 'Azure', 'Battleship Grey', 'Black Rose', 'Cactus', 'Cinnamon', 'Cobalt', 'Coral', 'Fuschia', 'Grape', 'Gull Grey', 'Lavender', 'Leather', 'Lemon', 'Maize', 'Mustard', 'Olive', 'Plum', 'Persimmon', 'Terracotta', 'Wine', 'Light Skin', 'Red Goes Faster', 'Desert Yellow', 'Chocolate', 'Deep Grey', 'True Black', 'True White' ); Swap_Colors_X = 400; Color_Rows = 5; Color_Columns = 11; RSwap_Y = 10; YSwap_Y = 200; GSwap_Y = 390; ZONE_Sprite_Display: TSDL_Rect = ( x:10; y:10; w: 380 ; h: 300 ); ZONE_RSwap_Name: TSDL_Rect = ( x:10; y:400; w: 380 ; h: 20 ); ZONE_RSwap_Data: TSDL_Rect = ( x:10; y:430; w: 380 ; h: 20 ); ZONE_YSwap_Name: TSDL_Rect = ( x:10; y:460; w: 380 ; h: 20 ); ZONE_YSwap_Data: TSDL_Rect = ( x:10; y:490; w: 380 ; h: 20 ); ZONE_GSwap_Name: TSDL_Rect = ( x:10; y:520; w: 380 ; h: 20 ); ZONE_GSwap_Data: TSDL_Rect = ( x:10; y:550; w: 380 ; h: 20 ); Function CPRelativeX( T: Integer ): Integer; begin CPRelativeX := ( ( T - 1 ) mod Color_Columns ) * 36; end; Function CPRelativeY( T: Integer ): Integer; begin CPRelativeY := ( ( T - 1 ) div Color_Columns ) * 36; end; Function StandardColorString( T: Integer ): String; begin StandardColorString := BStr( StandardColors[t].r ) + ' ' + BStr( StandardColors[t].g ) + ' ' + BStr( StandardColors[t].b ); end; Procedure DrawAllColors( X , Y: Integer ); var T: Integer; CS: String; MyDest: TSDL_Rect; SS: SensibleSpritePtr; begin for t := 1 to NumStandardColors do begin CS := StandardColorString( T ); MyDest.X := CPRelativeX( T ) + X; MyDest.Y := CPRelativeY( T ) + Y; SS := ConfirmSprite( 'cosplay.png' , CS , 36 , 36 ); DrawSprite( SS , MyDest , 0 ); end; end; Procedure IndicateColor( X , Y , T: Integer; C: String ); var MyDest: TSDL_Rect; SS: SensibleSpritePtr; begin MyDest.X := CPRelativeX( T ) + X; MyDest.Y := CPRelativeY( T ) + Y; SS := ConfirmSprite( 'cosplay.png' , C , 36 , 36 ); DrawSprite( SS , MyDest , 1 ); end; Procedure DetermineAreaHit( var RSwap , YSwap , GSwap: Integer ); { The mouse coordinates are held in MOUSE_X , MOUSE_Y. } { Try to determine which of our brightly colored little boxes were hit. } var X,Y,N: Integer; begin { Only process mouse hits within zone. } if ( Mouse_X >= Swap_Colors_X ) and ( Mouse_X <= ( Swap_Colors_X + Color_Columns * 36 ) ) then begin if ( Mouse_Y >= RSwap_Y ) and ( Mouse_Y <= ( RSwap_Y + Color_Rows * 36 ) ) then begin X := ( Mouse_X - Swap_Colors_X ) div 36; Y := ( Mouse_Y - RSwap_Y ) div 36; N := Y * Color_Columns + X + 1; if ( N >= 1 ) and ( N <= NumStandardColors ) then begin IndicateColor( Swap_Colors_X , RSwap_Y , RSwap, '0 0 0 0 0 0 0 0 0' ); RSwap := N; end; end else if ( Mouse_Y >= YSwap_Y ) and ( Mouse_Y <= ( YSwap_Y + Color_Rows * 36 ) ) then begin X := ( Mouse_X - Swap_Colors_X ) div 36; Y := ( Mouse_Y - YSwap_Y ) div 36; N := Y * Color_Columns + X + 1; if ( N >= 1 ) and ( N <= NumStandardColors ) then begin IndicateColor( Swap_Colors_X , YSwap_Y , YSwap, '0 0 0 0 0 0 0 0 0' ); YSwap := N; end; end else if ( Mouse_Y >= GSwap_Y ) and ( Mouse_Y <= ( GSwap_Y + Color_Rows * 36 ) ) then begin X := ( Mouse_X - Swap_Colors_X ) div 36; Y := ( Mouse_Y - GSwap_Y ) div 36; N := Y * Color_Columns + X + 1; if ( N >= 1 ) and ( N <= NumStandardColors ) then begin IndicateColor( Swap_Colors_X , GSwap_Y , GSwap, '0 0 0 0 0 0 0 0 0' ); GSwap := N; end; end; end; end; Procedure EditSpriteColors( SpriteName: String ); var Z: TSDL_Rect; A: Char; RSwap,YSwap,GSwap: Integer; SS: SensibleSpritePtr; begin ClrScreen; RSwap := 1; YSwap := 2; GSwap := 3; DrawAllColors( Swap_Colors_X , RSwap_Y ); DrawAllColors( Swap_Colors_X , YSwap_Y ); DrawAllColors( Swap_Colors_X , GSwap_Y ); repeat ClrZone( ZONE_Sprite_Display ); Z := ZONE_Sprite_Display; SS := ConfirmSprite( SpriteName , StandardColorString( RSwap ) + ' ' + StandardColorString( YSwap ) + ' ' + StandardColorString( GSwap ) , Z.W , Z.H ); DrawSprite( SS , Z , 0 ); { RemoveSprite( SS );} IndicateColor( Swap_Colors_X , RSwap_Y , RSwap, '0 255 255' ); IndicateColor( Swap_Colors_X , YSwap_Y , YSwap, '0 255 255' ); IndicateColor( Swap_Colors_X , GSwap_Y , GSwap, '0 255 255' ); NFCMessage( StandardColorNames[ RSwap ] , ZONE_RSwap_Name , StandardColors[ RSwap ] ); NFCMessage( StandardColorString( RSwap ) , ZONE_RSwap_Data , StdWhite ); NFCMessage( StandardColorNames[ YSwap ] , ZONE_YSwap_Name , StandardColors[ YSwap ] ); NFCMessage( StandardColorString( YSwap ) , ZONE_YSwap_Data , StdWhite ); NFCMessage( StandardColorNames[ GSwap ] , ZONE_GSwap_Name , StandardColors[ GSwap ] ); NFCMessage( StandardColorString( GSwap ) , ZONE_GSwap_Data , StdWhite ); GHFlip; A := RPGKey; if A = RPK_MouseButton then begin DetermineAreaHit( RSwap , YSwap , GSwap ); end; until A = #27; end; var FileMenu: RPGMenuPtr; SpriteName: String; begin Mouse_Pointer := Img_Load( 'Image\cosplay_pointer.png' ); SDL_SetColorKey( Mouse_Pointer , SDL_SRCCOLORKEY or SDL_RLEACCEL , SDL_MapRGB( Mouse_Pointer^.Format , 0 , 0, 255 ) ); FileMenu := CreateRPGMenu( MenuItem , MenuSelect , ZONE_Menu ); BuildFileMenu( FileMenu , Graphics_Directory + '*.*' ); RPMSortAlpha( FileMenu ); SpriteName := ''; repeat SpriteName := SelectFile( FileMenu , Nil ); if SpriteName <> '' then EditSpriteColors( SpriteName ); until SpriteName = ''; DisposeRPGMenu( FileMenu ); end. GearHead/Design/0000755000175000017500000000000010640175275012374 5ustar kaolkaolGearHead/Design/Joust.txt0000644000175000017500000000146610371160572014243 0ustar kaolkaolBattroid 4 Name Desig desc Mod Head Size 2 Armor 4 sub CPit Sensor 5 end Mod Body Armor 4 sub MLauncher 3 Name Magazine 16 sub Rockets 3 end end Mod Arm Name Size 3 Armor 3 sub Hand inv EMelee 6 Name end Gun 2 Name BV 2 Magazine 30 sub Ammo 2 end end Mod Arm Name Size 3 Armor 3 sub Hand Gun 2 Name BV 2 Magazine 30 sub Ammo 2 end end Mod Leg Name Armor 4 sub HoverJet 4 end Mod Leg Name Armor 4 sub HoverJet 4 end end GearHead/Design/Wolfram.txt0000644000175000017500000000144510116072630014535 0ustar kaolkaolBattroid 5 Name Desig SDL_Sprite Desc Mod Head Armor 3 sub Sensor 3 end inv HeadArmor 3 Name end Mod Body Armor 5 sub CPit Mount Name Mount Name inv BeamGun 7 Name Range 4 Acc -1 Speed 1 end end Mod Arm Name Armor 4 sub Hand inv Melee 14 Name Acc 1 end end Mod Arm Name Armor 4 sub Hand end Mod Leg Name Armor 4 Mod Leg Name Armor 4 end GearHead/Design/Harpy.txt0000644000175000017500000000314410563355232014217 0ustar kaolkaolGerwalk 6 Name Desig SDL_Sprite Desc Mod Head Size 5 Armor 6 Mass -5 sub Sensor 8 BeamGun 3 Name Range 6 Type Acc 1 Speed 4 Mass -2 end inv HeadArmor 5 Name Mass -8 end Mod Body Armor 6 Mass -5 sub CPit Armor 2 Mass -1 Gyro 3 Armor 2 Mass -1 Engine 6 Armor 2 Mass -1 Sensor 1 TarComp 1 ECM 7 ArcJet 8 end inv BodyArmor 5 Mass -8 sub ArcJet 5 end end Mod Storage Name Armor 6 Size 5 Mass -5 sub ArcJet 9 Mount Name inv MLauncher 15 Name Acc 1 Range 10 Magazine 6 sub Rockets 15 Type end end end Mod Storage Name Armor 6 Size 5 Mass -5 sub ArcJet 9 Mount Name inv MLauncher 15 Name Acc 1 Range 10 Magazine 6 sub Rockets 15 Type end end end Mod Arm Name Size 4 Armor 5 Mass -6 sub Hand Name inv EMelee 7 Name end Mount Name inv STC LAS-10 Range 8 Mass -7 end end Mod Arm Name Size 4 Armor 5 Mass -6 sub Hand Name Mount Name inv STC LAS-10 Range 8 Mass -7 end end inv Shield 5 DefBonus -1 end end GearHead/Design/Longman.txt0000644000175000017500000000174210116072630014521 0ustar kaolkaolBattroid 5 Name Desig SDL_Sprite Mod Head Size 2 Armor 3 Mass -2 sub Sensor 8 end Mod Body Armor 4 Mass -4 sub Sensor 2 CPit Engine 5 HighOutput Mount Name Mount Name ArcJet 6 end Mod Arm Name Size 3 Armor 3 Mass -3 sub Hand inv BeamGun 20 Name Range 10 Acc 1 Speed 3 Mass -5 end MLauncher 2 Name Range 4 Magazine 10 sub Rockets 2 end end Mod Arm Name Size 3 Armor 3 Mass -3 sub Hand MLauncher 2 Name Range 4 Magazine 10 sub Rockets 2 end end Mod Leg Name Armor 3 Mass -3 sub Mount Name ArcJet 4 end Mod Leg Name Armor 3 Mass -3 sub Mount Name ArcJet 4 end end GearHead/Design/Aranos.txt0000644000175000017500000000175310146501544014357 0ustar kaolkaolZoanoid 2 Name Desig Mod Head Armor 2 sub CPit Armor 1 Sensor 8 end Mod Body Armor 2 sub Gun 1 Name Acc -1 BV 3 Magazine 40 sub Ammo 1 end BeamGun 4 Name Range 6 Acc 1 end Mod Leg Name Size 1 Armor 2 sub Melee 2 Name end Mod Leg Name Size 1 Armor 2 sub Melee 2 Name end Mod Leg Name Size 1 Armor 2 sub MLauncher 1 Name Type Range 7 Magazine 10 sub Rockets 1 end end Mod Leg Name Size 1 Armor 2 sub MLauncher 1 Name Type Range 7 Magazine 10 sub Rockets 1 end end Mod Leg Name Size 1 Armor 2 sub Melee 2 Name end Mod Leg Name Size 1 Armor 2 sub Melee 2 Name end end GearHead/Design/Condor.txt0000644000175000017500000000210410563355173014357 0ustar kaolkaolBattroid 4 Name Desig SDL_Sprite desc Mod Head Armor 3 Size 3 Mass -1 sub CPit Sensor 5 end Mod Body Armor 3 Mass -2 sub Mount Name inv STC LRL-32 end Mount Name inv STC LRL-32 end Flight 4 end Mod Arm Name Size 3 Armor 3 sub Hand inv STC MAC-4 end end Mod Arm Name Size 3 Armor 3 sub Hand end Mod Wing Name Size 3 Armor 2 sub Flight 3 end Mod Wing Name Size 3 Armor 2 sub Flight 3 end Mod Leg Name Armor 3 sub Mount Name inv STC SWML-20 end Flight 2 end Mod Leg Name Armor 3 sub Mount Name inv STC SWML-20 end Flight 2 end end GearHead/Design/Daum2.txt0000644000175000017500000000262410163340060014073 0ustar kaolkaolBattroid 5 Name Desig SDL_Sprite desc Mod Head Armor 4 mass -3 sub Sensor 6 TarComp 1 BeamGun 3 Name type Range 3 Acc 1 BV 4 end inv HeadArmor 3 Mass -3 end Mod Body Armor 4 mass -5 sub CPit Armor 2 Gyro 2 Armor 1 Engine 5 Armor 1 Sensor 3 Mount Name Mount Name inv STC SWML-40 end ArcJet 5 end inv BodyArmor 4 Mass -4 end Mod Arm Name Armor 3 mass -3 sub Hand inv STC RG-8 end Mount Name inv Melee 7 name mass -3 end end inv ArmArmor 3 Mass -3 end Mod Arm Name Armor 3 Mass -3 sub Hand Mount Name end inv ArmArmor 3 Mass -3 EShield 4 DefBonus 2 end Mod Leg Name Armor 4 mass -3 sub ArcJet 4 Mount Name end inv LegArmor 3 Mass -2 sub ArcJet 2 end end Mod Leg Name Armor 4 mass -3 sub ArcJet 4 Mount Name end inv LegArmor 3 Mass -2 sub ArcJet 2 end end end GearHead/Design/Scylla.txt0000644000175000017500000000204110146505440014351 0ustar kaolkaolZoanoid 5 Name Desig SDL_Sprite desc Mod Head Size 6 Armor 5 sub CPit Armor 1 Sensor 7 BeamGun 8 Name Range 4 Type end Mod Body Armor 5 sub Mount Name inv STC LRL-48 end Mount Name inv STC HRP-6 end Flight 4 end Mod Leg Name Size 4 Armor 5 sub EMelee 6 Name Speed 1 Acc 1 Type end Mod Leg Name Size 4 Armor 5 sub EMelee 6 Name Speed 1 Acc 1 Type end Mod Leg Name Size 4 Armor 5 sub Mount Name inv STC SWML-20 end Flight 2 end Mod Leg Name Size 4 Armor 5 sub Mount Name inv STC SWML-20 end Flight 2 end end GearHead/Design/Thorshammer.txt0000644000175000017500000000166010146505250015420 0ustar kaolkaolBattroid 7 Name Desig SDL_Sprite desc Mod Body Armor 7 Mass -3 sub CPit Sensor 5 TarComp 2 Gyro 3 Mount Name inv STC SWML-120 end STC LAS-10 Range 4 Speed 1 STC LAS-10 Range 4 Speed 1 STC LAS-10 Range 4 Speed 1 end Mod Arm Name Size 5 Armor 7 Mass -1 sub Hand Mount Name inv Gun 16 Range 6 Name Magazine 25 Speed 3 sub Ammo 16 Type end end end Mod Arm Name Size 5 Armor 7 Mass -1 sub Hand Mount Name inv STC SML-5 end end Mod Leg Name Size 6 Armor 7 Mass -2 Mod Leg Name Size 6 Armor 7 Mass -2 end GearHead/Design/Fenris.txt0000644000175000017500000000155710146504310014356 0ustar kaolkaolZoanoid 4 Name Desig desc Mod Head Size 5 Armor 4 Mass -3 sub CPit Armor 1 Sensor 3 Melee 8 Name Acc 1 Speed 1 end Mod Body Armor 4 Mass -6 sub MLauncher 3 Name Magazine 10 sub Rockets 3 end TarComp 1 Overcharger 4 end Mod Leg Name Size 5 Armor 4 Mass -5 sub Mount Name inv STC MAC-4 end Melee 4 Acc 2 Speed 3 Name end Mod Leg Name Size 5 Armor 4 Mass -5 sub Mount Name inv STC MAC-4 end Melee 4 Acc 2 Speed 3 Name end Mod Tail Size 3 Armor 4 Mass -3 end GearHead/Design/Mek_Equipment.txt0000644000175000017500000000604110116074624015673 0ustar kaolkaol% ************************ % *** MELEE WEAPONS *** % ************************ Melee 2 Name Scale 2 Acc 1 Speed 3 Melee 5 Name Scale 2 Melee 8 Name Scale 2 Acc -1 % ******************************** % *** ENERGY MELEE WEAPONS *** % ******************************** EMelee 6 Name Scale 2 Acc 1 EMelee 15 Name Scale 2 Speed 1 Mass 7 % **************************** % *** BALLISTIC WEAPONS *** % **************************** STC PC-8 STC VC-5 STC PC-8 STC VC-5 STC LAC-3 STC AC-2 STC AC-6 STC AC-10 STC MAC-4 STC AC-2 STC AC-6 STC AC-10 STC MAC-4 STC AC-2 STC AC-6 STC AC-10 STC MAC-4 STC RG-8 STC RG-16 STC GR-12 STC GR-24 STC LAS-5 STC LAS-10 STC LAS-5 STC LAS-10 STC LAS-5 STC PHS-8 STC PHS-25 STC PAR-2 STC PAR-6 STC PAR-13 STC ICML-12 STC HWML-2 STC HWML-4 STC HWML-8 STC LRL-16 STC LRL-32 STC LRL-48 STC LRL-16 STC LRL-32 STC LRL-48 STC NUKE-1 STC HRP-6 STC HRP-12 STC SWML-20 STC SWML-40 STC SWML-60 STC SML-5 STC SWML-20 STC SWML-40 STC SWML-60 STC SWML-120 STC SML-5 STC SML-5 STC SML-5 MLauncher 10 Name Desig Scale 2 Range 6 Magazine 3 sub Rockets 10 Type end MLauncher 10 Name Desig Scale 2 Range 6 Magazine 12 sub Rockets 10 Type end % ***************** % *** SHIELDS *** % ***************** Shield 2 Name DefBonus -2 Scale 2 Shield 4 Name DefBonus -1 Scale 2 Shield 4 Name DefBonus -1 Scale 2 Shield 4 Name DefBonus -1 Scale 2 Shield 6 Name Scale 2 Shield 6 Name Scale 2 Shield 8 Name DefBonus 1 Scale 2 EShield 3 Name DefBonus 1 Scale 2 EShield 5 Name Scale 2 EShield 5 Name Scale 2 EShield 9 Name DefBonus -1 Scale 2 % ***************** % *** SENSORS *** % ***************** Sensor 1 Sensor 2 Sensor 3 Sensor 4 Sensor 5 Sensor 6 Sensor 7 Sensor 8 Sensor 9 Sensor 10 TarComp 1 TarComp 2 TarComp 3 TarComp 5 TarComp 7 TarComp 9 ECM 1 ECM 2 ECM 3 ECM 4 ECM 5 ECM 6 % ************************** % *** MOVEMENT SYSTEMS *** % ************************** Wheels 3 Scale 2 Wheels 5 Scale 2 Wheels 7 Scale 2 Tracks 3 Scale 2 Tracks 5 Scale 2 Tracks 7 Scale 2 HoverJet 3 Scale 2 HoverJet 5 Scale 2 HoverJet 7 Scale 2 Flight 2 Scale 2 Flight 3 Scale 2 Flight 4 Scale 2 Flight 5 Scale 2 Flight 7 Scale 2 ArcJet 1 Scale 2 ArcJet 2 Scale 2 ArcJet 3 Scale 2 ArcJet 5 Scale 2 ArcJet 7 Scale 2 Overcharger 1 Scale 2 Overcharger 3 Scale 2 Overcharger 5 Scale 2 Overcharger 7 Scale 2 GearHead/Design/BuruBuru.txt0000644000175000017500000001642010563355131014706 0ustar kaolkaolBattroid 5 Name Desig SDL_Sprite desc Mod Head Armor 4 sub Sensor 4 BeamGun 3 Name Scale 1 Range 4 Acc 2 Speed 3 end Mod Body Armor 4 sub CPit Armor 2 MLauncher 2 Name Speed 1 Magazine 24 sub Rockets 2 end end Mod Arm Name Armor 4 sub Hand inv Gun 9 Name Magazine 15 sub Ammo 9 end end end Mod Arm Name Armor 4 sub Hand inv Melee 5 Name Acc 1 end Gun 1 Name Acc -2 BV 5 Magazine 50 sub Ammo 1 end end Mod Leg Name Armor 4 sub HoverJet 5 end Mod Leg Name Armor 4 sub HoverJet 5 end end Battroid 5 Name Desig SDL_Sprite desc Mod Head Armor 4 sub Sensor 4 BeamGun 3 Name Scale 1 Range 4 Acc 2 Speed 3 end Mod Body Armor 5 sub CPit Armor 2 MLauncher 1 Name Range 3 Speed 1 Magazine 48 sub Rockets 1 end end Mod Arm Name Armor 4 sub Hand inv Gun 6 Name BV 1 Magazine 30 sub Ammo 6 end end Melee 3 Name Acc 1 end Mod Arm Name Armor 4 sub Hand inv Melee 10 Name end Gun 1 Name Acc -2 BV 5 Magazine 50 sub Ammo 1 end end Mod Leg Name Armor 5 sub HoverJet 5 end Mod Leg Name Armor 5 sub HoverJet 5 end end Battroid 5 Name Desig SDL_Sprite desc Mod Head Armor 4 sub Sensor 4 BeamGun 3 Name Scale 1 Range 4 Acc 2 Speed 3 end Mod Body Armor 4 sub CPit Armor 2 MLauncher 2 Name Speed 1 Magazine 24 sub Rockets 2 end end inv BodyArmor 2 sub Gun 2 Name Range 5 BV 3 Magazine 80 sub Ammo 2 end Gun 2 Name Range 5 BV 3 Magazine 80 sub Ammo 2 end end end Mod Arm Name Armor 4 sub Hand inv Gun 9 Name Magazine 15 sub Ammo 9 end end end inv ArmArmor 2 sub Melee 2 Name Acc -1 end end Mod Arm Name Armor 4 sub Hand Gun 1 Name Acc -2 BV 5 Magazine 50 sub Ammo 1 end end inv ArmArmor 2 sub Melee 2 Name Acc -1 end end Mod Leg Name Armor 4 sub HoverJet 5 end inv LegArmor 2 end Mod Leg Name Armor 4 sub HoverJet 5 end inv LegArmor 2 end end Battroid 5 Name Desig SDL_Sprite desc Mod Head Armor 4 sub Sensor 4 BeamGun 3 Name Scale 1 Range 4 Acc 2 Speed 3 end Mod Body Armor 4 sub CPit Armor 2 MLauncher 2 Name Speed 1 Magazine 24 sub Rockets 2 end end Mod Arm Name Armor 4 sub Hand inv Gun 6 Name BV 1 Magazine 30 sub Ammo 6 end end end Mod Arm Name Armor 4 sub Hand inv Melee 5 Name Acc 1 end Gun 1 Name Acc -2 BV 5 Magazine 50 sub Ammo 1 end end inv Shield 5 DefBonus 1 end Mod Leg Name Armor 4 sub HoverJet 5 end Mod Leg Name Armor 4 sub HoverJet 5 end end Battroid 5 Name Desig SDL_Sprite desc Mod Head Armor 4 sub Sensor 4 BeamGun 3 Name Scale 1 Range 4 Acc 2 Speed 3 end Mod Body Armor 4 sub CPit Armor 2 MLauncher 2 Name Speed 1 Magazine 24 sub Rockets 2 end end inv BodyArmor 2 sub BeamGun 15 Name Range 12 Acc -1 Speed 1 end end Mod Arm Name Armor 4 sub Hand inv BeamGun 5 Name Range 5 Acc 1 BV 4 end end Mod Arm Name Armor 4 sub Hand inv BeamGun 5 Name Range 5 Acc 1 BV 4 end Gun 1 Name Acc -2 BV 5 Magazine 50 sub Ammo 1 end end Mod Leg Name Armor 4 sub HoverJet 5 end inv LegArmor 2 sub HoverJet 2 end end Mod Leg Name Armor 4 sub HoverJet 5 end inv LegArmor 2 sub HoverJet 2 end end end Battroid 5 Name Desig SDL_Sprite desc Mod Head Armor 4 sub Sensor 4 BeamGun 3 Name Scale 1 Range 4 Acc 2 Speed 3 end Mod Body Armor 4 sub CPit Armor 2 MLauncher 2 Name Speed 1 Magazine 24 sub Rockets 2 end end Mod Arm Name Armor 4 sub Hand inv Gun 9 Name Magazine 15 sub Ammo 9 end end end Mod Arm Name Armor 4 sub Hand Gun 1 Name Acc -2 BV 5 Magazine 50 sub Ammo 1 end end inv Shield 5 DefBonus 1 end Mod Leg Name Armor 4 sub HoverJet 5 end Mod Leg Name Armor 4 sub HoverJet 5 end end Battroid 5 Name Desig SDL_Sprite desc Mod Head Armor 4 sub Sensor 4 BeamGun 3 Name Scale 1 Range 4 Acc 2 Speed 3 end Mod Body Armor 4 sub CPit Armor 2 MLauncher 2 Name Speed 1 Magazine 24 sub Rockets 2 end end Mod Arm Name Armor 4 sub Hand inv Gun 18 Name Magazine 10 Acc 1 Speed 1 sub Ammo 18 end end end Mod Arm Name Armor 4 sub Hand Gun 1 Name Acc -2 BV 5 Magazine 50 sub Ammo 1 end end inv Shield 2 DefBonus -1 end Mod Leg Name Armor 4 sub HoverJet 5 end Mod Leg Name Armor 4 sub HoverJet 5 end end GearHead/Design/Century.txt0000644000175000017500000000122410116072630014552 0ustar kaolkaolBattroid 4 Name Desig Mod Head Armor 4 sub CPit Armor 2 BeamGun 5 Name Range 3 Acc 1 Sensor 5 end Mod Body Armor 4 sub MLauncher 2 Name Range 7 Speed 1 Magazine 40 sub Rockets 2 end end Mod Arm Name Armor 4 sub Gun 10 Name Range 5 Speed 3 Magazine 20 sub Ammo 10 end end Mod Arm Name Armor 4 sub Hand BeamGun 5 Name Range 3 Acc 1 end Mod Leg Name Armor 4 Mod Leg Name Armor 4 end GearHead/Design/Musketeer.txt0000644000175000017500000000112110156651070015066 0ustar kaolkaolbattroid 4 name desig desc <> sdl_sprite mod head armor 4 sub Cpit Sensor 4 end mod body armor 4 sub LRL-32 end mod arm name size 5 armor 3 sub STC LAS-10 end mod arm name size 5 armor 3 sub STC LAS-10 end mod leg armor 3 sub MLauncher 5 name type range 8 magazine 1 sub Rockets 5 end end mod leg armor 3 sub MLauncher 5 name type range 8 magazine 1 sub Rockets 5 end end GearHead/Design/Ultari.txt0000644000175000017500000000355610563355330014402 0ustar kaolkaolGroundHugger 5 Name Desig SDL_Sprite Mod Turret Armor 5 sub Gun 9 Name Speed 1 Magazine 50 sub Ammo 9 end end Mod Body Armor 5 sub CPit Armor 2 Sensor 4 MLauncher 2 Name Range 3 Speed 1 Magazine 24 sub Rockets 2 end Gun 1 Name Acc -2 BV 9 Magazine 200 sub Ammo 1 end end Mod Storage Size 3 Armor 3 Name sub Tracks 6 end Mod Storage Size 3 Armor 3 Name sub Tracks 6 end end GroundHugger 5 Name Desig SDL_Sprite Mod Turret Armor 5 sub BeamGun 7 Name Type Speed 1 BV 4 end Mod Body Armor 5 sub CPit Armor 2 Sensor 4 MLauncher 2 Name Range 3 Speed 1 Magazine 24 sub Rockets 2 end Gun 1 Name Acc -2 BV 9 Magazine 200 sub Ammo 1 end end Mod Storage Size 3 Armor 3 Name sub Tracks 6 end Mod Storage Size 3 Armor 3 Name sub Tracks 6 end end GroundHugger 5 Name Desig SDL_Sprite Mod Turret Armor 5 sub MLauncher 8 Name Range 8 Speed 1 Magazine 16 sub Rockets 8 Type end end Mod Body Armor 5 sub CPit Armor 2 Sensor 4 MLauncher 2 Name Range 3 Speed 1 Magazine 24 sub Rockets 2 end Gun 1 Name Acc -2 BV 9 Magazine 200 sub Ammo 1 end end Mod Storage Size 3 Armor 3 Name sub Tracks 6 end Mod Storage Size 3 Armor 3 Name sub Tracks 6 end end GearHead/Design/Badger.txt0000644000175000017500000000165110116072630014311 0ustar kaolkaolBattroid 3 Name Desig Scale 1 SDL_Sprite Mod Head Size 2 Armor 3 Mass -2 sub Sensor 8 TarComp 1 end Mod Body Armor 3 Mass -2 sub CPit Armor 2 Mass -2 Sensor 1 Mount Name Mount Name inv MLauncher 3 Name Range 5 Acc -2 Magazine 24 sub Rockets 3 end end end Mod Arm Name Armor 3 Mass -2 sub Hand inv Gun 2 Name Range 5 Acc 1 BV 2 Magazine 90 sub Ammo 2 end end end Mod Arm Name Armor 3 Mass -2 sub Hand inv Melee 2 Name Acc 1 Speed 5 end end Mod Leg Name Armor 3 Mass -2 sub Wheels 4 end Mod Leg Name Armor 3 Mass -2 sub Wheels 4 end end GearHead/Design/Maanji.txt0000644000175000017500000000341610146507054014333 0ustar kaolkaolBattroid 6 Name Desig SDL_Sprite desc Mod Head Size 5 Armor 5 Mass -4 sub Sensor 9 BeamGun 1 Name Acc 1 BV 5 Type end inv HeadArmor 4 Mass -8 end Mod Body Armor 6 Mass -5 sub CPit Armor 1 Sensor 1 TarComp 2 Gyro 2 Mount Name inv MLauncher 12 Name Range 10 Acc 1 Type Magazine 3 sub Rockets 12 end end Mount Name inv MLauncher 12 Name Range 10 Acc 1 Type Magazine 3 sub Rockets 12 end end Flight 5 end inv BodyArmor 4 Name Mass -6 end Mod Arm Name Armor 5 Mass -1 sub Hand inv STC RG-16 end Mount Name inv STC SWML-20 end ArcJet 4 end inv ArmArmor 5 Name Mass -8 end Mod Arm Name Armor 5 Mass -1 sub Hand Mount Name inv STC SWML-20 end ArcJet 5 end inv ArmArmor 5 Name Mass -8 end Mod Leg Name Size 7 Armor 5 Mass -6 sub Mount inv STC SWML-20 end ArcJet 6 end inv LegArmor 5 Name Mass -5 end Mod Leg Name Size 7 Armor 5 Mass -6 sub Mount inv STC SWML-20 end ArcJet 6 end inv LegArmor 5 Name Mass -5 end end GearHead/Design/Neko.txt0000644000175000017500000000212310146505060014015 0ustar kaolkaolGerwalk 3 Name Desig SDL_Sprite desc Mod Body Armor 3 Mass -3 sub Mount Name CPit Gyro 3 Sensor 7 TarComp 1 ArcJet 2 BeamGun 1 Name BV 4 Range 2 Type end Mod Arm Name Size 2 Armor 3 Mass -2 sub Hand Name inv STC PAR-6 end end Mod Arm Name Size 2 Armor 3 Mass -2 sub Hand Name end inv Shield 3 DefBonus -1 end Mod Wing Name Armor 2 Mass -3 sub Mount Name inv STC ICML-12 end ArcJet 3 end Mod Wing Name Armor 2 Mass -3 sub Mount Name inv STC ICML-12 end ArcJet 3 end Mod Leg Name Armor 2 Mass -2 sub Mount Name Flight 2 end Mod Leg Name Armor 2 Mass -2 sub Mount Name Flight 2 end end GearHead/Design/Wasp.txt0000644000175000017500000000170110563355314014044 0ustar kaolkaolOrnithoid 4 Name Desig SDL_Sprite Mod Head Size 3 Armor 3 sub CPit Sensor 7 Mount Name inv BeamGun 1 Name Range 3 BV 4 Speed 4 end end Mod Body Armor 3 sub Mount Name inv MLauncher 2 Name Type Range 9 Acc -1 Magazine 24 sub Rockets 2 end end Mount Name inv MLauncher 2 Name Type Range 9 Acc -1 Magazine 24 sub Rockets 2 end end Flight 4 end Mod Wing Name Armor 2 sub Flight 4 end Mod Wing Name Armor 2 sub Flight 4 end Mod Tail Size 3 Armor 2 sub BeamGun 7 Name Acc 1 Range 6 Speed 3 Melee 4 Name Flight 1 end end GearHead/Design/Radcliff.txt0000644000175000017500000000251110146505060014634 0ustar kaolkaolBattroid 6 Name Desig SDL_Sprite desc Mod Head Size 5 Armor 4 Mass -1 sub CPit Armor 2 Sensor 6 ECM 5 end Mod Body Armor 6 sub TarComp 4 Gyro 3 STC LAS-5 STC LAS-5 end Mod Arm Name Size 5 Armor 6 sub STC PHS-8 MLauncher 10 Name Type Range 10 Acc 2 Magazine 1 sub Rockets 10 end end inv ArmArmor 3 Mass -2 end Mod Arm Name Size 5 Armor 6 sub STC PHS-8 MLauncher 10 Name Type Range 10 Acc 2 Magazine 1 sub Rockets 10 end end inv ArmArmor 3 Mass -2 end Mod Leg Name Armor 6 sub Mount Name inv STC LRL-32 end end Mod Leg Name Armor 6 sub Mount Name inv STC LRL-32 end end Mod Storage Name Armor 5 sub MLauncher 5 Name Type Range 6 Magazine 24 sub Rockets 5 end end Mod Storage Name Armor 5 sub MLauncher 5 Name Type Range 6 Magazine 24 sub Rockets 5 end end end GearHead/Design/Chimentero.txt0000644000175000017500000000546610146502220015226 0ustar kaolkaolBattroid 7 Name Desig desc Mod Storage Armor 6 Mass -1 Name sub HoverJet 13 Mount Name inv BeamGun 8 Name Acc -1 Range 7 BV 5 Speed 1 Mass -4 end end inv StorageArmor 3 Mass -5 sub MLauncher 20 Name Type Magazine 2 sub Rockets 20 end end end Mod Storage Armor 6 Mass -1 Name sub HoverJet 13 Mount Name inv BeamGun 8 Name Acc -1 Range 7 BV 5 Speed 1 Mass -4 end end inv StorageArmor 3 Mass -5 sub MLauncher 20 Name Type Magazine 2 sub Rockets 20 end end end Mod Body Armor 7 Mass -4 sub CPit Armor 2 Mass -1 Sensor 9 TarComp 6 Gyro 5 Armor 2 Mass -1 Engine 7 Armor 2 Mass -1 BeamGun 15 Name Range 14 Acc 1 Speed 1 MLauncher 12 Name Range 5 Magazine 12 sub Rockets 12 Type end Mount Name inv MLauncher 3 Name Type Range 6 Acc -1 Magazine 60 sub Rockets 3 end end end Mod Arm Size 5 Armor 7 Mass -5 Name sub Hand Mount Name inv Gun 22 Name Type Acc -2 BV 4 Range 5 Speed 1 Magazine 50 Mass -7 sub Ammo 22 Mass -3 end end MLauncher 20 Name Type Magazine 2 sub Rockets 20 end end Mod Arm Size 5 Armor 7 Mass -5 Name sub Hand Mount Name inv Gun 22 Name Type Acc -2 BV 4 Range 5 Speed 1 Magazine 50 Mass -7 sub Ammo 22 Mass -3 end end MLauncher 20 Name Type Magazine 2 sub Rockets 20 end end Mod Leg Size 8 Armor 7 Mass -7 Name sub HoverJet 6 MLauncher 20 Name Type Magazine 3 sub Rockets 20 end end Mod Leg Size 8 Armor 7 Mass -7 Name sub HoverJet 6 MLauncher 20 Name Type Magazine 3 sub Rockets 20 end end Mod Tail Size 3 Armor 5 Mass -3 sub Melee 10 Name Speed 3 Acc 2 end end GearHead/Design/PC_Equipment.txt0000644000175000017500000012745110334134102015460 0ustar kaolkaol% GearHead PC Scale Equipment % ************************ % *** MELEE WEAPONS *** % ************************ Melee 2 Name Type desc Acc 1 Speed 5 Melee 3 Name Type desc Acc 1 Speed 5 Mass -1 Melee 3 Name Type desc Acc 1 Speed 4 Mass -2 Melee 5 Name desc Acc 1 Speed 4 Mass -2 Melee 6 Name desc Type Speed 3 Melee 5 Name desc Mass 2 Speed 1 Melee 10 Name desc Mass -2 Melee 4 Name desc Speed 3 Mass 2 Melee 8 Name desc Acc 2 Speed 4 Mass -5 Melee 7 Name desc Acc 1 Speed 4 Mass -4 Melee 5 Name desc Acc 3 Speed 5 Mass -3 Melee 3 Name desc Mass 2 Acc -2 Speed 3 Melee 7 Name desc Melee 10 Name Type Mass -3 desc Melee 9 Name Type Acc 1 Mass -3 desc Melee 2 Name Type Mass -1 Speed 1 desc Melee 6 Name Type Mass -5 Speed 1 desc Melee 15 Name Type Mass -7 desc Melee 17 Name Type Mass -9 Acc -1 desc Melee 19 Name Type Mass -6 Acc -1 desc Melee 14 Name Type Mass -10 Acc 1 Speed 4 desc Melee 12 Name Type Mass -7 Acc 2 Speed 3 desc Melee 9 Name Type Acc 2 Speed 4 Mass -6 desc Melee 10 Name Type Acc 1 Speed 6 Mass -8 desc Melee 22 Name Type Mass -15 desc Melee 11 Name Type Speed 3 Mass -3 desc Melee 13 Name Type Speed 3 Mass -7 desc Melee 18 Name Type Speed 3 Acc -1 Mass -9 desc Melee 20 Name Speed 6 Acc -2 Type Mass -14 desc Melee 2 Name Acc -2 Speed 5 Type desc Melee 2 Name Acc -2 Speed 4 Type desc % ******************************** % *** ENERGY MELEE WEAPONS *** % ******************************** EMelee 3 Name Speed 5 desc EMelee 10 Name Mass 4 Acc -2 Speed 3 desc EMelee 15 Name Acc 1 Type Mass 5 desc % **************************** % *** BALLISTIC WEAPONS *** % **************************** Gun 2 Name desc Mass -2 Range 3 Acc 1 Speed 5 BV 2 Magazine 30 sub Ammo 2 Desc end Gun 2 Name desc Range 5 Acc 1 Speed 5 BV 2 Magazine 90 sub Ammo 2 Desc end Gun 16 Name Type desc Range 15 Acc 2 Speed 1 Magazine 8 sub Ammo 16 Desc end Gun 6 Name desc Mass -2 Range 7 Acc -1 Speed 4 BV 3 Magazine 40 sub Ammo 6 Name Desc end Gun 6 Name desc Mass -3 Range 7 Speed 5 Magazine 40 sub Ammo 6 Name Desc end Ammo 6 Name desc AmmoCount 40 Type Ammo 6 Name desc AmmoCount 40 Type Ammo 6 Name desc AmmoCount 40 Type Ammo 6 Name desc AmmoCount 40 Type Ammo 6 Name desc AmmoCount 40 Type Gun 10 Name desc Range 8 Mass -4 Speed 4 Magazine 25 sub Ammo 10 desc end Ammo 10 Name desc Type AmmoCount 25 Ammo 10 Name desc Type AmmoCount 25 Ammo 10 Name desc Type AmmoCount 25 Gun 17 Name desc Type Mass -9 Range 10 Acc 2 Speed 5 BV 7 Magazine 80 sub Ammo 17 desc Mass -7 end Ammo 17 Name desc AmmoCount 80 Type Mass -7 Ammo 17 Name desc AmmoCount 80 Mass -10 Ammo 17 Name desc AmmoCount 80 Type Mass -7 Gun 3 Name desc Mass -1 Range 3 Acc 2 Speed 4 Magazine 12 sub Ammo 3 desc end Gun 4 Name desc Mass -3 Range 3 Magazine 6 sub Ammo 4 desc Mass 1 end Gun 5 Name desc Mass -1 Range 10 Acc 1 Speed 3 Magazine 30 sub Ammo 5 desc end Gun 5 Name desc Range 12 Acc 1 Magazine 30 sub Ammo 5 Name desc end Gun 4 Name Type desc Mass -8 Acc 1 Range 8 BV 8 Speed 3 Magazine 450 sub Ammo 4 desc Mass -4 end Ammo 4 Name desc Mass -4 AmmoCount 450 Type Gun 5 Name desc Type Range 4 Mass -4 Speed 6 sub Ammo 5 desc Mass 1 end Ammo 5 Name desc AmmoCount 10 Type Mass 1 Gun 2 Name desc Mass -1 Range 2 Speed 3 Magazine 8 sub Ammo 2 desc Mass 1 end Gun 9 Name desc Mass -7 Range 3 Speed 3 Magazine 10 sub Ammo 9 desc end Gun 12 Name desc Mass -4 Range 5 Acc 1 Speed 3 Magazine 16 sub Ammo 12 desc Type end Gun 12 Name desc Mass -4 Range 5 Acc 1 Speed 5 Magazine 24 sub Ammo 12 Name desc Type end Ammo 12 AmmoCount 16 Name desc Ammo 12 AmmoCount 24 Name desc Ammo 12 AmmoCount 16 Name desc Type Ammo 12 AmmoCount 24 Name desc Type Ammo 12 AmmoCount 16 Name desc Type Ammo 12 AmmoCount 16 Name desc Type Gun 12 Name desc Mass -4 Range 5 Acc 1 BV 1 Magazine 24 sub Ammo 12 desc Type end Gun 15 Name desc Range 8 Magazine 9 sub Ammo 15 desc end Gun 20 Name desc Mass -13 Range 5 Speed 3 Magazine 24 sub Ammo 20 desc Type end Ammo 20 Name desc AmmoCount 24 Type Gun 1 Name desc Type Mass -4 Range 3 Speed 5 BV 4 Magazine 50 sub Ammo 1 Name desc Mass 1 end Gun 1 Name desc Type Mass -7 Range 4 Speed 5 BV 9 Magazine 50 sub Ammo 1 desc Mass 1 end Gun 9 Name desc Mass -8 Acc 1 Range 5 Speed 5 BV 2 Magazine 60 sub Ammo 9 desc Type end Ammo 9 Name desc AmmoCount 60 Type Ammo 9 Name desc AmmoCount 60 Type Ammo 9 Name desc AmmoCount 60 Type Gun 9 Name desc Mass -10 Acc 1 Range 8 Speed 5 BV 4 Magazine 120 sub Ammo 9 desc Type end Gun 9 Name desc Mass -9 Acc 1 Range 10 Speed 5 BV 7 Magazine 120 sub Ammo 9 Name desc Type end Ammo 9 Name desc AmmoCount 120 Type Ammo 9 Name desc AmmoCount 120 Type Ammo 9 Name desc AmmoCount 120 Type % ******************** % *** BEAM GUNS *** % ******************** BeamGun 1 Name desc Mass 1 Range 3 Acc 1 Speed 5 BeamGun 5 Name desc Mass -4 Range 3 Acc 1 Speed 5 BeamGun 7 Name desc Mass -4 Acc 1 Speed 4 BeamGun 10 Name desc Mass -6 Acc 1 Speed 3 BeamGun 15 Name desc Mass -8 Acc 2 Range 5 Speed 3 BeamGun 25 Name desc Mass -5 Acc 1 BeamGun 5 Name desc Type Mass -3 Range 3 Speed 5 BV 4 BeamGun 5 Name desc Type Range 6 Acc 0 Speed 5 BV 4 BeamGun 15 Name desc Type Mass 5 Range 10 Acc 1 BV 8 % *************************** % *** MISSILE LAUNCHERS *** % *************************** MLauncher 22 Name desc Range 32 Acc 2 Magazine 1 sub Rockets 22 Name desc Type end MLauncher 22 Name desc Range 32 Acc 1 Speed 4 Magazine 6 sub Rockets 22 desc Type end MLauncher 14 Name desc Range 24 Acc 1 Speed 4 Magazine 4 sub Rockets 14 desc Type end MLauncher 1 Name desc Type Range 8 Speed 5 Magazine 64 sub Rockets 1 desc end % ************************ % *** WEAPON ADD-ONS *** % ************************ GunAddOn 0 Name desc Range 2 GunAddOn 0 Name desc Acc 1 GunAddOn 0 Name desc Speed 1 GunAddOn 0 Name desc Mass -1 sub Melee 3 Name desc Mass -1 end GunAddOn 0 Name desc sub MLauncher 5 Name desc Range 6 Magazine 1 sub Rockets 5 Name desc Type end end Rockets 5 Name desc AmmoCount 1 Type Rockets 5 Name desc AmmoCount 1 Type GunAddOn 0 Name desc Mass 2 sub MLauncher 4 Name desc Range 6 Magazine 12 Type sub Rockets 4 Desc end end HeavyAddOn 0 Name desc Acc 2 HeavyAddOn 0 Name desc Acc 1 Speed 1 HeavyAddOn 0 Name desc Mass 2 sub MLauncher 4 Name desc Range 6 Magazine 48 Type sub Rockets 4 Desc end end MeleeAddOn 0 Name desc Acc 1 MeleeAddOn 0 Name desc Speed 2 MeleeAddOn 0 Name desc Mass -1 sub Melee 3 Name desc Mass -2 end MeleeAddOn 1 Name desc Type MeleeAddOn 1 Name desc Type MeleeAddOn 1 Name desc Type MeleeAddOn 0 Name desc Type Acc 1 MeleeAddOn 0 Name desc Type Speed 1 MeleeAddOn 2 Name desc Type MeleeAddOn 0 Name desc sub BeamGun 8 Name desc Range 5 Acc -1 Type end % ****************** % *** GRENADES *** % ****************** Grenade 20 Name desc Type Grenade 10 Name desc Type Grenade 20 Name desc Type Grenade 18 Name desc Type Grenade 15 Name desc Type Grenade 12 Name desc Type Grenade 13 Name desc Type Grenade 16 Name desc Type Grenade 6 Name desc Type Mass -1 Grenade 14 Name desc Type Grenade 12 Name desc Type Grenade 18 Name desc Type Grenade 8 Name desc Type Grenade 7 Name desc Type Grenade 5 Name desc GrenadeSkill 3 Mass -1 BV 4 Type Grenade 13 Name desc GrenadeSkill 3 Mass -1 BV 9 Type % *************** % *** ARMOR *** % *************** BodyArmor 1 Name desc Mass 3 BodyArmor 2 Name Fits desc Mass -3 BodyArmor 2 Name desc Mass -3 BodyArmor 2 Name desc Mass 1 BodyArmor 3 Name desc Mass -1 BodyArmor 3 Name desc Mass -3 BodyArmor 2 Name desc Mass -1 BodyArmor 4 Name desc Mass 11 BodyArmor 5 Name desc Mass 9 BodyArmor 5 Name desc Mass -1 BodyArmor 7 Name desc Mass 8 BodyArmor 4 Name desc Mass -6 BodyArmor 6 Name desc Mass 1 BodyArmor 6 Name desc Mass -10 BodyArmor 7 Name desc Mass -5 BodyArmor 2 Name Desc Mass -1 sub Flight 20 end ArmArmor 5 Name desc Mass -5 LegArmor 5 Name desc Mass -5 HeadArmor 1 Name desc Mass -1 HeadArmor 2 Name desc Mass -3 HeadArmor 2 Name desc Mass -3 HeadArmor 3 Name desc Mass -5 sub PCS 1 end HeadArmor 3 Name desc Mass -5 sub PCS 3 Mass -2 end HeadArmor 4 Name desc Mass -5 HeadArmor 4 Name desc Mass -6 HeadArmor 5 Name desc Mass -7 sub PCS 1 Mass -1 end ArmArmor 4 Name desc Mass -7 LegArmor 4 Name desc Mass -7 ArmArmor 4 Name desc Mass -5 LegArmor 4 Name desc Mass -5 ArmArmor 3 Name desc Mass -4 LegArmor 3 Name desc Mass -4 ArmArmor 2 Name desc Mass -1 LegArmor 2 Name desc Mass -1 ArmArmor 1 Name desc Mass -1 LegArmor 1 Name desc Mass -1 ArmArmor 2 Name desc Mass -3 LegArmor 2 Name desc Mass -3 ArmArmor 7 Name desc Mass -10 sub Melee 18 Name desc Acc 1 Speed 4 Mass -8 end ArmArmor 2 Name desc Mass -2 sub MLauncher 7 Name desc Acc -2 Magazine 3 sub Rockets 7 Name Desc Type end end ArmArmor 2 Name desc Mass -2 sub Gun 1 Name desc Type Mass -8 Range 4 BV 9 Magazine 100 sub Ammo 1 Name Desc end end ArmArmor 2 Name desc Mass -1 sub Melee 5 Mass -4 Speed 1 Name desc end LegArmor 2 Name desc Mass -1 sub Melee 5 Mass -4 Speed 1 Name desc end ArmArmor 4 Name desc Mass -5 sub Melee 12 Name desc Speed 1 Mass -10 end LegArmor 4 Name desc Mass -5 sub Melee 12 Name desc Speed 1 Mass -10 end ArmArmor 1 Name desc Mass -1 sub PCS 1 end HeadArmor 6 Name desc Mass -8 sub PCS 1 end BodyArmor 7 Mass -9 Name desc ArmArmor 6 Name desc Mass -8 sub Gun 6 Name desc Mass -4 Range 5 Acc -1 Speed 1 BV 4 Type Magazine 40 sub Ammo 6 Name Desc end end LegArmor 6 Name desc Mass -8 sub MLauncher 5 Name desc Mass -3 Acc -1 Range 7 Magazine 6 sub Rockets 5 Desc Type end end HeadArmor 7 Name desc Mass -12 sub PCS 3 end BodyArmor 8 Name desc Mass -7 ArmArmor 7 Name desc Mass -9 LegArmor 7 Name desc Mass -9 % ***************** % *** SHIELDS *** % ***************** Shield 3 Name desc Shield 3 Name desc DefBonus -3 Shield 4 Name desc DefBonus -2 Shield 6 Name desc Shield 5 Name desc DefBonus 2 Shield 4 Name desc DefBonus -1 sub Melee 8 Mass -7 Name desc end Shield 5 Name desc sub Gun 6 Name desc Mass -4 Range 4 Acc 1 Speed 1 BV 1 Magazine 40 sub Ammo 6 Name Desc end end % ********************* % *** ELECTRONICS *** % ********************* PCS 2 Name desc PCS 3 Name desc Mass -2 PCS 3 Name desc PCS 5 Name desc Mass -4 PCS 5 Name desc % ***************************** % *** MUSICAL INSTRUMENTS *** % ***************************** Instrument 2 Name desc UseBonus 0 UseRange 6 Instrument 3 Name desc UseBonus 1 UseRange 7 Instrument 4 Name desc Mass -1 UseBonus 2 UseRange 8 Instrument 2 Name desc UseBonus 3 UseRange 5 Instrument 5 Name desc Mass -1 UseBonus 0 UseRange 6 Instrument 2 Name desc UseBonus 2 UseRange 7 Instrument 3 Name desc UseBonus 1 UseRange 7 Instrument 3 Name desc UseBonus 0 UseRange 10 % ********************* % *** REPAIR FUEL *** % ********************* FirstAidFuel 30 Name desc Mass 1 FirstAidFuel 60 Name desc Mass 1 FirstAidFuel 90 Name desc Mass 1 FirstAidFuel 120 Name desc Mass 1 FirstAidFuel 300 Name desc Mass 2 GenRepairFuel 10 Name desc Mass 1 GenRepairFuel 50 Name desc Mass 1 GenRepairFuel 75 Name desc Mass 1 GenRepairFuel 100 Name desc Mass 1 GenRepairFuel 170 Name desc Mass 1 GenRepairFuel 750 Name desc Mass 3 MechaRepairFuel 100 Name desc Mass 2 MechaRepairFuel 125 Name desc Mass 1 MechaRepairFuel 50 Name desc Mass 1 MechaRepairFuel 500 Name desc Mass 3 MechaRepairFuel 1500 Name desc Mass 4 MechaRepairFuel 3000 Name desc Mass 5 MediceneFuel 50 Name desc Mass 1 MediceneFuel 150 Name desc Mass 2 BiotechFuel 500 Name desc Mass 1 % ********************* % *** CONSUMABLES *** % ********************* Food 50 Name FoodMorale -2 Mass -3 desc Food 50 Name Mass -3 desc Food 50 Name Mass -3 FoodMorale 1 desc Food 50 Name desc Food 40 Name Mass -6 desc Food 40 Name Mass -3 FoodMorale -2 desc Food 20 Name Mass -2 FoodMorale -1 desc Food 20 Name Mass -2 FoodMorale 1 desc Food 25 Mass -2 Name desc Food 25 Mass -2 Name desc Food 15 Name Mass -2 FoodMorale -3 FoodQuantity 3 desc Food 5 Name FoodMorale 2 desc Food 60 Name Mass -11 FoodMorale -5 FoodXValue 30 desc Food 35 Name FoodMorale -1 Mass -70 FoodQuantity 10 desc Food 0 Name FoodQuantity 10 % Healing (2), restore Step3 damage using skill 20 (First Aid) % Effect strings are not user-friendly... read effects.pp for % all the information you can possibly get. I should write some % better docs (or a better encoding) someday. Effect <2 3 20 0> FoodXValue 2000 desc Food 0 Name FoodQuantity 5 % Healing (2), restore Step3 damage using skill 20 (First Aid) Effect <2 3 20 0> FoodXValue 2000 desc Food 0 Name FoodQuantity 10 % Status Effect (1), Duration Step6, Regen(3), Skill25 but can't % resist anyway Effect <1 6 3 25> FoodXValue 3500 desc Food 0 Name FoodQuantity 5 % Status Effect (1), Duration Step6, Regen(3), Skill25 but can't % resist anyway Effect <1 6 3 25> FoodXValue 3500 desc Food 5 Name % Status Effect (1), Duration Step3, Stoned(4), Skill7 to resist Effect <1 3 4 7 CanResist> FoodXValue 10 FoodMorale 3 desc % ******************* % *** CYBERWARE *** % ******************* StatModifier 50 Name desc <(SKELETON) A structurally-strengthened skeleton.> CyberSlot Type Body 7 Speed -1 Mass 25 StatModifier 45 Name desc <(SKELETON) Does away with the weight caused by organically dense bones.> CyberSlot Type Body -1 Speed 4 Reflexes 2 Mass 14 SkillModifier 40 Name desc <(SKELETON) A skeleton suited to heavy lifting applications.> CyberSlot Type SkillModWeightLifting SkillModAmount 8 Mass 25 StatModifier 45 Name desc <(SPINE) Does away with the fragile nature of a human's organic spine.> CyberSlot Type Body 4 Ego 4 Speed -1 Mass 16 StatModifier 45 Name desc <(SPINE) Replaces many of the spinal nerves with fiber-optic data transmission wires.> CyberSlot Type Speed 3 Craft 2 Reflexes 1 Knowledge 2 Body -1 Mass 10 StatModifier 60 Name desc <(BRAIN) Takes advantage of certain predator instincts found in animals of prey.> CyberSlot Type Body 2 Reflexes 5 Speed 4 Perception 3 Ego 2 Knowledge -3 Charm -1 Mass 15 StatModifier 35 Name desc <(MUSCULATURE) Replaces conventional muscles with a technologically-improved biomaterial.> CyberSlot Type Body 4 Mass 20 StatModifier 40 Name desc <(MUSCULATURE) Muscles tuned for quick reactions.> CyberSlot Type Reflexes 2 Speed 2 Mass 20 StatModifier 20 Name desc <(EYES) These eyes include resolution enhancers.> CyberSlot Type Reflexes 2 Perception 3 Charm -1 Mass 1 StatModifier 20 Name desc <(EYES) A pair of rather charming eyes.> CyberSlot Type Perception 1 Charm 1 Mass 1 SkillModifier 25 Name desc <(EYES) Provides highlighting of personal-scale targets.> CyberSlot Type SkillModSmallArms SkillModAmount 4 Mass 1 SkillModifier 25 Name desc <(EYES) These eyes highlight potential heavy weapon targets.> CyberSlot Type SkillModHeavyWeapons SkillModAmount 3 Mass 1 StatModifier 15 Name desc <(EARS) Improves the perception of sound.> CyberSlot Type Perception 1 Mass 1 SkillModifier 20 Name desc <(EARS) Ears used by some performance judges to dissect and analyse music.> CyberSlot Type SkillModPerformance SkillModAmount 3 Mass 1 StatModifier 15 Name desc <(HEART) A heavy-duty replacement for a conventional organic heart.> CyberSlot Type Body 2 Mass 2 SkillModifier 5 Name desc <() Increases the body's acceptance of cybernetic components.> Type SkillModCybertech SkillModAmount 3 Mass 1 SkillModifier 30 Name desc <(BRAINSTEM) Interacts with a piloted mecha and provides neural feedback to the pilot.> CyberSlot Type SkillModMechaPiloting SkillModAmount 3 Mass 1 StatModifier 10 Name desc <(BRAIN) Provides direct links between some parts of the brain.> CyberSlot Type Knowledge 1 Mass 1 StatModifier 20 Name desc <(BRAIN) Removes some of the processing burden from the human brain.> CyberSlot Type Knowledge 2 Mass 1 StatModifier 35 Name desc <(BRAIN) Tunes the mind to detect tiny inputs that would otherwise go unnoticed.> CyberSlot Type Perception 5 Mass 2 StatModifier 40 Name desc <(BRAIN) Works with the existing synapses of the brain to greatly boost data storage and retrieval capabilities.> CyberSlot Type Knowledge 5 Mass 1 GearHead/Design/Alba.txt0000644000175000017500000000252610146501544013772 0ustar kaolkaolBattroid 3 Name Desig Desc Mod Head Size 2 Armor 2 sub Sensor 10 TarComp 2 end Mod Body Armor 3 sub CPit Mount inv Gun 2 Name Range 5 Acc 1 Speed 1 BV 2 Magazine 90 sub Ammo 2 end end Mount inv Gun 2 Name Range 5 Acc 1 Speed 1 BV 2 Magazine 90 sub Ammo 2 end end Sensor 2 HoverJet 2 Gyro 3 end Mod Arm Name Armor 2 sub Hand inv Gun 3 Name Mass -1 Range 3 Speed 3 Magazine 12 sub Ammo 3 end end Mount inv MLauncher 13 Name Range 8 Magazine 4 sub Rockets 13 end end HoverJet 1 end Mod Arm Name Armor 2 sub Hand inv EMelee 8 Name Type Acc 2 Speed 5 end Mount inv MLauncher 13 Name Range 8 Magazine 4 sub Rockets 13 end end HoverJet 1 end Mod Leg Name Size 4 Armor 2 sub HoverJet 4 end Mod Leg Name Size 4 Armor 2 sub HoverJet 4 end end GearHead/Design/DoomBuggy.txt0000644000175000017500000000077610116072630015030 0ustar kaolkaolGroundHugger 5 Name Desig SDL_Sprite Scale 1 Mod Turret Armor 3 sub Gun 1 Name Speed 3 BV 4 Magazine 50 sub Ammo 1 end Mount inv Gun 16 Name Speed 3 Magazine 50 sub Ammo 16 end end end Mod Body Armor 2 sub CPit Armor 1 Sensor 2 MLauncher 3 Name Speed 1 Magazine 16 sub Rockets 3 end Wheels 6 end end GearHead/Design/Jos.txt0000644000175000017500000000333410563355240013667 0ustar kaolkaolBattroid 5 Name Desig SDL_Sprite desc Mod Head Size 2 Armor 4 Mass -4 sub Sensor 5 end inv HeadArmor 2 Name Mass -4 end Mod Body Armor 5 Mass -3 sub CPit Sensor 1 TarComp 1 Gyro 2 EMelee 6 Name Acc 2 Speed 1 Type EMelee 6 Name Acc 2 Speed 1 Type end inv BodyArmor 4 Name Mass -6 sub STC VC-5 Name Range 5 end end Mod Arm Name Size 4 Armor 5 Mass -1 sub Hand inv Melee 10 Name Type Acc 2 Speed 3 end ArcJet 4 end inv ArmArmor 4 Name Mass -6 end Mod Arm Name Size 4 Armor 5 Mass -1 sub Hand ArcJet 4 end inv ArmArmor 4 Name Mass -6 Shield 5 Name DefBonus 1 end Mod Leg Name Size 6 Armor 5 Mass -5 sub Mount inv MLauncher 2 Name Type Range 4 Magazine 36 sub Rockets 2 end end ArcJet 5 end inv LegArmor 3 Name Mass -3 end Mod Leg Name Size 6 Armor 5 Mass -5 sub Mount inv MLauncher 2 Name Type Range 4 Magazine 36 sub Rockets 2 end end ArcJet 5 end inv LegArmor 3 Name Mass -3 end end GearHead/Design/Chameleon.txt0000644000175000017500000000575010231364140015022 0ustar kaolkaolBattroid 3 Name Desig desc Mod Head Size 2 Armor 2 sub Sensor 6 TarComp 2 end Mod Body Armor 2 sub CPit Armor 1 Gyro 3 Armor 1 BeamGun 2 Name Range 3 Acc 5 BeamGun 2 Name Range 3 Acc 5 end Mod Arm Name Size 4 Armor 2 sub STC GHML-2 Hand inv BeamGun 1 Name Range 4 Acc 1 Speed 6 BV 2 end end Mod Arm Name Size 4 Armor 2 sub MLauncher 1 Name Range 5 Acc 2 Magazine 30 sub Rockets 1 end Hand end inv Shield 3 DefBonus 2 end Mod Leg Name Size 4 Armor 2 sub Wheels 3 end Mod Leg Name Size 4 Armor 2 sub Wheels 3 end end Battroid 3 Name Desig desc Mod Head Size 2 Armor 2 sub Sensor 6 TarComp 2 end Mod Body Armor 2 sub CPit Armor 1 Gyro 3 Armor 1 BeamGun 2 Name Range 3 Acc 5 BeamGun 2 Name Range 3 Acc 5 end Mod Arm Name Size 4 Armor 2 sub STC GHML-2 Hand inv STC GR-12 Acc 2 end end Mod Arm Name Size 4 Armor 2 sub MLauncher 1 Name Range 5 Acc 2 Magazine 30 sub Rockets 1 end Hand end Mod Leg Name Size 4 Armor 2 sub Wheels 3 end Mod Leg Name Size 4 Armor 2 sub Wheels 3 end end Battroid 3 Name Desig desc Mod Head Size 2 Armor 2 sub Sensor 6 TarComp 3 end Mod Body Armor 2 sub CPit Armor 2 Gyro 4 Armor 1 BeamGun 2 Name Range 3 Acc 5 BeamGun 2 Name Range 3 Acc 5 end Mod Arm Name Size 4 Armor 2 sub MLauncher 8 Name Range 6 Magazine 5 sub Rockets 8 Type end Hand inv BeamGun 3 Name Acc 1 BV 3 end end Mod Arm Name Size 4 Armor 2 sub MLauncher 1 Name Range 5 Acc 2 Magazine 30 sub Rockets 1 end Hand inv Melee 4 Name Acc 2 end end inv Shield 4 DefBonus 3 end Mod Leg Name Size 4 Armor 2 sub Wheels 3 end Mod Leg Name Size 4 Armor 2 sub Wheels 3 end end GearHead/Design/Corsair.txt0000644000175000017500000000136610146502504014533 0ustar kaolkaolBattroid 4 Name Desig SDL_Sprite desc <> Mod Head Armor 4 sub CPit Sensor 5 end Mod Body Armor 4 sub Mount inv MLauncher 5 Name Range 7 Speed 1 Magazine 12 sub Rockets 5 Type end end end Mod Arm Name Armor 4 sub Hand inv STC LAS-10 end end inv Shield 2 Name DefBonus -4 end Mod Arm Name Armor 4 sub Hand end inv Shield 2 Name DefBonus -4 end Mod Leg Name Size 5 Armor 4 sub Wheels 5 end Mod Leg Name Size 5 Armor 4 sub Wheels 5 end end GearHead/Design/Gigas.txt0000644000175000017500000000144610146504404014163 0ustar kaolkaolAeroFighter 7 Name Desig SDL_Sprite desc Mod Body Armor 7 Mass -9 sub CPit Armor 2 Sensor 6 TarComp 2 Mount Name inv STC SWML-60 end STC LAS-5 Flight 8 end Mod Wing Name Size 8 Armor 7 Mass -10 sub Mount Name inv STC NUKE-1 end Flight 7 end Mod Wing Name Size 8 Armor 7 Mass -10 sub Mount Name inv STC NUKE-1 end Flight 7 end Mod Storage Name Size 5 Armor 6 Mass -3 sub STC PAR-6 Flight 2 end Mod Storage Name Size 5 Armor 6 Mass -3 sub STC PAR-6 Flight 2 end end GearHead/Design/Domino.txt0000644000175000017500000000155310116072630014353 0ustar kaolkaolArachnoid 3 Name Desig Mod Head Size 1 Armor 2 sub Sensor 6 end Mod Body Armor 3 sub CPit Armor 2 Gun 1 Name Type Range 2 Acc -2 BV 5 Magazine 60 sub Ammo 1 end Sensor 1 TarComp 2 end Mod Turret Name Size 2 Armor 3 sub STC PAR-2 Mount Name end Mod Turret Name Size 2 Armor 3 sub STC PAR-2 Mount Name end Mod Leg Name Size 2 Armor 3 Mod Leg Name Size 2 Armor 3 Mod Leg Name Size 2 Armor 3 Mod Leg Name Size 2 Armor 3 SkillModifier 40 Name Type CyberSlot SkillModStealth SkillModAmount 3 end GearHead/Design/Ovaknight.txt0000644000175000017500000000373210205742000015053 0ustar kaolkaolBattroid 7 Name Desig sdl_sprite Desc Mod Head Size 5 Armor 7 Mass -4 sub CPit Armor 2 Sensor 5 TarComp 3 ECM 4 end inv HeadArmor 5 Mass -2 end Mod Body Armor 7 Mass -8 sub Gyro 3 Engine 7 Armor 2 Mass -2 HighOutput BeamGun 15 Name Type Acc 1 Speed 1 Mount Name inv STC VC-5 end Mount Name inv STC VC-5 end STC LAS-5 Name Type end inv BodyArmor 8 Mass -12 end Mod Arm Name Armor 6 Mass -2 sub Hand end inv ArmArmor 5 Mass -8 sub Gun 5 Name Type Range 7 Acc -1 BV 3 Speed 3 Magazine 60 Mass -5 sub Ammo 5 Type end end end Mod Arm Name Armor 6 Mass -2 sub Hand end inv ArmArmor 5 Mass -8 sub Gun 5 Name Type Range 7 Acc -1 BV 3 Speed 3 Magazine 60 Mass -5 sub Ammo 5 Type end end end Mod Leg Name Size 2 Armor 3 Mass -2 inv LegArmor 3 Mass -5 end Mod Leg Name Size 2 Armor 3 Mass -2 inv LegArmor 3 Mass -5 end Mod Leg Name Size 3 Armor 3 Mass -3 inv LegArmor 3 Mass -5 end Mod Leg Name Size 3 Armor 3 Mass -3 inv LegArmor 3 Mass -5 end Mod Leg Name Size 2 Armor 3 Mass -2 inv LegArmor 3 Mass -5 end Mod Leg Name Size 2 Armor 3 Mass -2 inv LegArmor 3 Mass -5 end end GearHead/Design/Hariseng.txt0000644000175000017500000000177110116072630014670 0ustar kaolkaolBattroid 6 Name Desig SDL_Sprite Mod Head Size 4 Armor 3 Mass -2 sub Sensor 4 TarComp 2 end inv HeadArmor 3 Mass -5 end Mod Body Armor 6 Mass -2 sub CPit Armor 2 Gun 8 Mass -2 Name Type Range 4 Acc -1 Magazine 10 sub Ammo 8 end end inv BodyArmor 6 Mass -10 end Mod Arm Name Size 4 Armor 5 Mass -2 sub Hand inv Melee 16 Name Speed 1 Type end STC MAC-4 end inv ArmArmor 4 Mass -7 sub STC GHML-3 end end Mod Arm Name Size 4 Armor 5 Mass -2 sub Hand STC MAC-4 end inv EShield 5 Name DefBonus -1 ArmArmor 4 Mass -7 sub STC GHML-3 end end Mod Leg Name Armor 5 inv LegArmor 4 Mass -6 end Mod Leg Name Armor 5 inv LegArmor 4 Mass -6 end end GearHead/Design/Luna2.txt0000644000175000017500000000160710146506474014122 0ustar kaolkaolBattroid 3 Name Desig desc Mod Head Size 2 Armor 3 sub Sensor 9 TarComp 2 end Mod Body Armor 3 sub CPit Sensor 5 HoverJet 4 end Mod Arm Name Size 4 Armor 3 sub MLauncher 10 Name Range 10 Acc 1 Magazine 3 sub Rockets 10 end Hand inv BeamGun 7 Name Range 8 Acc 3 end end Mod Arm Name Size 4 Armor 3 sub MLauncher 10 Name Range 10 Acc 1 Magazine 3 sub Rockets 10 end Hand inv EMelee 8 Name Acc 2 Speed 5 end end Mod Leg Name Size 4 Armor 3 sub HoverJet 4 end Mod Leg Name Size 4 Armor 3 sub HoverJet 4 end end GearHead/Design/Queztal.txt0000644000175000017500000000164410116072630014554 0ustar kaolkaolHoverFighter 5 Name Desig SDL_Sprite Mod Turret Name Size 6 Armor 5 Mass -4 sub STC SWML-60 end Mod Turret Name Size 2 Armor 5 Mass -3 sub BeamGun 4 Name Range 8 BV 3 Speed 4 Acc 1 Mount Name inv STC HWML-4 end end inv TurretArmor 4 Mass -6 end Mod Body Armor 5 Mass -4 sub CPit Sensor 7 TarComp 1 Gyro 2 ArcJet 9 end inv BodyArmor 4 Mass -6 Fits sub ArcJet 4 end end Mod Wing Name Size 4 Armor 4 Mass -2 sub ArcJet 3 Mount Name inv STC HRP-6 end end Mod Wing Name Size 4 Armor 4 Mass -2 sub ArcJet 3 Mount Name inv STC HRP-6 end end end GearHead/Design/Gobuksan.txt0000644000175000017500000000151510116072630014675 0ustar kaolkaolGroundHugger 5 Name Desig Mod Body Armor 5 Mass -9 sub CPit Armor 2 Mass -2 Sensor 6 Gyro 2 Armor 2 Mass -2 Engine 2 Armor 2 Mass -2 Mount Name inv STC LAS-10 Mass -2 end Mount Name inv STC LAS-10 Mass -2 end Tracks 8 Mass -8 end inv BodyArmor 5 Fits Mass -4 sub STC HWML-8 end end Mod Turret Armor 5 Mass -5 sub STC GR-24 Name Type end inv TurretArmor 5 Mass -4 sub STC SML-5 end end Mod Storage Size 4 Armor 5 Mass -3 sub Sensor 2 TarComp 1 STC LRL-32 STC AC-2 Type end inv StorageArmor 5 Mass -5 end end GearHead/Design/Strongarm.txt0000644000175000017500000000114310116072630015075 0ustar kaolkaolBattroid 2 Name Desig SDL_Sprite Scale 1 Mod Head Size 1 Armor 2 Mass 3 sub Sensor 2 end Mod Body Armor 2 Mass 3 sub CPit Armor 1 Mount end Mod Arm Name Armor 2 Mass 3 sub Hand Gun 8 Name Acc 1 Speed 3 Magazine 36 sub Ammo 8 end end Mod Arm Name Armor 2 Mass 3 sub Hand inv Melee 7 Name Speed 1 end end Mod Leg Name Armor 2 Mass 3 Mod Leg Name Armor 2 Mass 3 end GearHead/Design/Esher.txt0000644000175000017500000000117310146504120014167 0ustar kaolkaolArachnoid 7 Name Desig desc Mod Turret Armor 6 sub STC PAR-13 Sensor 1 end Mod Body Armor 6 sub CPit Armor 2 Sensor 4 TarComp 2 Mount Name inv STC LRL-48 end Mount Name inv STC LRL-48 end end Mod Leg Name Size 4 Armor 4 Mod Leg Name Size 4 Armor 4 Mod Leg Name Size 4 Armor 4 Mod Leg Name Size 4 Armor 4 end GearHead/Design/Zerosaiko.txt0000644000175000017500000000266010563355306015106 0ustar kaolkaolBattroid 5 Name Desig SDL_Sprite desc Mod Head Size 4 Armor 5 sub Sensor 5 TarComp 3 end inv HeadArmor 2 Mass -1 Fits end Mod Body Armor 5 sub CPit Armor 2 Gyro 4 Armor 1 STC LRL-24 ArcJet 3 Mount Name inv STC LAS-5 Name Type Speed 1 end Mount Name inv STC LAS-5 Name Type Speed 1 end end inv BodyArmor 4 Mass -2 Fits sub ArcJet 4 end end Mod Arm Name Armor 5 sub Hand inv Gun 6 Name Range 5 Magazine 20 sub Ammo 6 end end Mount Name end inv Shield 2 DefBonus -4 end Mod Arm Name Armor 5 sub Hand inv EMelee 9 Speed 3 Name end Mount Name end inv Shield 2 DefBonus -4 end Mod Leg Name Armor 5 sub ArcJet 5 end inv LegArmor 2 Fits Mass -2 sub ArcJet 2 end end Mod Leg Name Armor 5 sub ArcJet 5 end inv LegArmor 2 Fits Mass -2 sub ArcJet 2 end end end GearHead/Design/Vespa.txt0000644000175000017500000000077710146506304014216 0ustar kaolkaolGroundHugger 1 Name Desig Scale 1 SDL_Sprite desc Mod Body Armor 1 sub CPit Armor 1 Sensor 2 Wheels 2 end inv BodyArmor 4 Name Fits Mass -5 sub Gun 4 Name Mass -2 Range 3 Magazine 24 sub Ammo 4 end end end end GearHead/Design/Rover.txt0000644000175000017500000000147310563355372014241 0ustar kaolkaolGroundCar 8 Name Desig SDL_Sprite Scale 1 Mod Turret Size 5 Armor 7 sub Gun 4 Name Range 6 Magazine 20 sub Ammo 4 end Mount Name inv MLauncher 7 Name Range 8 Magazine 10 sub Rockets 7 end end end Mod Body Armor 8 sub CPit Armor 2 Sensor 9 Gyro 3 Wheels 10 Mount Name inv Gun 3 Name Range 4 Acc 1 Speed 3 BV 4 Magazine 250 sub Ammo 3 end end Mount Name inv Gun 3 Name Range 4 Acc 1 Speed 3 BV 4 Magazine 250 sub Ammo 3 end end end end GearHead/Design/Osprey.txt0000644000175000017500000000047310116072630014407 0ustar kaolkaolGroundCar 4 Name Desig SDL_Sprite Mod Body Armor 4 sub Wheels 5 Sensor 6 CPit Mount Name inv STC AC-2 end end Mod Turret Size 5 Armor 4 sub STC SWML-40 Mount Name end end GearHead/Design/IceWind.txt0000644000175000017500000001053610231364140014447 0ustar kaolkaolBattroid 3 Name Desig Mod Head Size 1 Armor 3 sub Sensor 5 end Mod Body Armor 3 sub CPit BeamGun 5 Name Acc 1 BeamGun 5 Name Acc 1 HoverJet 3 end inv BodyArmor 2 Fits end Mod Arm Name Armor 3 sub Hand inv Gun 1 Name BV 5 Magazine 120 Acc -1 Range 7 sub Ammo 1 end end Mount Name end Mod Arm Name Armor 3 sub Hand Mount Name end Mod Leg Name Size 4 Armor 3 sub HoverJet 3 Mount Name end inv LegArmor 2 Fits end Mod Leg Name Size 4 Armor 3 sub HoverJet 3 Mount Name end inv LegArmor 2 Fits end end Battroid 3 Name Desig Mod Head Size 1 Armor 3 sub Sensor 5 end Mod Body Armor 3 sub CPit BeamGun 5 Name Acc 1 BeamGun 5 Name Acc 1 HoverJet 3 end inv BodyArmor 2 Fits end Mod Arm Name Armor 3 sub Hand inv EMelee 5 Name Acc 1 end Mount Name inv Gun 1 Name Acc -1 Range 3 BV 5 Magazine 60 sub Ammo 1 end end end Mod Arm Name Armor 3 sub Hand Mount Name end inv EShield 3 DefBonus 1 end Mod Leg Name Size 4 Armor 3 sub HoverJet 3 Mount Name end inv LegArmor 2 Fits end Mod Leg Name Size 4 Armor 3 sub HoverJet 3 Mount Name end inv LegArmor 2 Fits end end Battroid 3 Name Desig Mod Head Size 1 Armor 3 sub Sensor 5 end Mod Body Armor 3 sub CPit BeamGun 5 Name Acc 1 BeamGun 5 Name Acc 1 HoverJet 3 end inv BodyArmor 2 Fits end Mod Arm Name Armor 3 sub Hand inv Gun 8 Name Magazine 30 Acc 1 Range 5 Speed 3 sub Ammo 8 end end Mount Name inv STC SWML-40 end end Mod Arm Name Armor 3 sub Hand Mount Name inv STC SWML-40 end end Mod Leg Name Size 4 Armor 3 sub HoverJet 3 Mount Name inv STC SWML-40 end end Mod Leg Name Size 4 Armor 3 sub HoverJet 3 Mount Name inv STC SWML-40 end end end Battroid 3 Name Desig Mod Head Size 1 Armor 3 sub Sensor 5 end inv HeadArmor 2 Mass -3 Fits end Mod Body Armor 3 sub CPit BeamGun 5 Name Acc 1 BeamGun 5 Name Acc 1 Gyro 2 TarComp 1 ArcJet 2 end inv BodyArmor 4 Mass -5 Fits sub ArcJet 3 end end Mod Arm Name Armor 3 sub Hand inv Gun 1 Name BV 5 Magazine 120 Acc -1 Range 7 sub Ammo 1 end end Mount Name inv STC SWML-40 end ArcJet 1 end inv ArmArmor 2 Mass -2 Fits end Mod Arm Name Armor 3 sub Hand Mount Name inv STC SWML-40 end ArcJet 1 end inv ArmArmor 2 Mass -2 Fits EShield 3 DefBonus 1 end Mod Leg Name Size 4 Armor 3 sub ArcJet 3 Mount Name inv MLauncher 9 Name Acc -1 Magazine 12 sub Rockets 9 end end end inv LegArmor 3 Mass -3 Fits end Mod Leg Name Size 4 Armor 3 sub ArcJet 3 Mount Name inv MLauncher 9 Name Acc -1 Magazine 12 sub Rockets 9 end end end inv LegArmor 3 Mass -3 Fits end end GearHead/Design/Renegade.txt0000644000175000017500000000111410116072630014631 0ustar kaolkaolGroundHugger 4 Name Desig SDL_Sprite Mod Turret Armor 1 sub Gun 2 Name Speed 3 BV 4 Magazine 50 sub Ammo 2 end end Mod Body Armor 1 sub CPit Armor 1 Melee 4 Name Acc 1 Speed 1 Sensor 4 Wheels 6 Gyro 3 Name end Mod Storage Name Size 2 Armor 1 sub BeamGun 4 Name end Mod Storage Name Size 2 Armor 1 sub BeamGun 4 Name end end GearHead/Design/Kojedo.txt0000644000175000017500000000136210563355247014355 0ustar kaolkaolArachnoid 3 Name Desig SDL_Sprite desc Mod Head Armor 2 Mass -2 sub CPit Armor 2 Mass -2 Sensor 6 end Mod Body Armor 2 Mass -2 sub Gyro 2 STC AC-2 STC SWML-20 ECM 2 end Mod Turret Size 2 Armor 2 Mass -2 sub Sensor 1 Mount inv STC GR-12 end end Mod Leg Name Size 3 Armor 2 Mass -4 sub Mount end Mod Leg Name Size 3 Armor 2 Mass -4 sub Mount end Mod Leg Name Size 3 Armor 2 Mass -4 sub Mount end Mod Leg Name Size 3 Armor 2 Mass -4 sub Mount end end GearHead/Design/Monstrous.txt0000644000175000017500000000311510146506760015144 0ustar kaolkaolGroundHugger 10 Name Desig SDL_Sprite desc Mod Turret Name
Armor 10 sub STC PHS-25 end Mod Turret Name Size 5 Armor 10 sub Gun 3 Name Type Range 6 Acc -1 BV 3 Magazine 40 sub Ammo 3 end end Mod Turret Name Size 5 Armor 10 sub Gun 3 Name Type Range 6 Acc -1 BV 3 Magazine 40 sub Ammo 3 end end Mod Body Armor 10 sub CPit Armor 2 STC NUKE-6 HoverJet 5 TarComp 10 Sensor 10 end Mod Storage Name Armor 10 sub MLauncher 2 Name Type Range 10 Magazine 100 sub Rockets 2 end end Mod Storage Name Armor 10 sub MLauncher 2 Name Type Range 10 Magazine 100 sub Rockets 2 end end Mod Storage Size 3 Armor 10 Name sub HoverJet 6 end Mod Storage Size 3 Armor 10 Name sub HoverJet 6 end Mod Storage Size 3 Armor 10 Name sub HoverJet 6 end Mod Storage Size 3 Armor 10 Name sub HoverJet 6 end end GearHead/Design/Claymore.txt0000644000175000017500000000232110563355165014710 0ustar kaolkaolBattroid 6 Name Desig SDL_Sprite Desc Mod Body Armor 6 sub CPit Armor 2 Sensor 4 Gun 2 Name Range 4 Acc -2 Speed 1 BV 7 Magazine 80 sub Ammo 2 end Gun 2 Name Range 4 Acc -2 Speed 1 BV 7 Magazine 80 sub Ammo 2 end end Mod Arm Name Size 4 Armor 5 sub Hand inv Gun 6 Name Range 7 Acc -1 Speed 1 BV 3 Magazine 40 sub Ammo 6 end end end Mod Arm Name Size 4 Armor 5 sub Hand end inv Shield 4 end Mod Leg Name Size 7 Armor 5 sub MLauncher 4 Name Range 7 Speed 1 Magazine 5 sub Rockets 4 Type end end Mod Leg Name Size 7 Armor 5 sub MLauncher 4 Name Range 7 Speed 1 Magazine 5 sub Rockets 4 Type end end end GearHead/Design/Phoenix.txt0000644000175000017500000000265010145760620014544 0ustar kaolkaolBattroid 4 Name Desig Desc <> sdl_sprite Mod Head Armor 4 Mass -2 sub CPit Armor 2 Mass -1 Sensor 6 end inv HeadArmor 2 Mass -1 sub STC SML-5 end end Mod Body Armor 4 Mass -4 sub Gyro 1 Armor 1 Mass -1 Engine 4 Armor 1 Mass -1 Mount Name inv STC HRP-6 end end inv BodyArmor 4 Mass -4 end Mod Storage Armor 4 Mass -2 Name sub Flight 7 Mount Name inv Gun 6 Range 8 Name Magazine 20 Mass -3 sub Ammo 6 Name Type end end end inv StorageArmor 3 Mass -2 end Mod Arm Name Armor 3 Mass -2 sub Hand Name Mount Name inv STC LAS-5 end end inv ArmArmor 3 Mass -3 end Mod Arm Name Armor 3 Mass -2 sub Hand Name Mount Name end inv ArmArmor 3 Mass -3 end Mod Leg Name Size 5 Armor 4 Mass -4 sub Flight 5 end inv LegArmor 4 Mass -5 end Mod Leg Name Size 5 Armor 4 Mass -4 sub Flight 5 end inv LegArmor 4 Mass -5 end end inv Ammo 6 Name AmmoCount 20 Type end GearHead/Design/Swan.txt0000644000175000017500000000157210116072630014037 0ustar kaolkaolOrnithoid 7 Name Desig Scale 1 SDL_Sprite Mod Head Size 5 Armor 5 Mass -10 sub Sensor 6 BeamGun 3 Name Range 4 Acc 1 Speed 3 end Mod Body Armor 5 Mass -12 sub CPit Sensor 2 TarComp 2 Gyro 2 MLauncher 2 Name Acc -1 Range 9 Magazine 28 sub Rockets 2 end end Mod Wing Name Size 8 Armor 5 Mass -13 sub EMelee 4 Name Acc 2 Flight 4 end Mod Wing Name Size 8 Armor 5 Mass -13 sub EMelee 4 Name Acc 2 Flight 4 end Mod Leg Name Size 6 Armor 5 Mass -11 sub Mount Name end Mod Leg Name Size 6 Armor 5 Mass -11 sub Mount Name end end GearHead/Design/Daum.txt0000644000175000017500000000305210156155224014015 0ustar kaolkaolBattroid 5 Name Desig SDL_Sprite desc Mod Head Armor 3 sub Sensor 5 BeamGun 3 Name Scale 1 Range 4 Acc 1 BV 6 end inv HeadArmor 2 Mass -1 end Mod Body Armor 3 sub CPit Armor 2 Gyro 2 TarComp 1 Sensor 1 Mount Name Mount Name inv MLauncher 4 Name Type Magazine 20 sub Rockets 4 end end HoverJet 5 end inv BodyArmor 3 Mass -2 end Mod Arm Name Armor 3 sub Hand inv Gun 2 Name Range 6 Magazine 250 Speed 4 BV 4 Acc -1 sub Ammo 2 end end Mount Name end inv ArmArmor 2 Mass -1 end Mod Arm Name Armor 3 sub Hand inv Melee 7 Name Acc 1 end Mount Name end inv ArmArmor 2 Mass -1 EShield 5 DefBonus -1 end Mod Leg Name Armor 3 sub HoverJet 4 Mount Name end inv LegArmor 2 Mass -1 sub HoverJet 2 end end Mod Leg Name Armor 3 sub HoverJet 4 Mount Name end inv LegArmor 2 Mass -1 sub HoverJet 2 end end end GearHead/Design/Petrach.txt0000644000175000017500000000240010563355347014523 0ustar kaolkaolBattroid 3 Name Desig SDL_Sprite Mod Body Armor 2 Mass 4 sub CPit Armor 1 Sensor 7 Mount inv Gun 1 Name Range 3 Acc -1 BV 5 Magazine 60 sub Ammo 1 end end end Mod Storage Name Size 4 Armor 2 sub STC SWML-40 end Mod Storage Name Size 4 Armor 2 sub STC SWML-40 end Mod Leg Name Armor 2 Mass 4 Mod Leg Name Armor 2 Mass 4 end Battroid 3 Name Desig SDL_Sprite Mod Body Armor 2 Mass 4 sub CPit Armor 1 Sensor 7 Mount inv Gun 1 Name Range 3 Acc -1 BV 5 Magazine 60 sub Ammo 1 end end end Mod Storage Name Size 4 Armor 2 sub MLauncher 20 Name Magazine 4 sub Rockets 20 Type end end Mod Storage Name Size 4 Armor 2 sub MLauncher 20 Name Range 8 Magazine 4 sub Rockets 20 Type end end Mod Leg Name Armor 2 Mass 4 Mod Leg Name Armor 2 Mass 4 end GearHead/Design/Trailblazer.txt0000644000175000017500000000123010146505250015373 0ustar kaolkaolBattroid 2 Name SDL_Sprite Desig desc Mod Head Armor 2 sub Sensor 6 ECM 1 end Mod Body Armor 2 sub CPit Armor 1 Flight 3 end Mod Arm Name Size 1 Armor 2 sub Mount inv STC PAR-2 end Hand end Mod Arm Name Size 1 Armor 2 sub STC HWML-2 Hand inv EMelee 6 Name Speed 1 end end Mod Leg Name Armor 2 sub Flight 2 end Mod Leg Name Armor 2 sub Flight 2 end end GearHead/Design/Excel.txt0000644000175000017500000000130710563355203014171 0ustar kaolkaolBattroid 8 Name Desig SDL_Sprite Mod Body Armor 8 sub CPit Armor 2 STC LAS-10 Range 6 STC LAS-10 Range 6 Sensor 6 Sensor 1 TarComp 5 Gyro 4 ECM 1 end inv BodyArmor 5 end Mod Arm Name Armor 7 sub STC LAS-10 Range 6 end inv Shield 3 Name DefBonus -2 end Mod Arm Name Armor 7 sub Hand BeamGun 1 Name Type Range 4 Acc 1 Speed 6 BV 2 end inv Shield 3 Name DefBonus -2 end Mod Leg Name Armor 8 Mod Leg Name Armor 8 end GearHead/Design/Razer.txt0000644000175000017500000000312710563355337014226 0ustar kaolkaolArachnoid 2 Name Desig SDL_Sprite Mod Head Armor 2 sub CPit Armor 1 Sensor 7 end Mod Body Armor 2 sub Gun 1 Name Acc -1 BV 2 Magazine 30 sub Ammo 1 end Gun 1 Name Acc -1 BV 2 Magazine 30 sub Ammo 1 end end Mod Turret Armor 2 sub BeamGun 3 Name Acc 1 Speed 5 end Mod Leg Name Size 3 Armor 2 Mod Leg Name Size 3 Armor 2 end Arachnoid 2 Name Desig SDL_Sprite Mod Head Armor 2 sub CPit Armor 1 Sensor 7 end Mod Body Armor 2 sub BeamGun 1 Name Range 2 Acc 1 BV 2 BeamGun 1 Name Range 2 Acc 1 BV 2 Sensor 7 end Mod Turret Armor 2 sub BeamGun 3 Name Acc 1 Speed 5 end Mod Leg Name Size 3 Armor 2 Mod Leg Name Size 3 Armor 2 end Arachnoid 2 Name Desig SDL_Sprite Mod Head Armor 2 sub CPit Armor 1 Sensor 7 end Mod Body Armor 2 sub MLauncher 9 Name Speed 1 Magazine 3 sub Rockets 9 end MLauncher 9 Name Speed 1 Magazine 3 sub Rockets 9 end end Mod Turret Armor 2 sub BeamGun 3 Name Acc 1 Speed 5 end Mod Leg Name Size 3 Armor 2 Mod Leg Name Size 3 Armor 2 end GearHead/Design/Savin.txt0000644000175000017500000002072610116072630014211 0ustar kaolkaolBattroid 7 Name Desig SDL_Sprite Desc Mod Head Armor 5 Size 5 Mass -5 sub Sensor 6 STC VC-5 Type Name end inv HeadArmor 5 Mass -5 end Mod Body Armor 7 Mass -7 sub Sensor 1 CPit Armor 2 Mass -1 TarComp 3 Gyro 4 Armor 2 Mass -1 Engine 7 Armor 2 Mass -1 STC LAS-5 STC LAS-5 ArcJet 8 end inv BodyArmor 8 Mass -9 sub STC HWML-4 STC HWML-4 end end Mod Arm Name Size 6 Armor 5 Mass -6 sub Hand Name inv Gun 10 Name Range 8 Magazine 12 sub Ammo 10 Type end end Mount Name inv EMelee 12 Name Speed 3 Acc 1 end ArcJet 4 end inv ArmArmor 6 Mass -7 sub STC AC-2 Mass -5 end end Mod Arm Name Size 6 Armor 5 Mass -6 sub Hand Name Mount Name ArcJet 4 end inv ArmArmor 6 Mass -7 sub STC AC-2 Mass -5 end Shield 5 DefBonus 1 Mass -5 end Mod Leg Name Armor 7 Mass -7 sub Mount Name ArcJet 6 end inv LegArmor 6 Mass -7 sub STC SWML-60 end end Mod Leg Name Armor 7 Mass -7 sub Mount Name ArcJet 6 end inv LegArmor 6 Mass -7 sub STC SWML-60 end end end Battroid 7 Name Desig SDL_Sprite Desc Mod Head Armor 5 Size 5 Mass -5 sub Sensor 6 STC VC-5 Type Name end inv HeadArmor 4 Mass -4 end Mod Body Armor 7 Mass -7 sub Sensor 1 CPit Armor 2 Mass -1 TarComp 3 Gyro 4 Armor 2 Mass -1 Engine 7 Armor 2 Mass -1 STC LAS-5 STC LAS-5 ArcJet 8 end inv BodyArmor 6 Mass -8 sub STC LAS-5 STC LAS-5 end end Mod Arm Name Size 6 Armor 5 Mass -6 sub Hand Name Mount Name inv STC RG-16 Mass -6 end ArcJet 4 end inv ArmArmor 5 Mass -3 end Mod Arm Name Size 6 Armor 5 Mass -6 sub Hand Name Mount Name inv STC RG-16 Mass -6 end ArcJet 4 end inv ArmArmor 5 Mass -3 end Mod Leg Name Armor 7 Mass -7 sub Mount Name inv STC SWML-40 end ArcJet 6 end inv LegArmor 4 Mass -3 sub STC SWML-40 end end Mod Leg Name Armor 7 Mass -7 sub Mount Name inv STC SWML-40 end ArcJet 6 end inv LegArmor 4 Mass -3 sub STC SWML-40 end end end Battroid 7 Name Desig SDL_Sprite Desc Mod Head Armor 5 Size 5 Mass -5 sub Sensor 6 STC VC-5 Type Name end inv HeadArmor 5 Mass -5 end Mod Body Armor 7 Mass -7 sub Sensor 1 CPit Armor 2 Mass -1 TarComp 3 Gyro 4 Armor 2 Mass -1 Engine 7 Armor 2 Mass -1 STC LAS-5 STC LAS-5 ArcJet 8 end inv BodyArmor 7 Mass -8 sub ArcJet 4 end end Mod Arm Name Size 6 Armor 5 Mass -6 sub Hand Name inv EMelee 20 Name Speed 3 Acc 2 Type Mass 6 end Mount Name ArcJet 4 end inv ArmArmor 6 Mass -7 sub STC AC-2 Mass -5 end end Mod Arm Name Size 6 Armor 5 Mass -6 sub Hand Name Mount Name ArcJet 4 end inv ArmArmor 6 Mass -7 sub STC AC-2 Mass -5 end Shield 3 DefBonus -1 sub EMelee 5 Name Type end end Mod Leg Name Armor 7 Mass -7 sub Mount Name inv STC HWML-2 end ArcJet 6 end inv LegArmor 6 Mass -7 sub ArcJet 6 end end Mod Leg Name Armor 7 Mass -7 sub Mount Name inv STC HWML-2 end ArcJet 6 end inv LegArmor 6 Mass -7 sub ArcJet 6 end end end Battroid 7 Name Desig SDL_Sprite Desc Mod Head Armor 5 Size 5 Mass -5 sub Sensor 6 STC VC-5 Type Name end inv HeadArmor 5 Mass -5 end Mod Body Armor 7 Mass -7 sub Sensor 1 CPit Armor 2 Mass -1 TarComp 3 Gyro 4 Armor 2 Mass -1 Engine 7 Armor 2 Mass -1 STC LAS-5 STC LAS-5 ArcJet 8 end inv BodyArmor 8 Mass -10 sub STC MAC-4 Mass -5 STC MAC-4 Mass -5 end end Mod Arm Name Size 6 Armor 5 Mass -6 sub Hand Name inv Melee 10 Name Acc 1 Type Mass -5 end Mount Name inv STC GR-24 Mass -8 Speed 2 end ArcJet 4 end inv ArmArmor 6 Mass -7 sub STC AC-2 Mass -5 end end Mod Arm Name Size 6 Armor 5 Mass -6 sub Hand Name Mount Name ArcJet 4 end inv ArmArmor 6 Mass -7 sub STC AC-2 Mass -5 end Shield 5 DefBonus 1 Mass -5 end Mod Leg Name Armor 7 Mass -7 sub Mount Name ArcJet 6 end inv LegArmor 6 Mass -7 sub STC SWML-40 ArcJet 2 end end Mod Leg Name Armor 7 Mass -7 sub Mount Name ArcJet 6 end inv LegArmor 6 Mass -7 sub STC SWML-40 ArcJet 2 end end end Battroid 7 Name Desig SDL_Sprite Desc Mod Head Armor 5 Size 5 Mass -5 sub Sensor 6 STC VC-5 Type Name end inv HeadArmor 5 Mass -5 end Mod Body Armor 7 Mass -7 sub Sensor 1 CPit Armor 2 Mass -1 TarComp 3 Gyro 4 Armor 2 Mass -1 Engine 7 Armor 2 Mass -1 STC LAS-5 STC LAS-5 ArcJet 8 end inv BodyArmor 8 Mass -9 sub ArcJet 6 end end Mod Arm Name Size 6 Armor 5 Mass -6 sub Hand Name inv EMelee 12 Name Type Mass 5 end Mount Name inv Melee 4 Name Mass -3 Speed 1 end ArcJet 4 end inv ArmArmor 6 Mass -7 sub STC AC-2 Mass -5 end end Mod Arm Name Size 6 Armor 5 Mass -6 sub Hand Name inv Melee 10 Name Type Acc 1 Mass -4 end Mount Name inv Melee 4 Name Mass -3 Speed 1 end ArcJet 4 end inv ArmArmor 6 Mass -7 sub STC AC-2 Mass -5 end end Mod Leg Name Armor 7 Mass -7 sub Mount Name inv Gun 12 Name Mass -10 Type Range 4 Speed 1 Magazine 10 sub Ammo 12 end end ArcJet 6 end inv LegArmor 6 Mass -7 sub ArcJet 3 end end Mod Leg Name Armor 7 Mass -7 sub Mount Name inv Gun 12 Name Mass -10 Type Range 4 Speed 1 Magazine 10 sub Ammo 12 end end ArcJet 6 end inv LegArmor 6 Mass -7 sub ArcJet 3 end end end GearHead/Design/Puma.txt0000644000175000017500000000107010116072630014022 0ustar kaolkaolBattroid 4 Name Desig Mod Head Size 2 Armor 3 sub Sensor 6 end Mod Body Armor 4 sub CPit MLauncher 2 Name Range 3 Magazine 12 sub Rockets 2 end end Mod Arm Name Armor 3 sub Hand Mount Name inv STC LAS-10 end end Mod Arm Name Armor 3 sub Hand STC LAS-5 end Mod Leg Name Armor 3 sub Flight 4 end Mod Leg Name Armor 3 sub Flight 4 end end GearHead/Design/Vadel.txt0000644000175000017500000000274110563355322014171 0ustar kaolkaolBattroid 5 Name Desig SDL_Sprite desc Mod Head Size 3 Armor 5 Mass -3 sub Sensor 5 TarComp 1 end Mod Body Armor 4 Mass -6 sub CPit Armor 2 Mass -1 Gyro 2 Sensor 1 STC VC-5 Name STC VC-5 Name HoverJet 4 Overcharger 8 end inv BodyArmor 3 Mass -5 end Mod Arm Name Size 4 Armor 4 Mass -3 sub Hand inv BeamGun 5 Name Acc 1 Range 6 BV 2 end end inv ArmArmor 2 Mass -3 sub MLauncher 8 Name Magazine 5 sub Rockets 8 end end end Mod Arm Name Size 4 Armor 4 Mass -3 sub Hand inv Melee 7 Name end end inv ArmArmor 2 Mass -3 sub MLauncher 8 Name Magazine 5 sub Rockets 8 end end Shield 3 DefBonus -1 end Mod Leg Name Armor 4 Mass -3 sub Mount Name HoverJet 4 end inv LegArmor 3 Mass -5 sub HoverJet 3 Overcharger 4 end end Mod Leg Name Armor 4 Mass -3 sub Mount Name HoverJet 4 end inv LegArmor 3 Mass -5 sub HoverJet 3 Overcharger 4 end end end GearHead/Design/Wraith.txt0000644000175000017500000000134710116072630014365 0ustar kaolkaolAeroFighter 4 Name Desig SDL_Sprite Mod Body Armor 4 sub CPit Sensor 5 Mount Name inv Gun 6 Name Range 8 Magazine 8 sub Ammo 6 end end Mount Name inv STC HRP-12 end Gun 1 Name Range 4 Acc -1 BV 4 Magazine 300 sub Ammo 1 end Flight 2 end Mod Wing Name Size 5 Armor 4 sub Mount Name inv STC SWML-20 end Flight 4 end Mod Wing Name Size 5 Armor 4 sub Mount Name inv STC SWML-20 end Flight 4 end end GearHead/mapedit.pp0000644000175000017500000001102410334666324013145 0ustar kaolkaolunit MapEdit; { GearHead: Arena, a roguelike mecha CRPG Copyright (C) 2005 Joseph Hewitt This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. The full text of the LGPL can be found in license.txt. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } interface Procedure EditMap; implementation {$IFDEF SDLMODE} uses gears,locale,ui4gh,congfx,sdlinfo,sdlmap,sdlmenus; {$ELSE} uses gears,locale,ui4gh,congfx,coninfo,conmap,conmenus,context; {$ENDIF} Procedure SaveMap( GB: GameBoardPtr ); { Prompt for a file name, then save a map to disk. } var FName: String; F: Text; X,Y: Integer; begin FName := GetStringFromUser( 'Enter filename - format "MAP_*.txt"' ); for X := 1 to XMax do begin for Y := 1 to YMax do begin GB^.Map[ X , Y ].Visible := False; end; end; if FName <> '' then begin Assign( F , Series_Directory + FName ); Rewrite( F ); WriteMap( GB^.Map , F ); Close( F ); end; for X := 1 to XMax do begin for Y := 1 to YMax do begin GB^.Map[ X , Y ].Visible := True; end; end; DisplayMap( GB ); end; Procedure LoadMap( GB: GameBoardPtr ); { Prompt for a file name, then load a map from disk. } var RPM: RPGMenuPtr; FName: String; F: Text; X,Y: Integer; begin RPM := CreateRPGMenu( MenuItem , MenuSelect , ZONE_Menu ); BuildFileMenu( RPM , Series_Directory + '*MAP_*.txt' ); FName := SelectFile( RPM ); DisposeRPGMenu( RPM ); if FName <> '' then begin Assign( F , Series_Directory + FName ); Reset( F ); GB^.Map := ReadMap( F ); Close( F ); end; for X := 1 to XMax do begin for Y := 1 to YMax do begin GB^.Map[ X , Y ].Visible := True; end; end; DisplayMap( GB ); end; Procedure ClearMap( GB: GameBoardPtr; Pen: Integer ); var X,Y: Integer; begin for X := 1 to XMax do begin for Y := 1 to YMax do begin GB^.Map[ X , Y ].Terr := Pen; end; end; end; Procedure EditMap; { Edit the given map. Save it to disk if need be. } { The map is edited with visibility all turned on. When the map } { is saved. the visibility will be turned off. } var A: CHar; Pen,Palette,X,Y: Integer; GB: GameBoardPtr; Procedure RepositionCursor( D: Integer ); begin RedrawTile( gb, X , Y ); if OnTheMap( X + AngDir[ D , 1 ] , Y + AngDir[ D , 2 ] ) then begin X := X + AngDir[ D , 1 ]; Y := Y + AngDir[ D , 2 ]; end; end; begin { Create a map, and clear it. } GB := NewMap; for X := 1 to XMax do begin for Y := 1 to YMax do begin GB^.Map[ X , Y ].Visible := True; GB^.Map[ X , Y ].Terr := 1; end; end; DisplayMap( GB ); { Initialize our pointer. } Pen := 1; Palette := 1; X := 1; Y := 1; repeat IndicateTile( GB , X , Y ); MapEditInfo( Pen , Palette , X , Y ); A := RPGKey; if A = KeyMap[ KMC_North ].KCode then begin RepositionCursor( 6 ); end else if A = KeyMap[ KMC_South ].KCode then begin RepositionCursor( 2 ); end else if A = KeyMap[ KMC_West ].KCode then begin RepositionCursor( 4 ); end else if A = KeyMap[ KMC_East ].KCode then begin RepositionCursor( 0 ); end else if A = KeyMap[ KMC_NorthEast ].KCode then begin RepositionCursor( 7 ); end else if A = KeyMap[ KMC_SouthWest ].KCode then begin RepositionCursor( 3 ); end else if A = KeyMap[ KMC_NorthWest ].KCode then begin RepositionCursor( 5 ); end else if A = KeyMap[ KMC_SouthEast ].KCode then begin RepositionCursor( 1 ); end else if A = ']' then begin Pen := Pen + 1; if Pen > NumTerr then pen := 1; end else if A = '[' then begin Pen := Pen - 1; if Pen < 1 then pen := NumTerr; end else if A = ' ' then begin GB^.Map[ X , Y ].Terr := Pen; end else if A = 'S' then begin SaveMap( GB ); end else if A = 'L' then begin LoadMap( GB ); end else if A = 'C' then begin ClearMap( GB , Pen ); end; until A = 'Q'; { Get rid of the map. } DisposeMap( GB ); end; end. GearHead/ghsupport.pp0000644000175000017500000000707410334666420013564 0ustar kaolkaolunit ghsupport; { This unit handles support gears - various things needed for a } { mecha's operation which don't fit in elsewhere. } { GearHead: Arena, a roguelike mecha CRPG Copyright (C) 2005 Joseph Hewitt This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. The full text of the LGPL can be found in license.txt. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } { *** RULES *** } { - Support gears may only be installed in the BODY module. } { - Every mecha needs an engine. } interface uses gears; { *** SUPPORT FORMAT *** } { G = GG_Support } { S = System Type } { V = System Rating } { Stat[1] = Armor Rating } { Stat[2] = Engine Subtype } const NumSupportType = 2; GS_Gyro = 1; GS_Engine = 2; STAT_EngineSubType = 2; EST_HighOutput = 1; Function SupportBaseDamage( Part: GearPtr ): Integer; Function SupportName( Part: GearPtr ): String; Function SupportBaseMass( Part: GearPtr ): Integer; Function SupportValue( Part: GearPtr ): LongInt; Procedure CheckSupportRange( Part: GearPtr ); implementation const SupName: Array [1..NumSupportType] of String = ( 'Gyroscope','Engine' ); Function SupportBaseDamage( Part: GearPtr ): Integer; { Return the amount of damage this system can withstand. } begin if Part^.S = GS_Engine then begin SupportBaseDamage := 3; end else begin SupportBaseDamage := 1; end; end; Function SupportName( Part: GearPtr ): String; { Return a name for this particular sensor. } begin SupportName := SupName[ Part^.S ]; end; Function SupportBaseMass( Part: GearPtr ): Integer; { Return the mass of this system. } begin { The mass is equal to the armor value } SupportBaseMass := Part^.Stat[1]; end; Function SupportValue( Part: GearPtr ): LongInt; { Calculate the base cost of this sensor type. } var it: LongInt; begin if Part^.S = GS_Gyro then begin it := Part^.V * Part^.V * 30; end else if Part^.S = GS_Engine then begin case Part^.Stat[ STAT_EngineSubType ] of EST_HighOutput: it := Part^.V * 1000; else it := Part^.V * 45; end; end else it := Part^.V * 45; { Add the armor cost. } it := it + Part^.Stat[1] * 25; SupportValue := it; end; Procedure CheckSupportRange( Part: GearPtr ); { Examine this support system to make sure everything is legal. } begin { Check S - System Type } if Part^.S < 1 then Part^.S := 1 else if Part^.S > NumSupportType then Part^.S := 1; { Check V - System Rating. Must be in the range from 1 to 10. } if ( Part^.S = GS_Engine ) and ( Part^.Parent <> Nil ) then begin if Part^.V <> Part^.Parent^.V then Part^.V := Part^.Parent^.V; if Part^.Scale <> Part^.Parent^.Scale then Part^.Scale := Part^.Parent^.Scale; end else begin if Part^.V < 1 then Part^.V := 1 else if Part^.V > 10 then Part^.V := 10; end; { Check Stats - Stat 1 is armor. } if Part^.Stat[1] < 0 then Part^.Stat[1] := 0 else if Part^.Stat[1] > 2 then Part^.Stat[2] := 2; end; end. GearHead/ghchars.pp0000644000175000017500000006454410471230160013143 0ustar kaolkaolunit ghchars; {This unit handles the constants, functions, and} {attributes associated with Character gears.} { GearHead: Arena, a roguelike mecha CRPG Copyright (C) 2005 Joseph Hewitt This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. The full text of the LGPL can be found in license.txt. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } interface { ******************************** } { *** CHARACTER DEFINITIONS *** } { ******************************** } { G = GG_Character } { S = Undefined } { V = Threat Rating (used for wandering monsters and other encounters) } uses gears; Type SkillDesc = Record Name: String; Stat: Byte; MekSys: Byte; { Is this skill affected by a mecha stat modifier? } Usage: Byte; { How is this skill used? } end; Const STAT_Reflexes = 1; STAT_Body = 2; STAT_Speed = 3; STAT_Perception = 4; STAT_Craft = 5; STAT_Ego = 6; STAT_Knowledge = 7; STAT_Charm = 8; NAG_StatImprovementLevel = 11; { Counts how many times a stat has been } { improved through experience. } StatName: Array [1..NumGearStats] of String = ( 'Reflexes','Body','Speed','Perception', 'Craft','Ego','Knowledge','Charm' ); { This is the normal maximum stat value in character creation. } NormalMaxStatValue = 14; { Here are the Mecha System definitions for skills. } MS_Maneuver = 1; MS_Targeting = 2; MS_Sensor = 3; NAG_Skill = 1; { S = Skill Name } { V = Skill Rank } NAS_FreeSkillPoints = -1; NAS_FreeStatPoints = -2; NAG_CharDescription = 3; NAS_Gender = 0; NAV_Male = 0; NAV_Female = 1; GenderName: Array[0..1] of String = ( 'Male' , 'Female' ); NAS_DAge = 1; { CharDescription/Delta age - Offset from 20. } NAS_CharType = 2; { Character type - PC or NPC. } NAV_CTPrimary = 0; { default value } NAV_CTLancemate = 1; { lancemate } { CharDescription / Personality Traits } Num_Personality_Traits = 7; NAS_Heroic = -1; { CharDescription/ Heroic <-> Villanous } NAS_Lawful = -2; { CharDescription/ Lawful <-> Chaotic } NAS_Sociable = -3; { CharDescription/ Assertive <-> Shy } NAS_Easygoing = -4; { CharDescription/ Easygoing <-> Passionate } NAS_Cheerful = -5; { CharDescription/ Cheerful <-> Melancholy } NAS_Renowned = -6; { CharDescription/ Renowned <-> Hopeless } NAS_Pragmatic = -7; { CharDescription/ Pragmatic <-> Spiritual } PTraitName: Array [1..Num_Personality_Traits,1..2] of String = ( ( 'Heroic','Villainous' ), ( 'Lawful','Chaotic' ), ( 'Sociable','Shy' ), ( 'Easygoing','Passionate' ), ( 'Cheerful','Melancholy' ), ( 'Renowned','Wangtta' ), ( 'Pragmatic','Spiritual' ) ); NAG_Experience = 4; NAS_TotalXP = 0; NAS_SpentXP = 1; NAS_Credits = 2; NAS_FacXP = 3; NAS_FacLevel = 4; NAS_Skill_XP_Base = 100; { For skill-specific XP awards. } { S = 100 + Skill Index } NAG_Condition = 9; NAS_StaminaDown = 0; NAS_MentalDown = 1; NAS_Hunger = 2; NAS_MoraleDamage = 3; { Overload affects mecha rather than characters, but it's } { a condition so it's grouped in with these. } NAS_Overload = 4; NAS_CyberTrauma = 5; MORALE_HPRegen = 5; MORALE_RepSmall = 10; MORALE_RepBig = 30; FOOD_MORALE_FACTOR = 15; { Hunger penalty is calibrated to start roughly twelve hours } { after your last meal. } Hunger_Penalty_Starts = 70; {For now, all skills will be hardcoded into the game binary.} {At some point in time I may have them defined in an} {external text file, but since the application of these} {skills have to be hard coded I don't see why the data} {for them shouldn't be as well.} NumSkill = 41; USAGE_Repair = 1; USAGE_Clue = 2; USAGE_Performance = 3; { Gets its own type, since it's unique. } USAGE_Robotics = 4; { Ditto. } USAGE_DominateAnimal = 5; { Yet another unique skill. } USAGE_PickPockets = 6; { The same. } SkillMan: Array [1..NumSkill] of SkillDesc = ( ( name: 'Mecha Gunnery'; stat: STAT_Reflexes; meksys: MS_Targeting; Usage: 0 ), ( name: 'Mecha Artillery'; stat: STAT_Perception; meksys: MS_Targeting; Usage: 0 ), ( name: 'Mecha Weapons'; stat: STAT_Reflexes; meksys: MS_Maneuver; Usage: 0; ), ( name: 'Mecha Fighting'; stat: STAT_Speed; meksys: MS_Maneuver; Usage: 0; ), ( name: 'Mecha Piloting'; stat: STAT_Reflexes; meksys: MS_Maneuver; Usage: 0; ), ( name: 'Small Arms'; stat: STAT_Reflexes; meksys: 0; Usage: 0; ), ( name: 'Heavy Weapons'; stat: STAT_Perception; meksys: 0; Usage: 0; ), ( name: 'Armed Combat'; stat: STAT_Reflexes; meksys: 0; Usage: 0; ), ( name: 'Martial Arts'; stat: STAT_Body; meksys: 0; Usage: 0; ), ( name: 'Dodge'; stat: STAT_Speed; meksys: 0; Usage: 0; ), ( name: 'Awareness'; stat: STAT_Perception; meksys: MS_Sensor; Usage: 0; ), ( name: 'Initiative'; stat: STAT_Speed; meksys: 0; Usage: 0; ), ( name: 'Vitality'; stat: STAT_Body; meksys: 0; Usage: 0; ), ( name: 'Survival'; stat: STAT_Craft; meksys: 0; Usage: USAGE_Clue; ), ( name: 'Mecha Repair'; stat: STAT_Craft; meksys: 0; Usage: USAGE_Repair; ), ( name: 'Medicine'; stat: STAT_Knowledge; meksys: 0; Usage: USAGE_Repair; ), ( name: 'Electronic Warfare'; stat: STAT_Craft; meksys: 0; Usage: 0; ), ( name: 'Spot Weakness'; stat: STAT_Craft; meksys: MS_Sensor; Usage: 0; ), ( name: 'Conversation'; stat: STAT_Charm; meksys: 0; Usage: 0; ), ( name: 'First Aid'; stat: STAT_Craft; meksys: 0; Usage: USAGE_Repair; ), { Skills 21 - 25 } ( name: 'Shopping'; stat: STAT_Charm; meksys: 0; Usage: 0; ), ( name: 'Bio Technology'; stat: STAT_Knowledge; meksys: 0; Usage: USAGE_Repair; ), ( name: 'General Repair'; stat: STAT_Craft; meksys: 0; Usage: USAGE_Repair; ), ( name: 'Cybertech'; stat: STAT_Ego; meksys: 0; Usage: 0; ), ( name: 'Stealth'; stat: STAT_Speed; meksys: MS_Maneuver; Usage: 0; ), { Skills 26 - 30 } ( name: 'Athletics'; stat: STAT_Body; meksys: 0; Usage: 0; ), ( name: 'Flirtation'; stat: STAT_Charm; meksys: 0; Usage: 0; ), ( name: 'Intimidation'; stat: STAT_Ego; meksys: 0; Usage: 0; ), ( name: 'Science'; stat: STAT_Knowledge; meksys: 0; Usage: USAGE_Clue; ), ( name: 'Concentration'; stat: STAT_Ego; meksys: 0; Usage: 0; ), { Skills 31 - 35 } ( name: 'Mecha Engineering'; stat: STAT_Knowledge; meksys: 0; Usage: 0; ), ( name: 'Code Breaking'; stat: STAT_Craft; meksys: 0; Usage: USAGE_Clue; ), ( name: 'Weight Lifting'; stat: STAT_Body; meksys: 0; Usage: 0; ), ( name: 'Mysticism'; stat: STAT_Ego; meksys: 0; Usage: USAGE_Clue; ), ( name: 'Performance'; stat: STAT_Charm; meksys: 0; Usage: USAGE_Performance; ), { Skills 36 - 40 } ( name: 'Resistance'; stat: STAT_Ego; meksys: 0; Usage: 0; ), ( name: 'Investigation'; stat: STAT_Perception; meksys: 0; Usage: USAGE_Clue; ), ( name: 'Robotics'; stat: STAT_Knowledge; meksys: 0; Usage: USAGE_Robotics; ), ( name: 'Leadership'; stat: STAT_Charm; meksys: 0; Usage: 0; ), ( name: 'Dominate Animal'; stat: STAT_Ego; meksys: 0; Usage: USAGE_DominateAnimal; ), { Skills 41 - 45 } ( name: 'Pick Pockets'; stat: STAT_Craft; meksys: 0; Usage: USAGE_PickPockets; ) ); NAS_WeightLifting = 33; NAS_Performance = 35; NAS_Resistance = 36; NAS_Investigation = 37; NAS_Leadership = 39; NAS_PickPockets = 41; NAG_Talent = 16; NumTalent = 28; NAS_StrengthOfFaith = 1; NAS_BodyBuilder = 2; NAS_ScientificMethod = 3; NAS_Presence = 4; NAS_KungFu = 5; NAS_HapKiDo = 6; NAS_Anatomist = 7; NAS_HardAsNails = 8; NAS_StuntDriving = 9; NAS_Savant = 10; NAS_Bishounen = 11; NAS_Diplomatic = 12; NAS_BornToFly = 13; NAS_SureFooted = 14; NAS_RoadHog = 15; NAS_Scavenger = 16; NAS_Idealist = 17; NAS_BusinessSense = 18; NAS_AnimalTrainer = 19; NAS_JackOfAll = 20; NAS_CombatMedic = 21; NAS_Rage = 22; NAS_Ninjitsu = 23; NAS_HullDown = 24; NAS_GateCrasher = 25; NAS_Extropian = 26; NAS_CyberPsycho = 27; NAS_Sniper = 28; { Talent pre-requisites are described as follows: The first } { coordinate lists the skill (if positive) or stat (if negative) } { needed to gain the talent. The second coordinate lists the } { minimum value required. If either coordinate is zero, this } { talent has no pre-requisites. } { NEW: Personality traits may be specified as -8 + Trait Number } TALENT_PreReq: Array [1..NumTalent,1..2] of Integer = ( ( 34 , 5 ) , ( 33 , 5 ) , ( 29 , 5 ) , ( 35 , 5 ), ( 9 , 5 ), ( 9 , 5 ) , ( 16 , 5 ) , ( 36 , 5 ) , ( -3 , 15 ) , ( 0 , 0 ), ( -8 , 15 ) , ( -6 , 15 ) , ( 5 , 5 ) , ( 5 , 5 ) , ( 5 , 5 ), ( 15 , 5 ), ( 0 , 0 ), ( 21 , 5 ), ( 40 , 5 ), (-STAT_Craft,15), ( 20 , 5 ), ( -13 , -25 ), ( 25 , 5 ), ( 17 , 5 ), ( -12 , -25 ), ( 24 , 5 ), ( -2 , 15 ), ( 18 , 5 ) ); Procedure InitChar(Part: GearPtr); Function CharBaseDamage( PC: GearPtr; CBod: Integer ): Integer; Function CharStamina( PC: GearPtr ): Integer; Function CharMental( PC: GearPtr ): Integer; Function CharCurrentStamina( PC: GearPtr ): Integer; Function CharCurrentMental( PC: GearPtr ): Integer; Function RandomName: String; procedure RollStats( PC: GearPtr; Pts: Integer); function RandomPilot( StatPoints , SkillRank: Integer ): GearPtr; function RandomSoldier( StatPoints , SkillRank: Integer ): GearPtr; Function NumberOfSkills( PC: GearPtr ): Integer; Function NumberOfSkillSlots( PC: GearPtr ): Integer; Function TooManySkillsPenalty( PC: GearPtr; N: Integer ): Integer; Function SkillAdvCost( PC: GearPtr; CurrentLevel: Integer ): LongInt; function IsLegalCharSub( SPC, Part: GearPtr ): Boolean; Function PersonalityTraitDesc( Trait,Level: Integer ): String; Function NPCTraitDesc( NPC: GearPtr ): String; Function CanLearnTalent( PC: GearPtr; T: Integer ): Boolean; Function NumFreeTalents( PC: GearPtr ): Integer; Procedure ApplyTalent( PC: GearPtr; T: Integer ); implementation uses texutil; Procedure InitChar(Part: GearPtr); {PART is a newly created Character record.} {Initialize its stuff.} begin {Default scale for a PC is 0.} Part^.Scale := 0; { Default material for a PC is "meat". } SetNAtt( Part^.NA , NAG_GearOps , NAS_Material , NAV_Meat ); end; Function CharBaseDamage( PC: GearPtr; CBod: Integer ): Integer; {Calculate the number of general HPs that a character} {can take.} var HP: Integer; begin {Error check- make sure we have a character here.} if PC^.G <> GG_Character then Exit(0); HP := ( CBod + 5 ) div 2; { Add the Vitality skill. } HP := HP + NAttValue( PC^.NA , NAG_Skill , 13 ); CharBaseDamage := HP; end; Function CharStamina( PC: GearPtr ): Integer; {Calculate the number of stamina points that a character has.} var SP: Integer; begin {Error check- make sure we have a character here.} if PC^.G <> GG_Character then Exit(0); { basic stamina rating is equal to the average between BODY and EGO. } SP := ( PC^.Stat[ STAT_Body ] + PC^.Stat[ STAT_Ego ] + 5 ) div 2; { Add the Athletics skill. } SP := SP + NAttValue( PC^.NA , NAG_Skill , 26 ) * 3; CharStamina := SP; end; Function CharMental( PC: GearPtr ): Integer; {Calculate the number of mental points that a character has.} var MP: Integer; begin {Error check- make sure we have a character here.} if PC^.G <> GG_Character then Exit(0); { basic mental rating is equal to the average between } { KNOWLEDGE and EGO. } MP := ( PC^.Stat[ STAT_Knowledge ] + PC^.Stat[ STAT_Ego ] + 5 ) div 2; { Add the Concentration skill. } MP := MP + NAttValue( PC^.NA , NAG_Skill , 30 ) * 3; CharMental := MP; end; Function CharCurrentStamina( PC: GearPtr ): Integer; { Return the current stamina value for this character. } var it: Integer; begin {Error check- make sure we have a character here.} if PC^.G <> GG_Character then Exit(0); it := CharStamina( PC ) - NAttValue( PC^.NA , NAG_Condition , NAS_StaminaDown ); if it < 0 then it := 0; CharCurrentStamina := it; end; Function CharCurrentMental( PC: GearPtr ): Integer; { Return the current mental value for this character. } var it: Integer; begin {Error check- make sure we have a character here.} if PC^.G <> GG_Character then Exit(0); it := CharMental( PC ) - NAttValue( PC^.NA , NAG_Condition , NAS_MentalDown ); if it < 0 then it := 0; CharCurrentMental := it; end; Function RandomName: String; {Generate a random name for a character.} Const NumSyllables = 120; SyllableList: Array [1..NumSyllables] of String [5] = ( 'Jo','Sep','Hew','It','Seo','Eun','Suk','Ki','Kang','Cho', 'Ai','Bo','Ca','Des','El','Fas','Gun','Ho','Ia','Jes', 'Kep','Lor','Mo','Nor','Ox','Pir','Qu','Ra','Sun','Ter', 'Ub','Ba','Tyb','War','Bac','Yan','Zee','Es','Vis','Jang', 'Vic','Tor','Et','Te','Ni','Mo','Bil','Con','Ly','Dam', 'Cha','Ro','The','Bes','Ne','Ko','Kun','Ran','Ma','No', 'Ten','Do','To','Me','Ja','Son','Love','Joy','Ken','Iki', 'Han','Lu','Ke','Sky','Wal','Jen','Fer','Le','Ia','Chu', 'Tek','Ubu','Roi','Har','Old','Pin','Ter','Red','Ex','Al', 'Alt','Rod','Mia','How','Phi','Aft','Aus','Tin','Her','Ge', 'Hawk','Eye','Ger','Ru','Od','Jin','Un','Hyo','Leo','Star', 'Buck','Ers','Rog','Eva','Ova','Oni','Ami','Ga','Cyn','Mai' ); NumVowels = 6; VowelList: Array [1..NumVowels] of String [2] = ( 'A','E','I','O','U','Y' ); NumConsonants = 21; ConsonantList: Array [1..NumConsonants] of String [2] = ( 'B','C','D','F','G','H','J','K','L','M','N', 'P','Q','R','S','T','V','W','X','Y','Z' ); Function Syl: String; begin if Random(16) = 3 then Syl := VowelList[Random(NumVowels)+1] else if Random(20) = 2 then begin if Random(3) = 1 then Syl := ConsonantList[Random(NumConsonants)+1] + LowerCase( VowelList[Random(NumVowels)+1] ) else if Random(2) = 1 then Syl := VowelList[Random(NumVowels)+1] + LowerCase( ConsonantList[Random(NumConsonants)+1] ) else if Random(2) = 1 then Syl := ConsonantList[Random(NumConsonants)+1] + LowerCase( VowelList[Random(NumVowels)+1] + ConsonantList[Random(NumConsonants)+1] ) else Syl := VowelList[Random(NumVowels)+1] + LowerCase( ConsonantList[Random(NumConsonants)+1] + VowelList[Random(NumVowels)+1] ); end else Syl := SyllableList[Random(NumSyllables)+1]; end; var it: String; begin {A basic name is two syllables stuck together.} if Random(100) <> 5 then it := Syl + LowerCase(Syl) else it := Syl; {Uncommon names may have 3 syllables.} if ( Random(8) > Length(it) ) then it := it + LowerCase(Syl) else if Random(30) = 1 then it := it + LowerCase(Syl); {Short names may have a second part. This isn't common.} if (Length(it) < 9) and (Random(16) = 7) then begin it := it + ' ' + Syl; if Random(3) <> 1 then it := it + LowerCase(Syl); end; { Random chance of random anime designation. } if Random(1000) = 123 then it := it + ' - ' + ConsonantList[Random(21)+1]; RandomName := it; end; procedure RollStats( PC: GearPtr; Pts: Integer); { Randomly allocate PTS points to all of the character's } { stats. Advancing stats past maximum } { rank takes two stat points per rank instead of one. } { Hopefully, this will be clear once you read the implementation... } var T: Integer; { A loop counter. } STemp: Array [1..NumGearStats] of Integer; { I always name my loop counters T, in honor of the C64. } begin { Error Check - Is this a character!? } if ( PC = Nil ) or ( PC^.G <> GG_Character ) then Exit; { Set all stat values to minimum. } if Pts >= NumGearStats then begin for t := 1 to NumGearStats do begin STemp[T] := 1; end; Pts := Pts - NumGearStats; end else begin for t := 1 to NumGearStats do begin STemp[T] := 0; end; end; { Keep processing until we run out of stat points to allocate. } while Pts > 0 do begin { T will now point to the stat slot to improve. } T := Random( NumGearStats ) + 1; { If the stat selected is under the max value, } { improve it. If it is at or above the max value, } { there's a one in three chance of improving it. } if ( STemp[T] + PC^.Stat[ T ] ) < NormalMaxStatValue then begin Inc( STemp[T] ); Dec( Pts ); end else if Random(2) = 1 then begin Inc( STemp[T] ); Pts := Pts - 2; end; end; { Add the STemp values to the stat baseline. } for t := 1 to NumGearStats do PC^.Stat[t] := PC^.Stat[t] + STemp[t]; end; function RandomPilot( StatPoints , SkillRank: Integer ): GearPtr; { Create a totally random mecha pilot, presumably so that } { the PC pilots will have someone to thwack. } const NumNPCPilotSpecialties = 5; PS: Array [1..NumNPCPilotSpecialties] of Byte = ( 10,12,17,18,25 ); var NPC: GearPtr; T: Integer; begin { Generate record. } NPC := NewGear( Nil ); if NPC = Nil then Exit( Nil ); InitChar( NPC ); NPC^.G := GG_Character; { Roll some stats for this character. } RollStats( NPC , StatPoints ); { Set all mecha skills to equal SkillRank. } for t := 1 to 5 do begin SetNAtt( NPC^.NA , NAG_Skill , T , SkillRank ); end; { Add a specialty. } SetNAtt( NPC^.NA , NAG_Skill , PS[ Random( NumNPCPilotSpecialties ) + 1 ] , SkillRank ); { Generate a random name for the character. } SetSAtt( NPC^.SA , 'Name <'+RandomName+'>'); { Return a pointer to the character record. } RandomPilot := NPC; end; function RandomSoldier( StatPoints , SkillRank: Integer ): GearPtr; { Create a totally random fighter, presumably so that } { the PC fighters will have someone to thwack. } var NPC: GearPtr; T: Integer; begin { Generate record. } NPC := NewGear( Nil ); if NPC = Nil then Exit( Nil ); InitChar( NPC ); NPC^.G := GG_Character; { Roll some stats for this character. } RollStats( NPC , StatPoints ); { Set all mecha skills to equal SkillRank. } for t := 6 to 10 do begin SetNAtt( NPC^.NA , NAG_Skill , T , SkillRank ); end; { Generate a random name for the character. } SetSAtt( NPC^.SA , 'Name <'+RandomName+'>'); { Return a pointer to the character record. } RandomSoldier := NPC; end; Function NumberOfSkills( PC: GearPtr ): Integer; { Return the number of skills this PC knows. } var T,N: Integer; begin N := 0; for t := 1 to NumSkill do begin if NAttValue( PC^.NA , NAG_Skill , T ) > 0 then Inc( N ); end; NumberOfSkills := N; end; Function NumberOfSkillSlots( PC: GearPtr ): Integer; { Return the number of skill slots this PC has. } var N: Integer; begin N := ( ( PC^.STat[ STAT_Knowledge ] * 6 ) div 5 + 5 ); if NAttValue( PC^.NA , NAG_Talent , NAS_Savant ) <> 0 then N := N + 5; NumberOfSkillSlots := N; end; Function TooManySkillsPenalty( PC: GearPtr; N: Integer ): Integer; { Return the % XP penalty that this character will suffer. } begin N := N - NumberOfSkillSlots( PC ); N := N * 10 - 5; if N < 0 then N := 0; TooManySkillsPenalty := N; end; Function SkillAdvCost( PC: GearPtr; CurrentLevel: Integer ): LongInt; { Return the cost, in XP points, to improve this skill by } { one level. } const chart: Array [1..15] of LongInt = ( 100,100,200,300,400, 500,800,1300,2100,3400, 5500,8900,14400,23300,37700 ); var SAC,N: LongInt; begin { The chart lists skill costs according to desired level, } { not current level. So, modify things a bit. } Inc( CurrentLevel ); { Range check - after level 15, it all costs the same. } if CurrentLevel < 1 then CurrentLevel := 1; if CurrentLevel <= 15 then begin { Base level advance cost is found in the chart. } SAC := chart[ CurrentLevel ]; end else begin { Base level advance cost is found in the chart. } SAC := chart[ 15 ] * ( ( CurrentLevel - 15 ) * ( CurrentLevel - 15 ) + 1 ); end; { May be adjusted upwards if PC has too many skills... } if ( PC <> Nil ) and ( PC^.G = GG_Character ) then begin N := TooManySkillsPenalty( PC , NumberOfSkills( PC ) ); if N > 0 then begin SAC := ( SAC * ( 100 + N ) ) div 100; end; end; SkillAdvCost := SAC; end; function IsLegalCharSub( SPC, Part: GearPtr ): Boolean; { Return TRUE if the specified part can be a subcomponent of } { SPC, false if it can't be. } begin if ( Part^.G = GG_Module ) then IsLegalCharSub := True else if ( Part^.G = GG_Modifier ) then IsLegalCharSub := AStringHasBString( SAttValue( Part^.SA , 'TYPE' ) , 'CHARA' ) else IsLegalCharSub := False; end; Function PersonalityTraitDesc( Trait,Level: Integer ): String; { Return a string which describes the nature & intensity of this } { personality trait. } var msg: String; begin if ( Level = 0 ) or ( Trait < 1 ) or ( Trait > Num_Personality_Traits ) then msg := '' else begin if Level > 0 then begin msg := PTraitName[ Trait , 1 ]; end else begin msg := PTraitName[ Trait , 2 ]; end; if Abs( Level ) < 25 then msg := 'Slightly ' + msg else if Abs( Level ) >= 75 then msg := 'Extremely ' + msg else if Abs( Level ) >= 50 then msg := 'Very ' + msg; end; PersonalityTraitDesc := msg; end; Function NPCTraitDesc( NPC: GearPtr ): String; { Describe this NPC's characteristics. This function is used } { for selecting characters for plots & stuff. } { - Age ( Young < 20yo , Old > 40yo ) } { - Gender ( Male, Female ) } { - Personality Traits } { - Exceptional Stats } { - Job } var it: String; T,V: Integer; begin if ( NPC = Nil ) or ( NPC^.G <> GG_Character ) then begin NPCTraitDesc := ''; end else begin it := 'SEX:' + GenderName[ NATtValue( NPC^.NA , NAG_CharDescription , NAS_Gender ) ]; T := NATtValue( NPC^.NA , NAG_CharDescription , NAS_Dage ); if T < 0 then begin it := it + ' young'; end else if T >= 20 then begin it := it + ' old'; end; { Add descriptors for character traits. } for t := 1 to Num_Personality_Traits do begin V := NAttValue( NPC^.NA , NAG_CHarDescription , -T ); if V >= 10 then begin it := it + ' ' + PTraitName[ T , 1 ]; end else if V <= -10 then begin it := it + ' ' + PTraitName[ T , 2 ]; end; end; { Add the job description. } it := it + ' ' + SAttValue( NPC^.SA , 'JOB' ); { Add a note if this NPC has a mecha. } if SATTValue( NPC^.SA , 'MECHA' ) <> '' then begin it := it + ' HASMECHA'; end; { Add descriptors for high stats. } for t := 1 to 8 do begin if NPC^.Stat[ T ] > 13 then it := it + ' ' + StatName[ T ]; end; NPCTraitDesc := it; end; end; Function CanLearnTalent( PC: GearPtr; T: Integer ): Boolean; { Return TRUE if the PC can learn this talent, or FALSE otherwise. } begin { The talent must be within the legal range in order to be } { learned. } if ( T < 1 ) or ( T > NumTalent ) then begin CanLearnTalent := False; { The PC can't learn the same talent twice. } end else if NAttValue( PC^.NA , NAG_Talent , T ) <> 0 then begin CanLearnTalent := False; end else if ( Talent_PreReq[ T , 1 ] = 0 ) or ( Talent_PreReq[ T , 2 ] = 0 ) then begin CanLearnTalent := True; end else if ( Talent_PreReq[ T , 1 ] > 0 ) then begin CanLearnTalent := NAttValue( PC^.NA , NAG_Skill , Talent_PreReq[ T , 1 ] ) >= Talent_PreReq[ T , 2 ]; end else if ( Talent_PreReq[ T , 1 ] < -8 ) then begin if Talent_PreReq[ T , 2 ] < 0 then begin CanLearnTalent := NAttValue( PC^.NA , NAG_CharDescription , Talent_PreReq[ T , 1 ] + 8 ) <= Talent_PreReq[ T , 2 ]; end else begin CanLearnTalent := NAttValue( PC^.NA , NAG_CharDescription , Talent_PreReq[ T , 1 ] + 8 ) >= Talent_PreReq[ T , 2 ]; end; end else begin CanLearnTalent := PC^.Stat[ Abs( Talent_PreReq[ T , 1 ] ) ] >= Talent_PreReq[ T , 2 ]; end; end; Function NumFreeTalents( PC: GearPtr ): Integer; { Return the number of talents the PC can learn. } var TP: NAttPtr; N: Integer; XP: LongInt; begin { Start by counting the number of talents the PC currently has. } TP := PC^.NA; N := 0; while TP <> Nil do begin if TP^.G = NAG_Talent then Inc( N ); TP := TP^.Next; end; { Subtract this from the total number of talents the PC can get, } { based on Experience. } XP := NAttValue( PC^.NA , NAG_Experience , NAS_TotalXP ); if XP > 100000 then N := 5 - N else if XP > 60000 then N := 4 - N else if XP > 30000 then N := 3 - N else if XP > 10000 then N := 2 - N else N := 1 - N; NumFreeTalents := N; end; Procedure ApplyIdealism( PC: GearPtr ); { Apply a +1 modifier to three random stats. } var T,T2,S: Integer; StatDeck: Array [1..NumGearStats] of Integer; begin { Start by shuffling the statdeck. } for t := 1 to NumGearStats do StatDeck[ t ] := T; for t := 1 to NumGearStats do begin S := Random( NumGearStats ) + 1; T2 := StatDeck[ t ]; StatDeck[ t ] := StatDeck[ S ]; StatDeck[ S ] := T2; end; { Select the first three stats off the top of the deck. } for t := 1 to 3 do Inc( PC^.Stat[ StatDeck[ T ] ] ); end; Procedure ApplyTalent( PC: GearPtr; T: Integer ); { Apply the listed talent to the PC, invoking any special effects } { if needed. } begin { Start with an error check. } if ( T < 1 ) or ( T > NumTalent ) then Exit; { Record the talent. } SetNAtt( PC^.NA , NAG_Talent , T , 1 ); { Depending on the talent, do various effects. } Case T of NAS_StrengthOfFaith: PC^.Stat[ STAT_Ego ] := PC^.Stat[ STAT_Ego ] + 2; NAS_BodyBuilder: PC^.Stat[ STAT_Body ] := PC^.Stat[ STAT_Body ] + 2; NAS_ScientificMethod: PC^.Stat[ STAT_Knowledge ] := PC^.Stat[ STAT_Knowledge ] + 2; NAS_Presence: PC^.Stat[ STAT_Charm ] := PC^.Stat[ STAT_Charm ] + 2; NAS_Idealist: ApplyIdealism( PC ); end; end; end. GearHead/ghsensor.pp0000644000175000017500000001201310334666424013352 0ustar kaolkaolunit ghsensor; { This unit covers sensors and electronics. } { GearHead: Arena, a roguelike mecha CRPG Copyright (C) 2005 Joseph Hewitt This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. The full text of the LGPL can be found in license.txt. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } interface uses gears; { *** SENSOR FORMAT *** } { G = GG_Sensor } { S = Sensor Type } { V = Sensor Rating / Sensor Function (depending on type) } { *** ELECTRONICS FORMAT *** } { G = GG_Electronics } { S = Electronics Type } { V = Electronics Rating / Function } const NumSensorType = 3; GS_MainSensor = 1; GS_TarCom = 2; GS_ECM = 3; NumElectronicsType = 1; GS_PCS = 1; { Personal Communications System } GV_Memo = 1; { Can view adventure memos } GV_Email = 2; { Can view email messages } GV_Comm = 3; { Can receive communications from NPCs } GV_News = 5; { Can view internet global news } Function SensorBaseDamage( Part: GearPtr ): Integer; Function SensorName( Part: GearPtr ): String; Function SensorBaseMass( Part: GearPtr ): Integer; Function SensorValue( Part: GearPtr ): LongInt; Procedure CheckSensorRange( Part: GearPtr ); Function ElecBaseDamage( Part: GearPtr ): Integer; Function ElecName( Part: GearPtr ): String; Function ElecBaseMass( Part: GearPtr ): Integer; Function ElecValue( Part: GearPtr ): LongInt; Procedure CheckElecRange( Part: GearPtr ); implementation uses texutil; Function SensorBaseDamage( Part: GearPtr ): Integer; { Return the amount of damage this sensor can withstand. } begin if Part^.S = GS_MainSensor then begin { Higer grade sensors are more succeptable to damage. } SensorBaseDamage := 60 - ( 5 * Part^.V ); end else begin SensorBaseDamage := 25; end; end; Function SensorName( Part: GearPtr ): String; { Return a name for this particular sensor. } begin if Part^.S = GS_MainSensor then begin SensorName := 'Class ' + BStr( Part^.V ) + ' Sensor'; end else if Part^.S = GS_ECM then begin SensorName := 'Class ' + BStr( Part^.V ) + ' ECM Suite'; end else begin SensorName := 'Class ' + BStr( Part^.V ) + ' Targeting Computer'; end; end; Function SensorBaseMass( Part: GearPtr ): Integer; { Return the amount of damage this sensor can withstand. } begin { As with most other components, the weight of a sensor is } { equal to the amount of damage it can withstand. } SensorBaseMass := SensorBaseDamage( Part ); end; Function SensorValue( Part: GearPtr ): LongInt; { Calculate the base cost of this sensor type. } begin if Part^.S = GS_MainSensor then begin SensorValue := Part^.V * Part^.V * 50 + 50; end else if Part^.S = GS_TarCom then begin SensorValue := Part^.V * Part^.V * 125; end else if Part^.S = GS_ECM then begin SensorValue := Part^.V * Part^.V * Part^.V * 500 - Part^.V * Part^.V * 350; end else SensorValue := 0; end; Procedure CheckSensorRange( Part: GearPtr ); { Examine this sensor to make sure everything is legal. } begin { Check S - Sensor Type } if Part^.S < 1 then Part^.S := 1 else if Part^.S > NumSensorType then Part^.S := 1; { Check V - Sensor Rating / Sensor Function } if Part^.V < 1 then Part^.V := 1 else if Part^.V > 10 then Part^.V := 10; { Check Scale - Sensors are always SF:0 } if Part^.Scale <> 0 then Part^.Scale := 0; { Check Stats - No Stats Defined. } end; Function ElecBaseDamage( Part: GearPtr ): Integer; { Return the base damage score of this electronic device. } begin ElecBaseDamage := 1; end; Function ElecName( Part: GearPtr ): String; { Return the default name for this electronic device. } begin ElecName := 'Electronic Device'; end; Function ElecBaseMass( Part: GearPtr ): Integer; { Return the basic mass score for this electronic device. } begin ElecBaseMass := Part^.V; end; Function ElecValue( Part: GearPtr ): LongInt; { Return the value score for this electronic device. } begin ElecValue := Part^.V * Part^.V * Part^.V * 5 + Part^.V * 10 + 15; end; Procedure CheckElecRange( Part: GearPtr ); { Examine this device to make sure everything is legal. } begin { Check S - Electronics Type } if Part^.S < 1 then Part^.S := 1 else if Part^.S > NumElectronicsType then Part^.S := 1; { Check V - Sensor Rating / Sensor Function } if Part^.V < 1 then Part^.V := 1 else if Part^.V > 10 then Part^.V := 10; { Check Stats - No Stats Defined. } end; end. GearHead/backpack.pp0000644000175000017500000015140010445670104013256 0ustar kaolkaolunit backpack; { This unit handles both the inventory display and the } { FieldHQ interface, which uses many of the same things. } { GearHead: Arena, a roguelike mecha CRPG Copyright (C) 2005 Joseph Hewitt This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. The full text of the LGPL can be found in license.txt. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } interface {$IFDEF SDLMODE} uses gears,locale,sdlgfx; {$ELSE} uses gears,locale; {$ENDIF} const TRIGGER_GetItem = 'GET'; {$IFDEF SDLMODE} Procedure SelectColors( M: GearPtr; Redrawer: RedrawProcedureType ); Procedure SelectSprite( M: GearPtr; Redrawer: RedrawProcedureType ); {$ENDIF} Procedure GivePartToPC( GB: GameBoardPtr; Part, PC: GearPtr ); Function SelectRobotParts( GB: GameBoardPtr; PC: GearPtr ): GearPtr; Procedure DoFieldRepair( GB: GameBoardPtr; PC , Item: GearPtr; Skill: Integer ); Function Handless( Mek: GearPtr ): Boolean; Function ShakeDown( GB: GameBoardPtr; Part: GearPtr; X,Y: Integer ): LongInt; Procedure PCGetItem( GB: GameBoardPtr; PC: GearPtr ); Procedure StartContinuousUseItem( GB: GameBoardPtr; TruePC , Item: GearPtr ); Procedure FHQ_SelectMechaForPilot( GB: GameBoardPtr; NPC: GearPtr ); Procedure LancemateBackpack( GB: GameBoardPtr; PC,NPC: GearPtr ); Procedure BackpackMenu( GB: GameBoardPtr; PC: GearPtr; StartWithInv: Boolean ); {$IFDEF SDLMODE} Procedure MechaPartBrowser( Mek: GearPtr; RDP: RedrawProcedureType ); {$ELSE} Procedure MechaPartBrowser( Mek: GearPtr ); {$ENDIF} Procedure FHQ_ThisWargearWasSelected( GB: GameBoardPtr; var LList: GearPtr; PC,M: GearPtr ); implementation {$IFDEF SDLMODE} uses ability,action,arenacfe,arenascript,damage,gearutil,ghchars,ghholder, ghmodule,ghprop,ghswag,interact,menugear,rpgdice,skilluse,texutil, sdlinfo,sdlmap,sdlmenus,ghweapon; {$ELSE} uses ability,action,arenacfe,arenascript,damage,gearutil,ghchars,ghholder, ghmodule,ghprop,ghswag,interact,menugear,rpgdice,skilluse,texutil, congfx,coninfo,conmap,conmenus,context,ghweapon; {$ENDIF} var ForceQuit: Boolean; EqpRPM,InvRPM: RPGMenuPtr; {$IFDEF SDLMODE} InfoGear: GearPtr; { Gear to appear in the INFO menu. } InfoGB: GameBoardPtr; MPB_Redraw: RedrawProcedureType; MPB_Gear: GearPtr; Procedure PlainRedraw; { Miscellaneous menu redraw procedure. } begin if InfoGB <> Nil then QuickCombatDisplay( InfoGB ); if InfoGear <> Nil then DisplayGearInfo( InfoGear , InfoGB ); end; Procedure MiscProcRedraw; { Miscellaneous menu redraw procedure. The Eqp display will be shown; } { the INV display won't be. } begin if InfoGB <> Nil then QuickCombatDisplay( InfoGB ); DrawBPBorder; if InfoGear <> Nil then DisplayGearInfo( InfoGear , InfoGB ); if EqpRPM <> Nil then begin DisplayMenu( EqpRPM , Nil ); NFGameMsg( MsgString( 'BACKPACK_Directions' ) , ZONE_Menu , MenuItem ); end; end; Procedure RobotPartRedraw; { Redraw procedure for the robot part selector. } begin if InfoGB <> Nil then QuickCombatDisplay( InfoGB ); DrawBPBorder; if InfoGear <> Nil then DisplayGearInfo( InfoGear , InfoGB ); NFGameMsg( MsgString( 'SELECT_ROBOT_PARTS' ) , ZONE_EqpMenu , MenuItem ); end; Procedure SelectColors( M: GearPtr; Redrawer: RedrawProcedureType ); { The player wants to change the colors for this part. Make it so. } { The menu will be placed in the Menu area; assume the redrawer will } { show whatever changes are made here. } var RPM,CMenu: RPGMenuPtr; N,T,T2: Integer; ColorList,C: SAttPtr; oldcolor,msg,newcolor: String; begin RPM := CreateRPGMenu( MenuItem , MenuSelect , ZONE_Menu ); if M^.G = GG_Character then begin AddRPGMenuItem( RPM , MsgString( 'EDITCOLOR_1' ) , 1 ); AddRPGMenuItem( RPM , MsgString( 'EDITCOLOR_2' ) , 2 ); AddRPGMenuItem( RPM , MsgString( 'EDITCOLOR_3' ) , 3 ); end else begin AddRPGMenuItem( RPM , MsgString( 'EDITCOLOR_4' ) , 4 ); AddRPGMenuItem( RPM , MsgString( 'EDITCOLOR_5' ) , 5 ); AddRPGMenuItem( RPM , MsgString( 'EDITCOLOR_6' ) , 6 ); end; AddRPGMenuItem( RPM , MsgString( 'EXIT' ) , -1 ); ColorList := LoadStringList( Data_Directory + 'sdl_colors.txt' ); repeat N := SelectMenu( RPM , Redrawer ); if N > -1 then begin { Create the list of colors. } CMenu := CreateRPGMenu( MenuItem , MenuSelect , ZONE_Menu ); C := ColorList; T := 1; while C <> Nil do begin if ( Length( C^.Info ) > 6 ) and ( C^.Info[ N ] = '+' ) then begin AddRPGMenuItem( CMenu , Copy( RetrieveAPreamble( C^.Info ) , 7 , 255 ) , T ); end; C := C^.Next; Inc( T ); end; if CMenu^.NumItem > 0 then begin RPMSortAlpha( CMenu ); T := SelectMenu( CMenu , Redrawer ); end else begin T := -1; end; DisposeRPGMenu( CMenu ); if T > 0 then begin C := RetrieveSAtt( ColorList , t ); msg := RetrieveAString( C^.Info ); oldcolor := SAttValue( M^.SA , 'SDL_COLORS' ); newcolor := ''; for t := 0 to 2 do begin if t = ( (N-1) mod 3 ) then begin for t2 := 1 to 3 do begin newcolor := newcolor + ' ' + BStr( ExtractValue( msg ) ); ExtractValue( oldcolor ); end; end else begin for t2 := 1 to 3 do begin newcolor := newcolor + ' ' + BStr( ExtractValue( oldcolor ) ); end; end; end; SetSAtt( M^.SA , 'SDL_COLORS <' + newcolor + '>' ); end; end; until N = -1; DisposeRPGMenu( RPM ); DisposeSATt( ColorList ); end; Procedure SelectSprite( M: GearPtr; Redrawer: RedrawProcedureType ); { The player wants to change the colors for sprite for this character. } { The menu will be placed in the Menu area; assume the redrawer will } { show whatever changes are made here. } var RPM: RPGMenuPtr; fname: String; begin RPM := CreateRPGMenu( MenuItem , MenuSelect , ZONE_Menu ); if NAttValue( M^.NA , NAG_CharDescription , NAS_Gender ) = NAV_Female then begin BuildFileMenu( RPM , Graphics_Directory + 'cha_f_*.*' ); end else begin BuildFileMenu( RPM , Graphics_Directory + 'cha_m_*.*' ); end; AddRPGMenuItem( RPM , MsgString( 'EXIT' ) , -1 ); fname := SelectFile( RPM , Redrawer ); if fname <> '' then begin SetSAtt( M^.SA , 'SDL_SPRITE <' + fname + '>' ); end; DisposeRPGMenu( RPM ); end; {$ENDIF} Function SelectRobotParts( GB: GameBoardPtr; PC: GearPtr ): GearPtr; { Select up to 10 parts to build a robot with. } { Delink them from the INVENTORY and return them as a list. } var Ingredients,Part,P2: GearPtr; RPM: RPGMenuPtr; N: Integer; begin {$IFNDEF SDLMODE} DrawBPBorder; GameMsg( MsgString( 'SELECT_ROBOT_PARTS' ) , ZONE_EqpMenu , MenuItem ); {$ELSE} InfoGB := GB; InfoGear := PC; {$ENDIF} Ingredients := Nil; repeat RPM := CreateRPGMenu( MenuItem , MenuSelect , ZONE_InvMenu ); RPM^.Mode := RPMNoCleanup; Part := PC^.InvCom; N := 1; while Part <> Nil do begin if ( Part^.G = GG_Weapon ) or ( Part^.G = GG_Shield ) or ( Part^.G = GG_ExArmor ) or ( Part^.G = GG_Sensor ) or ( Part^.G = GG_Electronics ) then begin AddRPGMenuItem( RPM , GearName( Part ) , N ); end else if ( Part^.G = GG_RepairFuel ) and ( ( Part^.S = 15 ) or ( Part^.S = 23 ) ) then begin AddRPGMenuItem( RPM , GearName( Part ) , N ); end; Part := Part^.Next; Inc( N ); end; RPMSortAlpha( RPM ); AlphaKeyMenu( RPM ); AddRPGMenuItem( RPM , MsgString( 'EXIT' ) , -1 ); {$IFDEF SDLMODE} N := SelectMenu( RPM , @RobotPartRedraw ); {$ELSE} N := SelectMenu( RPM ); {$ENDIF} DisposeRPGMenu( RPM ); if N > -1 then begin Part := RetrieveGearSib( PC^.InvCom , N ); DelinkGear( PC^.InvCom , Part ); while Part^.InvCom <> Nil do begin P2 := Part^.InvCom; DelinkGear( Part^.InvCom , P2 ); InsertInvCom( PC , P2 ); end; AppendGear( Ingredients , Part ); end; until ( NumSiblingGears( Ingredients ) > 9 ) or ( N = -1 ); SelectRobotParts := Ingredients; end; Procedure AddRepairOptions( RPM: RPGMenuPtr; PC,Item: GearPtr ); { Check the object in question, then add options to the } { provided menu if the item is in need of repairs which the } { PC can provide. Repair items will be numbered 100 + RSN } var N: Integer; begin PC := LocatePilot( PC ); if PC <> Nil then begin for N := 1 to NumRepairSkills do begin { The repair option will only be added to the menu if: } { - The PC has the required skill. } { - The item is in need of repair (using this skill). } if ( NAttValue( PC^.NA , NAG_Skill , RepairSkillIndex[N] ) > 0 ) and ( TotalRepairableDamage( Item , RepairSkillIndex[N] ) > 0 ) then begin AddRPGMenuItem( RPM , MsgString( 'BACKPACK_Repair' ) + SkillMan[ RepairSkillIndex[N] ].Name , 100 + N ); end; end; end; end; Procedure DoFieldRepair( GB: GameBoardPtr; PC , Item: GearPtr; Skill: Integer ); { The PC is going to use one of the repair skills. Call the } { standard procedure, then print output. } var msg: String; N: LongInt; RepairFuel,RMaster: GearPtr; begin { Error check - if no repair is needed, display an appropraite } { response. } if TotalRepairableDamage( Item , Skill ) < 1 then begin DialogMsg( MsgString( 'PCREPAIR_NoDamageDone' ) ); Exit; end; { Locate the "repair fuel". } RepairFuel := SeekGear( PC , GG_RepairFuel , Skill ); if RepairFuel = Nil then begin DialogMsg( MsgString( 'PCREPAIR_NoRepairFuel' ) ); Exit; end; { Locate the root item. If this is a character, and the repair attempt } { fails, and the master is destroyed, that's a bad thing. } RMaster := FindRoot( Item ); N := UseRepairSkill( GB , PC , Item , Skill ); msg := ReplaceHash( MsgString( 'PCREPAIR_UseSkill' + BStr( Skill ) ) , GearName( Item ) ); { Inform the user of the success. } if ( RMaster^.G = GG_Character ) and Destroyed( RMaster ) then begin AddNAtt( RMaster^.NA , NAG_Damage , NAS_StrucDamage , 30 ); msg := msg + ReplaceHash( MsgString( 'PCREPAIR_DEAD' ) , GearName( RMaster ) ); end else if N > 0 then begin msg := msg + BStr( N ) + MsgString( 'PCREPAIR_Success' + BStr( Skill ) ); end else begin msg := msg + MsgString( 'PCREPAIR_Failure' + BStr( Skill ) ); end; DialogMsg( msg ); { Deplete the fuel. } RepairFuel^.V := RepairFuel^.V - N; if RepairFuel^.V < 1 then begin DialogMsg( ReplaceHash( MsgString( 'PCREPAIR_FuelUsedUp' ) , GearName( RepairFuel ) ) ); if IsSubCom( RepairFuel ) then begin RemoveGear( RepairFuel^.Parent^.SubCom , RepairFuel ); end else if IsInvCom( RepairFuel ) then begin RemoveGear( RepairFuel^.Parent^.InvCom , RepairFuel ); end; end; end; Function ShakeDown( GB: GameBoardPtr; Part: GearPtr; X,Y: Integer ): LongInt; { This is the workhorse for this function. It does the } { dirty work of separating inventory from (former) owner. } var cash: LongInt; SPart: GearPtr; { Sub-Part } begin { Start by removing the cash from this part. } cash := NAttValue( Part^.NA , NAG_Experience , NAS_Credits ); SetNAtt( Part^.NA , NAG_Experience , NAS_Credits , 0 ); SetNAtt( Part^.NA , NAG_EpisodeData , NAS_Ransacked , 1 ); { Remove all InvComs, and place them on the map. } While Part^.InvCom <> Nil do begin SPart := Part^.InvCom; DelinkGear( Part^.InvCom , SPart ); { If this invcom isn't destroyed, put it on the } { ground for the PC to pick up. Otherwise delete it. } if NotDestroyed( SPart ) then begin SetNAtt( SPart^.NA , NAG_Location , NAS_X , X ); SetNAtt( SPart^.NA , NAG_Location , NAS_Y , Y ); SPart^.Next := GB^.Meks; GB^.Meks := SPart; end else begin DisposeGear( SPart ); end; end; { Shake down this gear's subcoms. } SPart := Part^.SubCOm; while SPart <> Nil do begin if SPart^.G <> GG_Cockpit then cash := cash + ShakeDown( GB , SPart , X , Y ); SPart := SPart^.Next; end; ShakeDown := Cash; end; Function Ransack( GB: GameBoardPtr; X,Y: Integer ): LongInt; { Yay! Loot and pillage! This function has two purposes: } { first, it separates all Inventory gears from any non-operational } { masters standing in this tile. Secondly, it collects the } { money from all those non-operational masters and returns the } { total amount as the function result. } var it: LongInt; Mek: GearPtr; begin it := 0; Mek := GB^.Meks; while Mek <> Nil do begin { If this is a broken-down master, check to see if it's } { one we want to pillage. } if IsMasterGear( Mek ) and not GearOperational( Mek ) then begin { We will ransack this gear if it's in the correct location. } if ( NAttValue( Mek^.NA , NAG_Location , NAS_X ) = X ) and ( NAttValue( Mek^.NA , NAG_Location , NAS_Y ) = Y ) then begin it := it + ShakeDown( GB , Mek , X , Y ); end; end else if ( Mek^.G = GG_MetaTerrain ) and ( ( Mek^.Stat[ STAT_Lock ] = 0 ) or Destroyed( Mek ) ) then begin { Metaterrain gets ransacked if it's unlocked, } { or wrecked. } if ( NAttValue( Mek^.NA , NAG_Location , NAS_X ) = X ) and ( NAttValue( Mek^.NA , NAG_Location , NAS_Y ) = Y ) then begin it := it + ShakeDown( GB , Mek , X , Y ); end; end; Mek := Mek^.Next; end; Ransack := it; end; Function Handless( Mek: GearPtr ): Boolean; { Return TRUE if Mek either has no hands or can't use its hands } { at the moment (say, because it's transformed into tank mode). } { Return TRUE if Mek has hands and they are in perfect working order. } var Hand: GearPtr; begin Hand := SeekActiveIntrinsic( Mek , GG_Holder , GS_Hand ); if Hand = Nil then Handless := True else Handless := not InGoodModule( Hand ); end; {$IFDEF SDLMODE} Procedure GetItemRedraw; begin QuickCombatDisplay( InfoGB ); DisplayGearInfo( InfoGear , InfoGB ); end; {$ENDIF} Function SelectVisibleItem( GB: GameBoardPtr; PC: GearPtr; X,Y: Integer ): GearPtr; { Attempt to select a visible item from gameboard tile X,Y. } { If more than one item is present, prompt the user for which one } { to pick up. } var N,T: Integer; RPM: RPGMenuPtr; begin { First count the number of items in this spot. } N := NumVisibleItemsAtSpot( GB , X , Y ); { If it's just 0 or 1, then our job is simple... } if N = 0 then begin SelectVisibleItem := Nil; end else if N = 1 then begin SelectVisibleItem := FindVisibleItemAtSpot( GB , X , Y ); { If it's more than one, better create a menu and let the user } { pick one. } end else if N > 1 then begin DialogMsg( MsgString( 'GET_WHICH_ITEM?' ) ); RPM := CreateRPGMenu( MenuItem , MenuSelect , ZONE_Menu ); for t := 1 to N do begin AddRPGMenuItem( RPM , GearName( GetVisibleItemAtSpot( GB , X , Y , T ) ) , T ); end; {$IFDEF SDLMODE} InfoGear := PC; InfoGB := GB; N := SelectMenu( RPM , @GetItemRedraw ); {$ELSE} N := SelectMenu( RPM ); {$ENDIF} DisposeRPGMenu( RPM ); if N > -1 then begin SelectVisibleItem := GetVisibleItemAtSpot( GB , X , Y , N ); end else begin SelectVisibleItem := Nil; end; end; end; Procedure PCGetItem( GB: GameBoardPtr; PC: GearPtr ); { The PC will attempt to pick up something lying on the ground. } var Cash,NID: LongInt; P: Point; item: GearPtr; begin if Handless( PC ) then begin { Start by checking something that other RPGs would } { just assume- does the PC have any hands? } DialogMsg( 'You need hands in order to use this command.' ); end else begin P := GearCurrentLocation( PC ); { Before attempting to get an item, ransack whatever } { fallen enemies lie in this spot. } Cash := Ransack( GB , P.X , P.Y ); { Perform an immediate vision check- without it, items } { freed by the Ransack procedure above will remain unseen. } VisionCheck( GB , PC ); Item := SelectVisibleItem( GB , PC , P.X , P.Y ); if Item <> Nil then begin if IsLegalSlot( PC , Item ) then begin DelinkGear( GB^.Meks , Item ); { Clear the item's location values. } StripNAtt( Item , NAG_Location ); InsertInvCom( PC , Item ); { Clear the home, to prevent wandering items. } SetSAtt( Item^.SA , 'HOME <>' ); DialogMsg( ReplaceHash( MsgString( 'YOU_GET_?' ) , GearName( Item ) ) ); NID := NAttValue( Item^.NA , NAG_Narrative , NAS_NID ); if NID <> 0 then SetTrigger( GB , TRIGGER_GetItem + BStr( NID ) ); end else if Cash = 0 then begin DialogMsg( ReplaceHash( MsgString( 'CANT_GET_?' ) , GearName( Item ) ) ); end; end else if Cash = 0 then begin DialogMSG( 'No item found.' ); end; if Cash > 0 then begin DialogMsg( ReplaceHash( MsgString( 'YouFind$' ) , BStr( Cash ) ) ); AddNAtt( LocatePilot( PC )^.NA , NAG_Experience , NAS_Credits , Cash ); end; { Picking up an item takes time. } WaitAMinute( GB , PC , ReactionTime( PC ) ); end; end; Procedure CreateInvMenu( PC: GearPtr ); { Allocate the Inventory menu and fill it up with the PC's inventory. } begin if InvRPM <> Nil then DisposeRPGMenu( InvRPM ); InvRPM := CreateRPGMenu( MenuItem , MenuSelect , ZONE_InvMenu ); InvRPM^.Mode := RPMNoCleanup; BuildInventoryMenu( InvRPM , PC ); AttachMenuDesc( InvRPM , ZONE_Menu2 ); RPMSortAlpha( InvRPM ); { If the menu is empty, add a message saying so. } If InvRPM^.NumItem < 1 then AddRPGMenuItem( InvRPM , '[no inventory items]' , -1 ) else AlphaKeyMenu( InvRPM ); { Add the menu keys. } AddRPGMenuKey(InvRPM,'/',-2); end; Procedure CreateEqpMenu( PC: GearPtr ); { Allocate the equipment menu and fill it up with the PC's gear. } begin if EqpRPM <> Nil then DisposeRPGMenu( EqpRPM ); EqpRPM := CreateRPGMenu( MenuItem , MenuSelect , ZONE_EqpMenu ); EqpRPM^.Mode := RPMNoCleanup; AttachMenuDesc( EqpRPM , ZONE_Menu2 ); BuildEquipmentMenu( EqpRPM , PC ); { If the menu is empty, add a message saying so. } If EqpRPM^.NumItem < 1 then AddRPGMenuItem( EqpRPM , '[no equipped items]' , -1 ); { Add the menu keys. } AddRPGMenuKey(EqpRPM,'/',-2); end; Procedure UpdateBackpack( PC: GearPtr ); { Redo all the menus, and display them on the screen. } begin CreateInvMenu( PC ); CreateEqpMenu( PC ); {$IFNDEF SDLMODE} DisplayMenu( InvRPM ); DisplayMenu( EqpRPM ); {$ENDIF} end; Procedure GivePartToPC( GB: GameBoardPtr; Part, PC: GearPtr ); { Give the specified part to the PC. If the part cannot be } { held by the PC, store it so that it can be recovered using } { the FieldHQ Wargear Explorer. } var team: Integer; begin if ( PC <> Nil ) and IsLegalSlot( PC , Part ) then begin InsertInvCom( PC , Part ); end else begin { If the PC can't carry this equipment, } { stick it off the map. } team := NattValue( PC^.NA , NAG_Location , NAS_Team ); if team = NAV_LancemateTeam then team := NAV_DefPlayerTeam; SetNAtt( Part^.NA , NAG_Location , NAS_Team , team ); DeployMek( GB , Part , False ); end; end; Procedure UnequipItem( GB: GameBoardPtr; PC , Item: GearPtr ); { Delink ITEM from its parent, and stick it in the general inventory... } { If possible. Otherwise drop it. } begin { First, delink Item from its parent. } DelinkGear( Item^.Parent^.InvCom , Item ); { HOW'D YA LIKE THEM CARROT DOTS, EH!?!? } { Next, link ITEM into the general inventory. } GivePartToPC( GB , Item , PC ); { Unequipping takes time. } if GB <> Nil then WaitAMinute( GB , PC , ReactionTime( PC ) ); end; Procedure UnequipFrontend( GB: GameBoardPtr; PC , Item: GearPtr ); { Simply unequip the provided item. } { PRECOND: PC and ITEM had better be correct, dagnabbit... } begin DialogMsg( 'You unequip ' + GearName( Item ) + '.' ); UnequipItem( GB , PC , Item ); end; Function CanBeExtracted( Item: GearPtr ): Boolean; { Return TRUE if the listed part can be extracted from a mecha, } { or FALSE if it cannot normally be extracted. } begin if ( Item^.G = GG_Support ) or ( Item^.G = GG_Cockpit ) or IsMasterGear( Item ) or ( Item^.Parent = Nil ) or ( Item^.Parent^.Scale = 0 ) or ( Item^.G = GG_Modifier ) then begin CanBeExtracted := False; end else if ( Item^.G = GG_Module ) and ( Item^.S = GS_Body ) then begin CanBeExtracted := False; end else begin CanBeExtracted := True; end; end; Function ExtractItem( GB: GameBoardPtr; TruePC , PC: GearPtr; var Item: GearPtr ): Boolean; { Delink ITEM from its parent, and stick it in the general inventory. } { Note that pulling a gear out of its mecha may well wreck it } { beyond any repair! Therefore, after this call, ITEM might no } { longer exist... i.e. it may equal NIL. } var it: Boolean; SkTarget,SkRoll,WreckTarget: Integer; begin { First, calculate the skill target. } SkTarget := 2 + ComponentComplexity( Item ); if Item^.G = GG_Module then begin WreckTarget := SkTarget + 8 - Item^.V; end else if Item^.Scale < Item^.Parent^.Scale then begin WreckTarget := SkTarget + 5; end else begin WreckTarget := SkTarget + 10 - UnscaledMaxDamage( Item ); end; if WreckTarget < SkTarget then WreckTarget := SkTarget + 1; SkRoll := RollStep( TeamSkill( GB , NAV_DefPlayerTeam , 31 ) ); DoleSkillExperience( TruePC , 31 , 1 ); AddMentalDown( TruePC , 1 ); WaitAMinute( GB , TruePC , ReactionTime( TruePC ) * 5 ); if SkRoll > WreckTarget then begin { First, delink Item from its parent. } DelinkGear( Item^.Parent^.SubCom , Item ); { Stick the part in the general inventory, if legal. } GivePartToPC( GB , Item , PC ); DoleSkillExperience( TruePC , 31 , 2 ); DoleExperience( TruePC , 1 ); it := True; end else if SkRoll > SkTarget then begin RemoveGear( Item^.Parent^.SubCom , Item ); Item := Nil; it := True; end else begin it := False; end; ExtractItem := it; end; Procedure ExtractFrontend( GB: GameBoardPtr; TruePC , PC , Item: GearPtr ); { Simply remove the provided item. } { PRECOND: PC and ITEM had better be correct, dagnabbit... } var name: String; begin name := GearName( Item ); if GearActive( PC ) then begin DialogMsg( MsgString( 'EXTRACT_NOTACTIVE' ) ); end else if ExtractItem( GB , TruePC , PC , Item ) then begin if Item = Nil then begin DialogMsg( ReplaceHash( MsgString( 'EXTRACT_WRECK' ) , name ) ); end else begin DialogMsg( ReplaceHash( MsgString( 'EXTRACT_OK' ) , name ) ); end; end else begin DialogMsg( ReplaceHash( MsgString( 'EXTRACT_FAIL' ) , name ) ); end; end; Procedure EquipItem( GB: GameBoardPtr; PC , Slot , Item: GearPtr ); { This is the real equipping procedure. Stuff ITEM into SLOT. } { As noted in TheRules.txt, any nonmaster gear can only have one } { item of any particular "G" type equipped at a time. So, if } { SLOT already has equipment of type ITEM^.G, unequip that and } { stuff it into PC's general inventory. } var I2,I3: GearPtr; begin { First, check for already equipped items. } I2 := Slot^.InvCom; while I2 <> Nil do begin I3 := I2^.Next; { This next step might delink I2, so... } if I2^.G = Item^.G then begin UnequipItem( GB , PC , I2 ); end; I2 := I3; end; { Next, delink Item from PC. } DelinkGear( PC^.InvCom , Item ); { Next, link ITEM into SLOT. } InsertInvCom( Slot , Item ); { Equipping an item takes time. } if GB <> Nil then WaitAMinute( GB , PC , ReactionTime( PC ) ); end; Procedure EquipItemFrontend( GB: GameBoardPtr; PC , Item: GearPtr ); { Assign ITEM to a legal equipment slot. Move it from the } { general inventory into its new home. } var EI_Menu: RPGMenuPtr; N: Integer; begin { Build the slot selection menu. } EI_Menu := CreateRPGMenu( MenuItem , MenuSelect , ZONE_InvMenu ); BuildSlotMenu( EI_Menu , PC , Item ); if EI_Menu^.NumItem < 1 then AddRPGMenuItem( EI_Menu , '[cannot equip ' + GearName( Item ) + ']' , -1 ); { Select a slot for the item to go into. } {$IFDEF SDLMODE} N := SelectMenu( EI_Menu , @MiscProcRedraw); {$ELSE} N := SelectMenu( EI_Menu ); {$ENDIF} DisposeRPGMenu( EI_Menu ); { If a slot was selected, pass that info on to the workhorse. } if N <> -1 then begin DialogMsg( 'You equip ' + GearName( Item ) + '.' ); EquipItem( GB , PC , LocateGearByNumber( PC , N ) , Item ); end; end; Function InstallItem( GB: GameBoardPtr; TruePC , Slot: GearPtr; var Item: GearPtr ): Boolean; { Attempt the skill rolls needed to install ITEM into the } { requested slot. } var SlotCom,ItemCom,UsedCom: Integer; SkTarget,WreckTarget,SkRoll: Integer; begin { Error Check - no circular references! } if ( FindGearIndex( Item , Slot ) <> -1 ) then Exit( False ); { Also, can't engineer things when you're exhausted. } if CurrentMental( TruePC ) < 1 then Exit( False ); { Can't install into a personal-scale slot. } if Slot^.Scale = 0 then Exit( False ); SlotCom := ComponentComplexity( Slot ); ItemCom := ComponentComplexity( Item ); UsedCom := SubComComplexity( Slot ); case Item^.G of GG_Weapon,GG_MoveSys: SkTarget := 10; GG_Module: SkTarget := 15; GG_Sensor: SkTarget := 30; GG_Modifier: SkTarget := 25; else SkTarget := 20; end; if Item^.Scale < Slot^.Scale then SkTarget := SkTarget div 2; { The WreckTarget is the target number that must be beat } { in order to avoid accidentally destroying the part... } if ( Item^.G = GG_Module ) then begin WreckTarget := 8 - Item^.V; end else if ( UnscaledMaxDamage( Item ) < 1 ) or ( Item^.Scale < Slot^.Scale ) then begin WreckTarget := 7; end else begin WreckTarget := 10 - UnscaledMaxDamage( Item ); end; if WreckTarget < 3 then WreckTarget := 3; { If the SLOT is going to be overstuffed, better raise the } { number of successes and the target number drastically. } if ( ( ItemCom + UsedCom ) > SlotCom ) and ( Not IsMasterGear( Slot ) ) then begin SkTarget := SkTarget + ItemCom + UsedCom - SlotCom + 5; end; WaitAMinute( GB , TruePC , ReactionTime( TruePC ) * 5 ); SkRoll := RollStep( TeamSkill( GB , NAV_DefPlayerTeam , 31 ) ); if SkRoll > SkTarget then begin { Install the item. } DoleSkillExperience( TruePC , 31 , 5 ); DoleExperience( TruePC , 10 ); DelinkGear( Item^.Parent^.InvCom , Item ); InsertSubCom( Slot , Item ); end else if SkRoll < WreckTarget then begin RemoveGear( Item^.Parent^.InvCom , Item ); Item := Nil; end; AddMentalDown( TruePC , 1 ); DoleSkillExperience( TruePC , 31 , 1 ); InstallItem := SkRoll > SkTarget; end; Procedure InstallFrontend( GB: GameBoardPtr; TruePC , PC , Item: GearPtr ); { Assign ITEM to a legal equipment slot. Move it from the } { general inventory into its new home. } var EI_Menu: RPGMenuPtr; N: Integer; name: String; begin { Error check- can't install into an active master. } if GearActive( PC ) then begin DialogMsg( MsgString( 'INSTALL_NOTACTIVE' ) ); Exit; end; { Build the slot selection menu. } EI_Menu := CreateRPGMenu( MenuItem , MenuSelect , ZONE_InvMenu ); BuildSubMenu( EI_Menu , PC , Item , True ); if EI_Menu^.NumItem < 1 then AddRPGMenuItem( EI_Menu , '[cannot install ' + GearName( Item ) + ']' , -1 ); { Select a slot for the item to go into. } DialogMsg( GearName( Item ) + ' cmx:' + BStr( ComponentComplexity( Item ) ) + '. ' + MsgSTring( 'BACKPACK_InstallInfo' ) ); {$IFDEF SDLMODE} N := SelectMenu( EI_Menu , @MiscProcRedraw); {$ELSE} N := SelectMenu( EI_Menu ); {$ENDIF} DisposeRPGMenu( EI_Menu ); { If a slot was selected, pass that info on to the workhorse. } if N <> -1 then begin { Store the name here, since the item might get destroyed } { during the installation process. } name := GearName( Item ); if InstallItem( GB , TruePC , LocateGearByNumber( PC , N ) , Item ) then begin DialogMsg( ReplaceHash( MsgString( 'INSTALL_OK' ) , name ) ); end else begin if Item = Nil then begin DialogMsg( ReplaceHash( MsgString( 'INSTALL_WRECK' ) , name ) ); end else begin DialogMsg( ReplaceHash( MsgString( 'INSTALL_FAIL' ) , name ) ); end; end; end; end; Procedure InstallAmmo( GB: GameBoardPtr; PC , Gun , Ammo: GearPtr ); { Place the ammunition gear into the gun. } var A,A2: GearPtr; begin { To start with, unload any ammo currently in the gun. } A := Gun^.SubCom; while A <> Nil do begin A2 := A^.Next; if A^.G = GG_Ammo then begin DelinkGear( Gun^.SubCom , A ); InsertInvCom( PC , A ); end; A := A2; end; { Delink the magazine from wherever it currently resides. } if IsInvCom( Ammo ) then begin DelinkGear( Ammo^.Parent^.InvCom , Ammo ); end else if IsSubCom( Ammo ) then begin DelinkGear( Ammo^.Parent^.SubCom , Ammo ); end; { Stick the new magazine into the gun. } InsertSubCom( Gun , Ammo ); { Loading a gun takes time. } if GB <> Nil then WaitAMinute( GB , PC , ReactionTime( PC ) ); end; Procedure InstallAmmoFrontend( GB: GameBoardPtr; PC , Item: GearPtr ); { Assign ITEM to a legal projectile weapon. Move it from the } { general inventory into its new home. } var IA_Menu: RPGMenuPtr; Gun: GearPtr; N: Integer; begin { Build the slot selection menu. } IA_Menu := CreateRPGMenu( MenuItem , MenuSelect , ZONE_InvMenu ); BuildSubMenu( IA_Menu , PC , Item , False ); if IA_Menu^.NumItem < 1 then AddRPGMenuItem( IA_Menu , '[no weapon for ' + GearName( Item ) + ']' , -1 ); { Select a slot for the item to go into. } {$IFDEF SDLMODE} N := SelectMenu( IA_Menu , @MiscProcRedraw); {$ELSE} N := SelectMenu( IA_Menu ); {$ENDIF} DisposeRPGMenu( IA_Menu ); { If a slot was selected, pass that info on to the workhorse. } if N <> -1 then begin Gun := LocateGearByNumber( PC , N ); DialogMsg( 'You load ' + GearName( Item ) + ' into ' + GearName( Gun ) + '.' ); InstallAmmo( GB , PC , Gun , Item ); end; end; Procedure DropFrontEnd( PC , Item: GearPtr ); { How to drop an item: Make sure PC is a root-level gear. } { Delink ITEM from its current location. } { Copy PC's location variables to ITEM. } { Install ITEM as the next sibling of PC. } begin { Make sure PC is at root level... } PC := FindRoot( PC ); { Delink ITEM from its parent... } DelinkGear( Item^.Parent^.InvCom , Item ); { Copy the location variables to ITEM... } SetNAtt( Item^.NA , NAG_Location , NAS_X , NAttValue( PC^.NA , NAG_Location , NAS_X ) ); SetNAtt( Item^.NA , NAG_Location , NAS_Y , NAttValue( PC^.NA , NAG_Location , NAS_Y ) ); if not OnTheMap( PC ) then SetNAtt( Item^.NA , NAG_Location , NAS_Team , NAV_DefPlayerTeam ); { Install ITEM as PC's sibling... } Item^.Next := PC^.Next; PC^.Next := Item; { Do display stuff. } DialogMsg( 'You drop ' + GearName( Item ) + '.' ); end; Procedure TradeFrontend( GB: GameBoardPtr; PC , Item, LList: GearPtr ); { Assign ITEM to a different master. Move it from the } { general inventory of PC into its new home. } var TI_Menu: RPGMenuPtr; M: GearPtr; Team,N: Integer; begin if not IsSafeArea( GB ) then begin DialogMsg( MsgSTring( 'TRANSFER_NOTHERE' ) ); Exit; end; { Build the slot selection menu. } TI_Menu := CreateRPGMenu( MenuItem , MenuSelect , ZONE_InvMenu ); N := 1; M := LList; Team := NAttValue( PC^.NA , NAG_Location , NAS_Team ); { This menu should contain all the masters from LList which } { belong to Team 1. } while M <> Nil do begin if ( Team = NAV_DefPlayerTeam ) or ( Team = NAV_LancemateTeam ) then begin if IsMasterGear( M ) and ( ( NAttValue( M^.NA , NAG_Location , NAS_Team ) = NAV_DefPlayerTeam ) or ( NAttValue( M^.NA , NAG_Location , NAS_Team ) = NaV_LancemateTeam ) ) and ( M <> PC ) then begin AddRPGMenuItem( TI_Menu , GearName( M ) , N ); end; end else begin if IsMasterGear( M ) and ( NAttValue( M^.NA , NAG_Location , NAS_Team ) = Team ) and ( M <> PC ) then begin AddRPGMenuItem( TI_Menu , GearName( M ) , N ); end; end; M := M^.Next; Inc( N ); end; AlphaKeyMenu( TI_Menu ); if TI_Menu^.NumItem < 1 then AddRPGMenuItem( TI_Menu , '[cannot trade ' + GearName( Item ) + ']' , -1 ); { Select a slot for the item to go into. } {$IFDEF SDLMODE} N := SelectMenu( TI_Menu , @MiscProcRedraw); {$ELSE} N := SelectMenu( TI_Menu ); {$ENDIF} DisposeRPGMenu( TI_Menu ); { If a slot was selected, pass that info on to the workhorse. } if N <> -1 then begin M := RetrieveGearSib( LList , N ); if IsLegalSlot( M , Item ) then begin DelinkGear( Item^.Parent^.InvCom , Item ); InsertInvCom( M , Item ); DialogMsg( MsgString( 'BACKPACK_ItemTraded' ) ); end else begin DialogMsg( MsgString( 'BACKPACK_NotTraded' ) ); end; end; end; Procedure FHQ_AssociatePilotMek( PC , M , LList: GearPtr ); { Associate the mecha with the pilot. } begin AssociatePilotMek( LList , PC , M ); DialogMsg( ReplaceHash( MsgString( 'FHQ_AssociatePM' ) , GearName( PC ) ) ); end; Procedure FHQ_SelectPilotForMecha( GB: GameBoardPtr; Mek: GearPtr ); { Select a pilot for the mecha in question. } { Pilots must be characters- they must either belong to the default } { player team or, if they're lancemates, they must have a CID. } { This is to prevent the PC from dominating some sewer rats and } { training them to be pilots. } var RPM: RPGMenuPtr; N: Integer; M: GearPtr; begin { Create the menu. } RPM := CreateRPGMenu( MenuItem , MenuSelect , ZONE_Menu ); M := GB^.Meks; N := 1; while M <> Nil do begin if M^.G = GG_Character then begin if ( NAttValue( M^.NA , NAG_Location , NAS_Team ) = NAV_LancemateTeam ) and ( NAttValue( M^.NA , NAG_Personal , NAS_CID ) <> 0 ) then begin AddRPGMenuItem( RPM , GearName( M ) , N ); end else if NAttValue( M^.NA , NAG_Location , NAS_Team ) = NAV_DefPlayerTeam then begin AddRPGMenuItem( RPM , GearName( M ) , N ); end; end; M := M^.Next; Inc( N ); end; RPMSortAlpha( RPM ); AddRPGMenuItem( RPM , MSgString( 'EXIT' ) , -1 ); { Get a selection from the menu. } {$IFDEF SDLMODE} n := SelectMenu( RPM , @PlainRedraw ); {$ELSE} n := SelectMenu( RPM ); {$ENDIF} DisposeRPGMenu( RPM ); if N > 0 then begin M := RetrieveGearSib( GB^.Meks , N ); FHQ_AssociatePilotMek( M , Mek , GB^.Meks ); end; end; Procedure FHQ_SelectMechaForPilot( GB: GameBoardPtr; NPC: GearPtr ); { Select a pilot for the mecha in question. } { Pilots must be characters- they must either belong to the default } { player team or, if they're lancemates, they must have a CID. } { This is to prevent the PC from dominating some sewer rats and } { training them to be pilots. } var RPM: RPGMenuPtr; N: Integer; M: GearPtr; begin {$IFDEF SDLMODE} INFOGear := NPC; INFOGB := GB; {$ENDIF} { Error check- only characters can pilot mecha! Pets can't. } if ( NAttValue( NPC^.NA , NAG_Personal , NAS_CID ) = 0 ) then begin DialogMsg( ReplaceHash( MsgString( 'FHQ_SMFP_NoPets' ) , GearName( NPC ) ) ); Exit; end; { Create the menu. } RPM := CreateRPGMenu( MenuItem , MenuSelect , ZONE_Menu ); M := GB^.Meks; N := 1; while M <> Nil do begin if ( M^.G = GG_Mecha ) and ( NAttValue( M^.NA , NAG_Location , NAS_Team ) = NAV_DefPlayerTeam ) then begin AddRPGMenuItem( RPM , GearName( M ) , N ); end; M := M^.Next; Inc( N ); end; RPMSortAlpha( RPM ); AddRPGMenuItem( RPM , MSgString( 'EXIT' ) , -1 ); { Get a selection from the menu. } {$IFDEF SDLMODE} n := SelectMenu( RPM , @PlainRedraw ); {$ELSE} n := SelectMenu( RPM ); {$ENDIF} DisposeRPGMenu( RPM ); if N > 0 then begin M := RetrieveGearSib( GB^.Meks , N ); FHQ_AssociatePilotMek( NPC , M , GB^.Meks ); end; end; Procedure StartContinuousUseItem( GB: GameBoardPtr; TruePC , Item: GearPtr ); { The PC wants to use this item. Give it a try. } var N: Integer; begin { Find the item's index number. If the item cannot be found } { on the TRUEPC, then this item cannot be used. } N := FindGearIndex( TruePC , Item ); if N > 0 then begin WaitAMinute( GB , TruePC , 1 ); SetNAtt( TruePC^.NA , NAG_Location , NAS_SmartAction , NAV_UseItem ); SetNAtt( TruePC^.NA , NAG_Location , NAS_SmartWeapon , N ); SetNAtt( TruePC^.NA , NAG_Location , NAS_SmartCount , 3 ); { When an item is used in this way, exit the menu. } ForceQuit := True; end else begin DialogMsg( MsgString( 'BACKPACK_CantUse' ) ); end; end; Procedure UseScriptItem( GB: GameBoardPtr; TruePC, Item: GearPtr; T: String ); { This item has a script effect. Exit the backpack and use it. } begin if SAttValue( Item^.SA , T ) <> '' then begin { Announce the intention. } DialogMsg( ReplaceHash( MsgString( 'BACKPACK_Script_' + T ) , GearName( Item ) ) ); { Using items takes time... } WaitAMinute( GB , TruePC , ReactionTime( TruePC ) ); { ...and also exits the backpack. } ForceQuit := True; GFCombatDisplay( GB ); { Finally, trigger the script. } TriggerGearScript( GB , Item , T ); end else begin { Announce the lack of a valid script. } DialogMsg( ReplaceHash( MsgString( 'BACKPACK_CannotUseScript' ) , GearName( Item ) ) ); end; end; Procedure UseSkillOnItem( GB: GameBoardPtr; TruePC, Item: GearPtr ); { The PC will have the option to use a CLUE-type skill on this } { item, maybe to gain some new information, activate an effect, } { or whatever else. } var SkMenu: RPGMenuPtr; T: Integer; msg: String; begin SkMenu := CreateRPGMenu( MenuItem , MenuSelect , ZONE_InvMenu ); { Add the usable skills. } for t := 1 to NumSkill do begin { In order to be usable, it must be a CLUE type skill, } { and the PC must have ranks in it. } if ( SkillMan[ T ].Usage = USAGE_Clue ) and ( TeamHasSkill( GB , NAV_DefPlayerTeam , T ) or HasTalent( TruePC , NAS_JackOfAll ) ) then begin msg := ReplaceHash( MsgString( 'BACKPACK_ClueSkillPrompt' ) , SkillMan[ T ].Name ); msg := ReplaceHash( msg , GearName( Item ) ); AddRPGMenuItem( SkMenu , msg , T ); end; end; RPMSortAlpha( SkMenu ); AddRPGMenuItem( SkMenu , MsgSTring( 'BACKPACK_CancelSkillUse' ) , -1 ); {$IFDEF SDLMODE} InfoGear := TruePC; InfoGB := GB; T := SelectMenu( SkMenu , @MiscProcRedraw); {$ELSE} T := SelectMenu( SkMenu ); {$ENDIF} DisposeRPGMenu( SkMenu ); if T <> -1 then begin UseScriptItem( GB , TruePC , Item , 'CLUE' + BStr( T ) ); end; end; Procedure EatItem( GB: GameBoardPtr; TruePC , Item: GearPtr ); { The PC wants to eat this item. Give it a try. } var effect: String; begin TruePC := LocatePilot( TruePC ); if TruePC = Nil then begin DialogMsg( ReplaceHash( MsgString( 'BACKPACK_CantBeEaten' ) , GearName( Item ) ) ); end else if ( NAttValue( TruePC^.NA , NAG_Condition , NAS_Hunger ) > ( Item^.V div 2 ) ) or ( Item^.V = 0 ) then begin { Show a message. } DialogMsg( ReplaceHash( ReplaceHash( MsgString( 'BACKPACK_YouAreEating' ) , GearName( TruePC ) ) , GearName( Item ) ) ); { Eating takes time... } WaitAMinute( GB , TruePC , ReactionTime( TruePC ) * GearMass( Item ) + 1 ); { ...and also exits the backpack. } ForceQuit := True; { Locate the PC's Character record, then adjust hunger values. } AddNAtt( TruePC^.NA , NAG_Condition , NAS_Hunger , -Item^.V ); AddMoraleDmg( TruePC , -( Item^.Stat[ STAT_MoraleBoost ] * FOOD_MORALE_FACTOR ) ); { Invoke the item's effect, if any. } effect := SAttValue( Item^.SA , 'EFFECT' ); if effect <> '' then begin GFCombatDisplay( GB ); EffectFrontEnd( GB , TruePC , effect , '' ); end; { Destroy the item, if appropriate. } Dec( Item^.Stat[ STAT_FoodQuantity ] ); if Item^.Stat[ STAT_FoodQuantity ] < 1 then begin if IsInvCom( Item ) then begin RemoveGEar( Item^.Parent^.InvCom , Item ); end else if IsSubCom( Item ) then begin RemoveGEar( Item^.Parent^.SubCom , Item ); end; end; end else begin DialogMsg( MsgString( 'BACKPACK_NotHungry' ) ); end; end; Procedure ThisItemWasSelected( GB: GameBoardPtr; var LList: GearPtr; TruePC , PC , Item: GearPtr ); { TruePC is the primary character, who may be doing repairs } { and stuff. } { PC is the current master being examined, which may well be } { a mecha belonging to the TruePC rather than the TruePC itself. } { LList is a list of mecha and other things which may or may not } { belong to the same team as TruePC et al. } { Item is the piece of wargear currently being examined. } var TIWS_Menu: RPGMenuPtr; N: Integer; begin TIWS_Menu := CreateRPGMenu( MenuItem , MenuSelect , ZONE_InvMenu ); if Item^.G = GG_Usable then AddRPGMenuItem( TIWS_Menu , ReplaceHash( MsgString( 'BACKPACK_UseItem' ) , GearName( Item ) ) , -9 ); if Item^.G = GG_Consumable then AddRPGMenuItem( TIWS_Menu , ReplaceHash( MsgString( 'BACKPACK_EatItem' ) , GearName( Item ) ) , -10 ); if SATtValue( Item^.SA , 'USE' ) <> '' then AddRPGMenuItem( TIWS_Menu , ReplaceHash( MsgString( 'BACKPACK_UseItemScript' ) , GearName( Item ) ) , -11 ); if Item^.G = GG_Ammo then AddRPGMenuItem( TIWS_Menu , MsgString( 'BACKPACK_LoadAmmo' ) , -5 ); if IsInvCom( Item ) then begin if Item^.Parent = PC then begin AddRPGMenuItem( TIWS_Menu , 'Equip ' + GearName( Item ) , -2 ); if ( FindMaster( Item ) <> Nil ) and ( FindMaster( Item )^.G = GG_Mecha ) then begin AddRPGMenuItem( TIWS_Menu , MsgString( 'BACKPACK_Install' ) + GearName( Item ) , -8 ); end; end else begin AddRPGMenuItem( TIWS_Menu , 'Unequip ' + GearName( Item ) , -3 ); end; if ( LList <> Nil ) and ( GB <> Nil ) and IsSafeArea( GB ) then AddRPGMenuItem ( TIWS_Menu , MsgString( 'BACKPACK_TradeItem' ) , -6 ); AddRPGMenuItem( TIWS_Menu , MsgString( 'BACKPACK_DropItem' ) , -4 ); end else if ( FindMaster( Item ) <> Nil ) and ( FindMaster( Item )^.G = GG_Mecha ) and CanBeExtracted( Item ) then begin AddRPGMenuItem( TIWS_Menu , MsgString( 'BACKPACK_Remove' ) + GearName( Item ) , -7 ); end; AddRepairOptions( TIWS_Menu , TruePC , Item ); if ( Item^.G = GG_Weapon ) or ( ( Item^.G = GG_Ammo ) and ( Item^.S = GS_Grenade ) ) then begin if NAttValue( Item^.NA , NAG_WeaponModifier , NAS_SafetySwitch ) = 0 then begin AddRPGMenuItem( TIWS_Menu , MsgString( 'BACKPACK_EngageSafety' ) , -12 ); end else begin AddRPGMenuItem( TIWS_Menu , MsgString( 'BACKPACK_DisengageSafety' ) , -12 ); end; end; AddRPGMenuItem( TIWS_Menu , MsgString( 'BACKPACK_UseSkillOnItem' ) , 1 ); AddRPGMenuItem( TIWS_Menu , MsgString( 'BACKPACK_ExitTIWS' ) , -1 ); repeat DisplayGearInfo( Item ); {$IFDEF SDLMODE} InfoGear := Item; InfoGB := GB; N := SelectMenu( TIWS_Menu , @MiscProcRedraw ); {$ELSE} N := SelectMenu( TIWS_Menu ); {$ENDIF} if N > 100 then begin DoFieldRepair( GB , TruePC , Item , RepairSkillIndex[N-100] ); end else begin case N of 1: UseSkillOnItem( GB , TruePC , Item ); -2: EquipItemFrontend( GB , PC , Item ); -3: UnequipFrontEnd( GB , PC , Item ); -4: DropFrontEnd( PC , Item ); -5: InstallAmmoFrontEnd( GB , PC , Item ); -6: TradeFrontEnd( GB , PC, Item , LList ); -7: ExtractFrontEnd( GB , TruePC , PC , Item ); -8: InstallFrontEnd( GB , TruePC , PC , Item ); -9: StartContinuousUseItem( GB , TruePC , Item ); -10: EatItem( GB , PC , Item ); -11: UseScriptItem( GB , TruePC , Item , 'USE' ); -12: SetNAtt( Item^.NA , NAG_WeaponModifier , NAS_SafetySwitch , 1 - NAttValue( Item^.NA , NAG_WeaponModifier , NAS_SafetySwitch ) ); end; end; until ( N < 0 ) or ForceQuit; DisposeRPGMenu( TIWS_Menu ); end; Function DoInvMenu( GB: GameBoardPtr; var LList: GearPtr; PC,M: GearPtr ): Boolean; { Return TRUE if the user selected Quit. } var N: Integer; begin Repeat {$IFDEF SDLMODE} InfoGear := M; InfoGB := GB; N := SelectMenu( INVRPM , @MiscProcRedraw); {$ELSE} N := SelectMenu( InvRPM ); {$ENDIF} { If an item was selected, pass it along to the appropriate } { procedure. } if N > 0 then begin ThisItemWasSelected( GB , LList , PC , M , LocateGearByNumber( M , N ) ); { Restore the display. } UpdateBackpack( M ); DisplayGearInfo( M ); end; until ( N < 0 ) or ForceQuit; {$IFNDEF SDLMODE} DisplayMenu( InvRPM ); {$ENDIF} DoInvMenu := N=-1; end; {$IFDEF SDLMODE} Procedure EqpRedraw; { Show Inventory, select Equipment. } begin QuickCombatDisplay( InfoGB ); DrawBPBorder; DisplayGearInfo( InfoGear , InfoGB ); DisplayMenu( InvRPM , Nil ); NFGameMsg( MsgString( 'BACKPACK_Directions' ) , ZONE_Menu , MenuItem ); end; {$ENDIF} Function DoEqpMenu( GB: GameBoardPtr; var LList: GearPtr; PC,M: GearPtr ): Boolean; { Return TRUE if the user selected Quit. } var N: Integer; begin Repeat {$IFDEF SDLMODE} InfoGear := M; InfoGB := GB; N := SelectMenu( EqpRPM , @EqpRedraw); {$ELSE} N := SelectMenu( EqpRPM ); {$ENDIF} { If an item was selected, pass it along to the appropriate } { procedure. } if N > 0 then begin ThisItemWasSelected( GB , LList , PC , M , LocateGearByNumber( M , N ) ); { Restore the display. } UpdateBackpack( M ); DisplayGearInfo( M ); end; until ( N < 0 ) or ForceQuit; {$IFNDEF SDLMODE} DisplayMenu( EqpRPM ); {$ENDIF} DoEqpMenu := N=-1; end; Procedure RealBackpack( GB: GameBoardPtr; var LList: GearPtr; PC,M: GearPtr; StartWithInv: Boolean ); { This is the backpack routine which should allow the player to go } { through all the stuff in his/her inventory, equip items, drop them, } { reload weapons, and whatnot. It is based roughly upon the procedures } { from DeadCold. } var QuitBP: Boolean; begin { Set up the display. } DrawBPBorder; ForceQuit := False; { Initialize menus to NIL, then create them. } InvRPM := Nil; EqpRPM := Nil; UpdateBackpack( M ); repeat {$IFNDEF SDLMODE} GameMsg( MsgString( 'BACKPACK_Directions' ) , ZONE_Menu , MenuItem ); {$ENDIF} if StartWithInv then begin QuitBP := DoInvMenu( GB , LList , PC , M ); end else begin QuitBP := DoEqpMenu( GB , LList , PC , M ); end; { If we have not been ordered to exit the loop, we must } { have been ordered to switch menus. } StartWithInv := Not StartWithInv; until QuitBP or ForceQuit; DisposeRPGMenu( InvRPM ); DisposeRPGMenu( EqpRPM ); end; Procedure LancemateBackpack( GB: GameBoardPtr; PC,NPC: GearPtr ); { This is a header for the REALBACKPACK function. } begin RealBackPack( GB , GB^.Meks , PC , NPC , True ); end; Procedure BackpackMenu( GB: GameBoardPtr; PC: GearPtr; StartWithInv: Boolean ); { This is a header for the REALBACKPACK function. } begin RealBackPack( GB , GB^.Meks , PC , PC , StartWithInv ); end; {$IFDEF SDLMODE} Procedure MPERedraw; { Show Inventory, select Equipment. } begin QuickCombatDisplay( InfoGB ); DrawBPBorder; NFGameMsg( FullGearName( INFOGear ) + ' ' + MechaDescription( InfoGear) , ZONE_EqpMenu , InfoGreen ); DisplayGearInfo( InfoGear ); end; {$ENDIF} Procedure MechaPartEditor( GB: GameBoardPtr; var LList: GearPtr; PC,Mek: GearPtr ); { This procedure may be used to browse through all the various } { bits of a mecha and examine each one individually. } var RPM: RPGMenuPtr; N,I: Integer; begin { Set up the display. } DrawBPBorder; I := 0; Repeat RPM := CreateRPGMenu( MenuItem , MenuSelect , ZONE_InvMenu ); BuildGearMenu( RPM , Mek ); if I > 0 then SetItemByPosition( RPM , I ); AddRPGMenuItem( RPM , 'Exit Editor' , -1 ); {$IFNDEF SDLMODE} GameMsg( FullGearName( Mek ) + ' ' + MechaDescription( Mek ) , ZONE_EqpMenu , InfoGreen ); {$ENDIF} DisplayGearInfo( Mek ); {$IFDEF SDLMODE} InfoGear := Mek; InfoGB := GB; N := SelectMenu( RPM , @MPERedraw); {$ELSE} N := SelectMenu( RPM ); {$ENDIF} I := RPM^.SelectItem; DisposeRPGMenu( RPM ); if N > -1 then begin ThisItemWasSelected( GB , LList , PC , Mek , LocateGearByNumber( Mek , N ) ); end; until N = -1; end; {$IFDEF SDLMODE} Procedure PartBrowserRedraw; { Redraw the screen for the part browser. } begin if MPB_Redraw <> Nil then MPB_Redraw; if MPB_Gear <> Nil then DisplayGearInfo( MPB_Gear ); end; Procedure MechaPartBrowser( Mek: GearPtr; RDP: RedrawProcedureType ); {$ELSE} Procedure MechaPartBrowser( Mek: GearPtr ); {$ENDIF} { This procedure may be used to browse through all the various } { bits of a mecha and examine each one individually. } var RPM: RPGMenuPtr; N: Integer; begin {$IFDEF SDLMODE} MPB_Redraw := RDP; MPB_Gear := Mek; {$ENDIF} RPM := CreateRPGMenu( MenuItem , MenuSelect , ZONE_Menu ); BuildGearMenu( RPM , Mek ); AddRPGMenuItem( RPM , 'Exit Browser' , -1 ); Repeat {$IFDEF SDLMODE} N := SelectMenu( RPM , @PartBrowserRedraw ); {$ELSE} DisplayGearInfo( Mek ); N := SelectMenu( RPM ); {$ENDIF} if N > -1 then begin {$IFDEF SDLMODE} MPB_Gear := LocateGearByNumber( Mek , N ); {$ELSE} DisplayGearInfo( LocateGearByNumber( Mek , N ) ); EndOFGameMoreKey; {$ENDIF} end; until N = -1; DisposeRPGMenu( RPM ); end; {$IFDEF SDLMODE} Procedure FHQRedraw; begin if InfoGB <> Nil then QuickCombatDisplay( InfoGB ); DisplayGearInfo( InfoGear ); end; {$ENDIF} Procedure FHQ_Transfer( var LList: GearPtr; PC,Item: GearPtr ); { An item has been selected. Allow it to be transferred to } { one of the team's master gears. } var RPM: RPGMenuPtr; M: GearPtr; N,Team: Integer; begin { Show the item's stats. } DisplayGearInfo( Item ); { Create the menu. } RPM := CreateRPGMenu( MenuItem, MenuSelect, ZONE_Menu ); M := LList; N := 1; Team := NAttValue( PC^.NA , NAG_LOcation , NAS_Team ); while M <> Nil do begin if ( ( NAttValue( M^.NA , NAG_LOcation , NAS_Team ) = Team ) or ( NAttValue( M^.NA , NAG_LOcation , NAS_Team ) = NAV_LancemateTeam ) ) and IsMasterGear( M ) and IsLegalSlot( M , Item ) then begin AddRPGMenuItem( RPM , GearName( M ) , N ); end; M := M^.Next; Inc( N ); end; { Sort the menu, then add an exit option. } RPMSortAlpha( RPM ); AddRPGMenuItem( RPM , MsgString( 'FHQ_ReturnToMain' ) , -1 ); { Get a menu selection, then exit the menu. } DialogMSG( MsgString( 'FHQ_SelectDestination' ) ); {$IFDEF SDLMODE} InfoGear := Item; N := SelectMenu( RPM , @FHQRedraw ); {$ELSE} N := SelectMenu( RPM ); {$ENDIF} DisposeRPGMenu( RPM ); if N > -1 then begin M := RetrieveGearSib( LList , N ); DelinkGear( LList , Item ); InsertInvCom( M , Item ); DialogMSG( MsgString( 'FHQ_ItemMoved' ) ); end else begin DialogMSG( MsgString( 'Cancelled' ) ); end; end; Procedure Rename_Mecha( GB: GameBoardPtr; NPC: GearPtr ); { Enter a new name for NPC. } var name: String; begin {$IFDEF SDLMODE} name := GetStringFromUser( ReplaceHash( MsgString( 'FHQ_Rename_Prompt' ) , GearName( NPC ) ) , @FHQRedraw ); {$ELSE} name := GetStringFromUser( ReplaceHash( MsgString( 'FHQ_Rename_Prompt' ) , GearName( NPC ) ) ); GFCombatDisplay( GB ); {$ENDIF} if name <> '' then SetSAtt( NPC^.SA , 'name <' + name + '>' ); end; Procedure FHQ_ThisWargearWasSelected( GB: GameBoardPtr; var LList: GearPtr; PC,M: GearPtr ); { A mecha has been selected by the PC from the FHQ main menu. } { Offer up all the different choices of things the PC can } { do with mecha - select pilot, repair, check inventory, etc. } var RPM: RPGMenuPtr; N: Integer; begin repeat { Show the mecha's stats. } DisplayGearInfo( M ); { Create the FHQ menu. } RPM := CreateRPGMenu( MenuItem, MenuSelect, ZONE_Menu ); RPM^.Mode := RPMNoCleanup; if IsMasterGear( M ) then begin if IsSafeArea( GB ) or OnTheMap( M ) then AddRPGMenuItem( RPM , MsgString( 'FHQ_GoBackpack' ) , 1 ); end else if IsSafeArea( GB ) then begin AddRPGMenuItem( RPM , MsgString( 'FHQ_Transfer' ) , -3 ); end; if IsSafeArea( GB ) then AddRepairOptions( RPM , PC , M ); if M^.G = GG_Mecha then begin AddRPGMenuItem( RPM , MsgString( 'FHQ_SelectMecha' ) , 2 ); AddRPGMenuItem( RPM , MsgString( 'FHQ_Rename' ) , 6 ); end; if IsSafeArea( GB ) then AddRPGMenuItem( RPM , MsgString( 'FHQ_PartEditor' ) , 4 ); {$IFDEF SDLMODE} if M^.G = GG_Mecha then AddRPGMenuItem( RPM , MsgString( 'FHQ_EditColor' ) , 5 ); {$ENDIF} AddRPGMenuItem( RPM , MsgString( 'FHQ_ReturnToMain' ) , -1 ); { Get a selection from the menu, then dispose of it. } {$IFDEF SDLMODE} InfoGB := GB; infoGear := M; N := SelectMenu( RPM , @FHQRedraw ); {$ELSE} N := SelectMenu( RPM ); {$ENDIF} DisposeRPGMenu( RPM ); if N > 100 then begin { A repair option must have been selected. } DoFieldRepair( GB , PC , M , RepairSkillIndex[N-100] ); end else begin case N of 1: RealBackpack( GB , LList , PC , M , False ); 2: FHQ_SelectPilotForMecha( GB , M ); -3: FHQ_Transfer( LList , PC , M ); 4: MechaPartEditor( GB , LList , PC , M ); {$IFDEF SDLMODE} 5: SelectColors( M , @FHQRedraw ); {$ENDIF} 6: Rename_Mecha( GB , M ); end; end; until N < 0; {$IFDEF SDLMODE} CleanSpriteList; {$ENDIF} GFCombatDisplay( GB ); end; end. GearHead/ghmodule.pp0000644000175000017500000003100310334666446013332 0ustar kaolkaolunit ghmodule; {This unit holds modules- arms, legs, pods... body} {parts, basically. Both mecha and living creatures} {use the same module descriptions.} { GearHead: Arena, a roguelike mecha CRPG Copyright (C) 2005 Joseph Hewitt This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. The full text of the LGPL can be found in license.txt. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } interface uses gears,ghmecha; Type ModuleDesc = Record name: String; MHP: Byte; {Module Hit Points} end; Const NumModule = 8; GS_Body = 1; GS_Head = 2; GS_Arm = 3; GS_Leg = 4; GS_Wing = 5; GS_Tail = 6; GS_Turret = 7; GS_Storage = 8; STAT_Armor = 1; { This array tells which modules are usable by which forms. } { Some systems ( movers, sensors, cockpits ) will function no matter where they are mounted. } { Others ( weapons, shields, hands ) will not function if placed in a bad module. } FORMxMODULE: Array [0..NumForm-1, 1..NumModule] of Boolean = ( { Body Head Arm Leg Wing Tail Turret Storage } {Battroid} ( True, True, True, True, True, True, False, True ), {Zoanoid} ( True, True, False, True, True, True, False, True ), {GroundHugger} ( True, False, False, False, False, False, True, True ), {Arachnoid} ( True, True, False, True, False, True, True, True ), {AeroFighter} ( True, False, False, False, True, False, False, True ), {Ornithoid} ( True, True, False, True, True, True, False, True ), {Gerwalk} ( True, True, True, True, True, True, False, True ), {HoverFighter} ( True, False, False, False, True, False, True, True ), {GroundCar} ( True, False, False, False, False, False, True, True ) ); { MODULE HIT POINT DEFINITIONS } {All these definitions are based on the module's size.} MHP_NoHP = 0; {Used for storage pods. All dmg passed on to SubMods.} MHP_HalfSize = 4; { HP = ( Size + 1 ) div 2 } MHP_EqualSize = 1; { HP = Size } MHP_SizePlusOne = 2; { HP = Size + 1 } MHP_SizeTimesTwo = 3; { HP = Size * 2 } CModule: Array [1..NumModule] of ModuleDesc = ( ( name: 'Body'; MHP: MHP_SizeTimesTwo; ), ( name: 'Head'; MHP: MHP_HalfSize; ), ( name: 'Arm'; MHP: MHP_EqualSize; ), ( name: 'Leg'; MHP: MHP_SizePlusOne; ), ( name: 'Wing'; MHP: MHP_HalfSize; ), ( name: 'Tail'; MHP: MHP_EqualSize; ), ( name: 'Turret'; MHP: MHP_HalfSize; ), ( name: 'Storage'; MHP: MHP_NoHP; ) ); { MODIFIER GEAR } { G = GG_Modifier } { S = Modification Type } { V = Cybernetic Trauma Value } GS_StatModifier = 1; GS_SkillModifier = 2; { Only one gear with a given 'cyberslot' type should be installed } { at any given time. Attempting to install another should result } { in the first being deleted. } { Without a cyberslot, the modifier won't interfere with other } { modifier gears at all. } { Sample slot names: EYE, EAR, MUSCULAR, SKELETON, HEART, etc. } SATT_CyberSlot = 'CYBERSLOT'; STAT_SkillToModify = 1; STAT_SkillModBonus = 2; Function LookupModuleCode(const name_in: String): Integer; Procedure InitModule(Part: GearPtr); Function ModuleBaseDamage(Part: GearPtr): Integer; Function ModuleComplexity( Part: GearPtr ): Integer; Function ModuleName(Part: GearPtr): String; Function ModuleBaseMass(Part: GearPtr): Integer; Procedure CheckModuleRange( Part: GearPtr ); Function IsLegalModuleInv( Slot, Equip: GearPtr ): Boolean; Function IsLegalModuleSub( Slot, Equip: GearPtr ): Boolean; Function ModifierCost( Part: GearPtr ): LongInt; Procedure CheckModifierRange( Part: GearPtr ); implementation uses ghholder,texutil; Function LookupModuleCode(const name_In: String): Integer; {Locate the module code which corresponds to the name} {provided. If no such module type exists return a -1.} var T,M: Integer; Name: String; begin M := -1; {Set the NAME to upper case.} Name := UpCase(Name_In); for t := 1 to NumModule do begin if UpCase(CModule[T].Name) = Name then M := T; end; LookupModuleCode := M; end; Procedure InitModule(Part: GearPtr); {PART is a newly created module record.} {Initialize its stuff.} begin { Modules inherit GearOps/Material from their parent. } if Part^.Parent <> Nil then begin SetNAtt( Part^.NA , NAG_GearOps , NAS_Material , NAttValue( Part^.Parent^.NA , NAG_GearOps , NAS_Material ) ); end; end; Function ModuleBaseDamage(Part: GearPtr): Integer; {For module PART, calculate the unscaled amount of} {damage that it can take before being destroyed.} var it: Integer; begin {Error check - make sure we actually have a Module.} if Part = Nil then Exit(0); if Part^.G <> GG_Module then Exit(0); if (Part^.S < 1) or (Part^.S > NumModule) then Exit(0); Case CModule[Part^.S].MHP of MHP_NoHP: it := -1; MHP_HalfSize: it := ( Part^.V + 1 ) div 2; MHP_EqualSize: it := Part^.V; MHP_SizePlusOne: it := Part^.V + 1; MHP_SizeTimesTwo: it := Part^.V * 2; else it := 0; end; ModuleBaseDamage := it; end; Function ModuleComplexity( Part: GearPtr ): Integer; { Return the complexity value for this part. } begin if ( Part^.S = GS_Body ) or ( Part^.S = GS_Storage ) then begin ModuleComplexity := ( Part^.V + 1 ) * 2; end else begin ModuleComplexity := Part^.V + 1; end; end; Function ModuleName(Part: GearPtr): String; {Determine the geneic name for this particular module.} begin {Eliminate all error cases first off...} if (Part = Nil) or (Part^.G <> GG_Module) or (Part^.S < 1) or (Part^.S > NumModule) then Exit('Unknown'); ModuleName := CModule[Part^.S].Name; end; Function ModuleBaseMass(Part: GearPtr): Integer; {For module PART, calculate the unscaled mass.} var it: Integer; begin {Error check - make sure we actually have a Module.} if Part = Nil then Exit(0); if Part^.G <> GG_Module then Exit(0); if (Part^.S < 1) or (Part^.S > NumModule) then Exit(0); Case CModule[Part^.S].MHP of MHP_NoHP: it := 0; MHP_EqualSize,MHP_Halfsize: it := Part^.V; MHP_SizePlusOne: it := Part^.V + 1; MHP_SizeTimesTwo: it := Part^.V * 2; else it := 0; end; {Armor also adds weight to a module.} it := it + Part^.Stat[ STAT_Armor ]; ModuleBaseMass := it; end; Procedure CheckModuleRange( Part: GearPtr ); { Check a MODULE gear to make sure all values are within appropriate } { range. } var InAMek: Boolean; T: Integer; begin { Check S - Module Type } if Part^.S < 1 then Part^.S := GS_Storage else if Part^.S > NumModule then Part^.S := GS_Storage; if ( Part^.Parent = Nil ) then InAMek := False else if Part^.Parent^.G = GG_Mecha then InAMek := True else InAMek := False; { Check V - Module Size } { If this module is installed in a Mecha, there'll be a } { limit on its size. } if InAMek then begin if Part^.S = GS_Body then Part^.V := Part^.Parent^.V else if Part^.V > ( Part^.Parent^.V + 1 ) then Part^.V := ( Part^.Parent^.V + 1 ); end; if Part^.V > 10 then Part^.V := 10; { Check Stats } { Stat 1 - Armor } if Part^.Stat[1] < 0 then Part^.Stat[1] := 0 else if InAMek then begin { Armor rating may not exceed the size of the mecha. } if Part^.Stat[1] > Part^.Parent^.V then Part^.Stat[1] := Part^.Parent^.V; end else begin if Part^.Stat[1] > 10 then Part^.Stat[1] := 10; end; for t := 2 to NumGearStats do Part^.Stat[ T ] := 0; end; Function IsLegalModuleInv( Slot, Equip: GearPtr ): Boolean; { Check EQUIP to see if it can be stored in SLOT. } { INPUTS: Slot and Equip must both be properly allocated gears. } { See therules.txt for a list of acceptable equipment. } var it: Boolean; begin if Slot^.S = GS_Arm then begin Case Equip^.G of GG_ExArmor: begin it := Slot^.S = Equip^.S; end; GG_Shield: it := true; else it := False; end; end else if Slot^.S = GS_Tail then begin Case Equip^.G of GG_ExArmor: begin it := Slot^.S = Equip^.S; end; GG_Shield: it := true; else it := False; end; end else begin Case Equip^.G of GG_ExArmor: begin it := Slot^.S = Equip^.S; end; else it := False; end; end; { If the item is of a different scale than the holder, } { it can't be held. } if Equip^.Scale <> Slot^.Scale then it := False; IsLegalModuleInv := it; end; Function IsLegalModuleSub( Slot, Equip: GearPtr ): Boolean; { Return TRUE if EQUIP can be installed in SLOT, } { FALSE otherwise. } begin if Slot^.S = GS_Body then begin case Equip^.G of GG_Cockpit: IsLegalModuleSub := True; GG_Weapon: IsLegalModuleSub := True; GG_MoveSys: IsLegalModuleSub := True; GG_Holder: begin if Equip^.S = GS_Hand then IsLegalModuleSub := False else IsLegalModuleSub := True; end; GG_Sensor: IsLegalModuleSub := True; GG_Electronics: IsLegalModuleSub := True; GG_Support: IsLegalModuleSub := True; else IsLegalModuleSub := False end; end else begin case Equip^.G of GG_Cockpit: IsLegalModuleSub := True; GG_Weapon: IsLegalModuleSub := True; GG_MoveSys: IsLegalModuleSub := True; GG_Holder: begin if ( Equip^.S = GS_Hand ) and ( Slot^.S <> GS_Arm ) then IsLegalModuleSub := False else IsLegalModuleSub := True; end; GG_Sensor: IsLegalModuleSub := True; GG_Electronics: IsLegalModuleSub := True; else IsLegalModuleSub := False end; end; end; Function ModifierCost( Part: GearPtr ): LongInt; { The cost of a modifier part will depend upon how many +s it } { gives versus how many -s it imparts. } const BasePrice: Array [1..5] of Byte = (10,25,45,70,100); PriceFactor = 2000; var plusses,minuses,T: Integer; it: LongInt; begin { Initialize our counters. } plusses := 0; minuses := 0; { Count up the plusses and minuses. } if Part^.S = GS_StatModifier then begin for t := 1 to NumGearStats do begin if Part^.Stat[ T ] > 0 then begin plusses := plusses + Part^.Stat[ T ]; end else if Part^.Stat[ T ] < 0 then begin minuses := minuses - Part^.Stat[ T ]; end; end; end else if Part^.S = GS_SkillModifier then begin Plusses := Part^.Stat[ STAT_SkillModBonus ]; end; it := 0; if Plusses > 5 then begin it := it + ( PriceFactor * 50 * ( Plusses - 5 ) ); Plusses := 5; end; if Plusses > 0 then begin it := BasePrice[ Plusses ] * PriceFactor + it; end; if Minuses > 0 then begin it := it - PriceFactor * 5 * Minuses; end else begin { If no minuses, a 50% increase in price. } it := ( it * 3 ) div 2; end; { Reduce cost by the trauma value of the system. } if AStringHasBString( SAttValue( Part^.SA , 'TYPE' ) , 'CHARA' ) then begin it := ( it * ( 100 - Part^.V ) ) div 100; end else begin { Non-character modifiers are considerably cheaper. } it := it div 2; end; { Reduce cost for a non-combat skillmodifier. } if ( Part^.S = GS_SkillModifier ) and ( Part^.Stat[ STAT_SkillToModify ] > 10 ) then it := it div 2; { Make sure the cost doesn't fall below the minimum value. } if it < PriceFactor then it := PriceFactor; { Return the calculated value. } ModifierCost := it; end; Procedure CheckModifierRange( Part: GearPtr ); { Make sure that this modification gear is within the accepted } { range bands. } var T: Integer; begin { S = Modifier Type, must be 1 or 2. } if Part^.S < 1 then Part^.S := 1 else if Part^.S > 2 then Part^.S := 2; { V = Trauma Value, may be from 0 to 80 } if Part^.V < 0 then Part^.V := 0 else if Part^.V > 100 then Part^.V := 80; { Scale - Must be 0! } if Part^.Scale <> 0 then Part^.Scale := 0; { Check the stats for range. } if Part^.S = GS_StatModifier then begin for t := 1 to NumGearStats do begin if Part^.Stat[ T ] > 10 then Part^.Stat[ T ] := 10 else if Part^.Stat[ T ] < -5 then Part^.Stat[ T ] := -5; end; end else if Part^.S = GS_SkillModifier then begin if Part^.Stat[ 2 ] < 1 then Part^.Stat[ 2 ] := 1 else if Part^.Stat[ 2 ] > 10 then Part^.Stat[ 2 ] := 10; end; end; end. GearHead/sdlmenus.pp0000644000175000017500000005564410334666224013373 0ustar kaolkaolunit sdlmenus; {$MODE FPC} { BUGS - If SelectMenu is handed an empty menu, all heck will } { break loose. This can be a particular problem for SelectFile. } { GearHead: Arena, a roguelike mecha CRPG Copyright (C) 2005 Joseph Hewitt This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. The full text of the LGPL can be found in license.txt. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } interface {$IFDEF PLUSGL} uses SDL,SDL_TTF,dos,glgfx,texutil,ui4gh; {$ELSE} uses SDL,SDL_TTF,dos,sdlgfx,texutil,ui4gh; {$ENDIF} const {These two constants are used to tell the SELECT procedure whether or not} {the user is allowed to cancel.} RPMNormal = 0; RPMNoCancel = 1; RPMNoCleanup = 2; {If you want the menu left on the screen after we've finished, use this.} type RPGMenuKeyPtr = ^RPGMenuKey; RPGMenuKey = Record k: Char; value: integer; {The value returned when this key is pressed.} next: RPGMenuKeyPtr; end; RPGMenuItemPtr = ^RPGMenuItem; RPGMenuItem = Record msg: string; {The text which appears in the menu} value: integer; {A value, returned by SelectMenu. -1 is reserved for Cancel} desc: string; {Pointer to the item description. If Nil, no desc.} next: RPGMenuItemPtr; end; RPGMenu = Record active: boolean; itemcolor,selcolor,dtexcolor: TSDL_Color; Menu_Zone,Desc_Zone: TSDL_Rect; mode: Byte; topitem,selectitem,numitem: integer; {fields holding info about the status of the menu.} FirstItem: RPGMenuItemPtr; FirstKey: RPGMenuKeyPtr; end; RPGMenuPtr = ^RPGMenu; Function AddRPGMenuItem(var RPM: RPGMenuPtr; const msg: string; value: integer; const desc: string): RPGMenuItemPtr; Function AddRPGMenuItem(var RPM: RPGMenuPtr; const msg: string; value: integer): RPGMenuItemPtr; Procedure DisposeRPGMenuItem( var LList: RPGMenuItemPtr ); Procedure ClearMenu( RPM: RPGMenuPtr ); Procedure RemoveRPGMenuItem(RPM: RPGMenuPtr; var LMember: RPGMenuItemPtr); Procedure AddRPGMenuKey(RPM: RPGMenuPtr; k: Char; value: Integer); Function CreateRPGMenu(icolor,scolor: TSDL_Color; Z: TSDL_Rect): RPGMenuPtr; Procedure AttachMenuDesc( RPM: RPGMenuPtr; Z: TSDL_Rect ); Procedure DisposeRPGMenu(var RPM: RPGMenuPtr); Procedure DisplayMenu( RPM: RPGMenuPtr; ReDrawer: RedrawProcedureType ); Function RPMLocateByPosition(RPM: RPGMenuPtr; i: integer): RPGMenuItemPtr; Function SelectMenu( RPM: RPGMenuPtr; ReDrawer: RedrawProcedureType ): integer; Procedure RPMSortAlpha(RPM: RPGMenuPtr); Function SetItemByValue( RPM: RPGMenuPtr ; V: Integer ): RPGMenuItemPtr; Procedure SetItemByPosition( RPM: RPGMenuPtr ; N: Integer ); Procedure BuildFileMenu( RPM: RPGMenuPtr; const SearchPattern: String ); Function SelectFile( RPM: RPGMenuPtr; ReDrawer: RedrawProcedureType ): String; implementation Function LastMenuItem(MIList: RPGMenuItemPtr): RPGMenuItemPtr; {This procedure will find the last item in the linked list.} begin {While the menu item is pointing to a next menu item, it's not the last. duh.} {So, move through the list until we hit a Nil pointer.} while MIList^.next <> Nil do begin {Check the next one.} MIList := MIList^.next; end; {We've found a MI.next = Nil. Yay! Return its address.} LastMenuItem := MIList; end; Function AddRPGMenuItem(var RPM: RPGMenuPtr; const msg: string; value: integer; const desc: string): RPGMenuItemPtr; {This procedure will add an item to the RPGToolMenu.} {The new item will be added as the last item in the list.} var it: ^RPGMenuItem; {Here's a pointer for the item we're creating.} temp: RPGMenuItemPtr; begin {Allocate memory for it.} New(it); {Check to make sure that the allocation succeeded.} if it = Nil then begin exit( Nil ); end; {Initialize it to the correct values.} it^.msg := msg; it^.value := value; it^.next := Nil; it^.desc := desc; {The desc field is assigned the value of PChar since it} {is assumed that we arent responsible for the allocation,} {disposal, or contents of this string.} {Locate the last item in the list, then assign "it" to it.} {If the list is currently empty, stick "it" in as the first item.} if RPM^.firstitem = Nil then begin RPM^.firstitem := it; end else begin temp := LastMenuItem(RPM^.FirstItem); temp^.next := it; end; {Increment the NumItem field.} Inc(RPM^.numitem); AddRPGMenuItem := it; end; Function AddRPGMenuItem(var RPM: RPGMenuPtr; const msg: string; value: integer): RPGMenuItemPtr; { Just like the above, but no desc. } begin AddRPGMenuItem := AddRPGMenuItem( RPM , msg , value , '' ); end; Procedure DisposeRPGMenuItem( var LList: RPGMenuItemPtr ); { Get rid of this list of items. } { WARNING - If you call this procedure for a menu, it will not } { change the value of the NumItems field!!! This will cause } { problems when trying to use the menu. Unless you know exactly } { what you're doing, use the ClearMenu procedure instead. } var NextItem: RPGMenuItemPtr; begin while LList <> Nil do begin NextItem := LList^.Next; Dispose( LList ); LList := NextItem; end; end; Procedure ClearMenu( RPM: RPGMenuPtr ); { Deallocate all the items in this menu, and set the number of } { items to 0. } begin DisposeRPGMenuItem( RPM^.FirstItem ); RPM^.NumItem := 0; RPM^.SelectItem := 1; RPM^.topitem := 1; end; Procedure RemoveRPGMenuItem(RPM: RPGMenuPtr; var LMember: RPGMenuItemPtr); {Locate and extract member LMember from list LList.} {Then, dispose of LMember.} var a,b: RPGMenuItemPtr; begin {Initialize A and B} B := RPM^.FirstItem; A := Nil; {Locate LMember in the list. A will thereafter be either Nil,} {if LMember if first in the list, or it will be equal to the} {element directly preceding LMember.} while (B <> LMember) and (B <> Nil) do begin A := B; B := B^.next; end; if B = Nil then begin {Major FUBAR. The member we were trying to remove can't} {be found in the list.} writeln('ERROR- RemoveLink asked to remove a link that doesnt exist.'); end else if A = Nil then begin {There's no element before the one we want to remove,} {i.e. it's the first one in the list.} RPM^.FirstItem := B^.Next; Dispose(B); end else begin {We found the attribute we want to delete and have another} {one standing before it in line. Go to work.} A^.next := B^.next; Dispose(B); end; { Reduce the number of items in the menu. } Dec(RPM^.NumItem); end; Procedure AddRPGMenuKey(RPM: RPGMenuPtr; k: Char; value: Integer); {Add a dynamically defined RPGMenuKey to the menu.} var it: RPGMenuKeyPtr; begin New(it); if it = Nil then begin exit; end; {Initialize the values.} it^.k := k; it^.value := value; it^.next := RPM^.FirstKey; RPM^.FirstKey := it; end; Function CreateRPGMenu(icolor,scolor: TSDL_Color; Z: TSDL_Rect): RPGMenuPtr; {This function creates a new RPGMenu record, and returns the address.} var it: ^RPGMenu; {Here's a pointer for the menu we're making.} begin {Allocate memory for it.} New(it); {Check to make sure that we've actually initialized something.} if it = Nil then exit( Nil ); {Initialize the elements of the record.} it^.itemcolor := icolor; it^.selcolor := scolor; it^.Menu_Zone := Z; it^.Desc_Zone.W := 0; {A width value of 0 means there is no desc window.} it^.Mode := RPMNormal; it^.FirstItem := Nil; it^.FirstKey := Nil; it^.dtexcolor := icolor; it^.active := False; {TopItem refers to the highest item on the screen display.} it^.topitem := 1; {SelectItem refers to the item currently being pointed at by the selector.} it^.selectitem := 1; {NumItem refers to the total number of items currently in the linked list.} it^.numitem := 0; {Return the address.} CreateRPGMenu := it; end; Procedure AttachMenuDesc( RPM: RPGMenuPtr; Z: TSDL_Rect ); { Set the area for description items to zone Z. } begin RPM^.Desc_Zone := Z; end; Procedure DisposeRPGMenu(var RPM: RPGMenuPtr); {This procedure is called when you want to get rid of the menu. It will deallocate} {the memory for the RPGMenu record and also for all of the linked RPGMenuItems.} var c,d: RPGMenuKeyPtr; begin {Check to make sure that we've got a valid pointer here.} if RPM = Nil then begin exit; end; {Save the location of the first menu item...} DisposeRPGMenuItem( RPM^.FirstItem ); c := RPM^.FirstKey; {... then get rid of the menu record.} Dispose(RPM); RPM := Nil; {Keep processing the menu items until we hit a Nil nextitem.} while c <> Nil do begin d := c^.next; Dispose(c); c := d; end; end; Function RPMLocateByPosition(RPM: RPGMenuPtr; i: integer): RPGMenuItemPtr; {Locate the i'th element of the item list, then return its address.} var a: RPGMenuItemPtr; {Our pointer} t: integer; {Our counter} begin {Error check, first off.} if i > RPM^.numitem then begin exit( Nil ); end; a := RPM^.FirstItem; t := 1; if i > 1 then begin for t := 2 to i do a := a^.next; end; RPMLocateByPosition := a; end; Function MenuHeight( RPM: RPGMenuPtr ): Integer; { Return the height of the menu, in text rows. } var MH: Integer; begin MH := ( RPM^.Menu_Zone.h div TTF_FontLineSkip( game_font ) ); if MH < 1 then MH := 1; MenuHeight := MH; end; Procedure RPMRefreshDesc(RPM: RPGMenuPtr); {Refresh the menu description box, if appropriate.} begin {Check to make sure that this menu has a description box, first off.} if RPM^.Desc_Zone.W > 0 then begin NFCMessage( RPMLocateByPosition(RPM,RPM^.selectitem)^.desc , RPM^.Desc_Zone , RPM^.dtexcolor ); end; end; Procedure DisplayMenu( RPM: RPGMenuPtr; ReDrawer: RedrawProcedureType ); {Display the menu on the screen.} var topitem: RPGMenuItemPtr; a: RPGMenuItemPtr; {A pointer to be used while printing.} t: integer; height: integer; {The width of the menu display.} NextColor: PSDL_Color; Item_Image: PSDL_Surface; Item_PText: PChar; MyDest: TSDL_Rect; Y,DY: Integer; begin {Error check- make sure the menu has items in it.} if RPM^.FirstItem = Nil then Exit; { If a redraw procedure has been specified, call it. } if ReDrawer <> Nil then ReDrawer; {$IFNDEF PLUSGL} ClrZone( RPM^.Menu_Zone ); {$ENDIF} SDL_SetClipRect( Game_Screen , @RPM^.Menu_Zone ); {Calculate the height of the menu.} height := MenuHeight( rpm ); {Locate the top of the menu.} topitem := RPMLocateByPosition(RPM,RPM^.topitem); MyDest.X := RPM^.Menu_Zone.X; Y := RPM^.Menu_Zone.Y; DY := TTF_FontLineSkip( game_font ); MyDest.W := RPM^.Menu_Zone.W; a := topitem; for t := 1 to Height do begin MyDest.Y := Y; Y := Y + DY; {If we're at the currently selected item, highlight it.} if ((t + RPM^.topitem - 1) = RPM^.selectitem) and RPM^.Active then NextColor := @RPM^.selcolor else NextColor := @RPM^.itemcolor; Item_PText := QuickPCopy( a^.msg ); Item_Image := TTF_RenderText_Solid( game_font , Item_PText , NextColor^ ); Dispose( Item_PText ); SDL_BlitSurface( Item_Image , Nil , Game_Screen , @MyDest ); SDL_FreeSurface( Item_Image ); a := a^.next; {Check to see if we've prematurely encountered the end of the list.} if a = Nil then break; end; {Restore the window to its regular size.} SDL_SetClipRect( Game_Screen , Nil ); {If there's an associated Desc field, display it now.} RPMRefreshDesc(RPM); end; Procedure RPMReposition( RPM: RPGMenuPtr; FullScroll: Boolean ); {The selected item has just changed, and is no longer visible on screen.} {Adjust the RPGMenu's topitem field to an appropriate value.} begin {When this function is called, there are two possibilities: either the} {selector has moved off the bottom of the page or the top.} if RPM^.selectitem < RPM^.topitem then begin {The selector has moved off the bottom of the list. The new page} {display should start with SelectItem on the bottom.} if FullScroll then begin RPM^.topitem := RPM^.selectitem - MenuHeight( RPM ) + 1; end else begin RPM^.topitem := RPM^.selectitem; end; {Error check- if this moves topitem below 1, that's bad.} if RPM^.topitem < 1 then RPM^.topitem := 1; end else begin {The selector has moved off the top of the list. The new page should} {start with SelectItem at the top, unless this would make things look} {funny.} if FullScroll then begin if ((RPM^.selectitem + MenuHeight( RPM ) - 1) > RPM^.numitem) then begin {There will be whitespace at the bottom of the menu if we assign} {SelectItem to TopItem. Make TopItem equal to the effective last} {page.} RPM^.topitem := RPM^.numitem - MenuHeight( RPM ) + 1; if RPM^.topitem < 1 then RPM^.topitem := 1; end else RPM^.topitem := RPM^.selectitem; end else if ((RPM^.topitem + MenuHeight( RPM ) - 1) < RPM^.numitem) then begin Inc( RPM^.TopItem ); end; end; end; Procedure RPMUpKey( RPM: RPGMenuPtr; FullScroll: Boolean ); {Someone just pressed the UP key, and we're gonna process that input.} {PRECONDITIONS: RPM has been initialized properly, and is currently being} { displayed on the screen.} begin {Decrement the selected item by one.} Dec(RPM^.selectitem); {If this causes it to go beneath one, wrap around to the last item.} if RPM^.selectitem = 0 then RPM^.selectitem := RPM^.numitem; {If the movement takes the selected item off the screen, do a redisplay.} {Otherwise, indicate the newly selected item.} if (RPM^.selectitem < RPM^.topitem) or ((RPM^.selectitem - RPM^.topitem) >= MenuHeight( RPM )) then begin {Determine an appropriate new value for topitem.} RPMReposition(RPM,FullScroll); end; end; Procedure RPMDownKey( RPM: RPGMenuPtr; FullScroll: Boolean ); {Someone just pressed the DOWN key, and we're gonna process that input.} {PRECONDITIONS: RPM has been initialized properly, and is currently being} { displayed on the screen.} begin {Increment the selected item.} Inc(RPM^.selectitem); {If this takes the selection out of bounds, restart at the first item.} if RPM^.selectitem = RPM^.numitem + 1 then RPM^.selectitem := 1; {If the movement takes the selected item off the screen, do a redisplay.} {Otherwise, indicate the newly selected item.} if (RPM^.selectitem < RPM^.topitem) or ((RPM^.selectitem - RPM^.topitem) >= MenuHeight( RPM ) ) then begin {Determine an appropriate new value for topitem.} RPMReposition(RPM,FullScroll); end; end; Function SelectMenu( RPM: RPGMenuPtr; ReDrawer: RedrawProcedureType ): integer; {This function will allow the user to browse through the menu and will} {return a value based upon the user's selection.} var getit: char; {Character used to store user input} r,I: integer; {The value we'll be sending back.} m: RPGMenuKeyPtr; UK: Boolean; {Has a special MenuKey been pressed?} OldMouseX, OldMouseY: Integer; { TUNGINOBI: I got sick of the mouse cursor getting } { in the way of the keyboard, so this will only } { change the menu item if the mouse has moved. } begin {The menu is now active!} RPM^.Active := True; {Show the menu to the user.} DisplayMenu( RPM , ReDrawer ); GhFlip; {TUNGINOBI: Initialise the mouse movement variables} OldMouseX := Mouse_X; OldMouseY := Mouse_Y; {Initialize UK} UK := False; {Start the loop. Remain in this loop until either the player makes a selection} {or cancels the menu using the ESC key.} repeat DisplayMenu(RPM,ReDrawer); GhFlip; {Read the input from the keyboard.} getit := RPGKey; {Certain keys need processing- if so, process them.} case getit of {Selection Movement Keys} RPK_Up: RPMUpKey( RPM , True ); RPK_Down: RPMDownKey( RPM , True ); RPK_TimeEvent: begin { If the mouse pointer is around } { the menu, we may have to do something. } if Mouse_Active and ( Mouse_X >= RPM^.Menu_Zone.X ) and ( Mouse_X <= ( RPM^.Menu_Zone.X + RPM^.Menu_Zone.W ) ) and (( Mouse_X <> OldMouseX ) or ( Mouse_Y <> OldMouseY )) then begin if ( Mouse_Y < ( RPM^.Menu_Zone.Y ) ) then begin if ( RPM^.SelectItem > 1 ) then RPMUpKey( RPM , False ); end else if ( Mouse_Y > ( RPM^.Menu_Zone.Y + RPM^.Menu_Zone.H ) ) then begin if ( (RPM^.selectitem - RPM^.topitem) < MenuHeight( RPM ) ) and ( RPM^.selectitem < RPM^.numitem ) then RPMDownKey( RPM , False ); end else begin I := ( Mouse_Y - RPM^.Menu_Zone.Y ) div TTF_FontLineSkip( game_font ); SetItemByPosition( RPM , RPM^.TopItem + I ); { Upon setting an item directly, freeze the mouse. } OldMouseX := Mouse_X; OldMouseY := Mouse_Y; end; end; end; RPK_MouseButton: if Mouse_Active then begin { If the mouse hit happened inside } { the menu area, it was a selection. } { Otherwise it was a cancel. } if ( Mouse_X >= RPM^.Menu_Zone.X ) and ( Mouse_X <= ( RPM^.Menu_Zone.X + RPM^.Menu_Zone.W )) and ( Mouse_Y >= RPM^.Menu_Zone.Y ) and ( Mouse_Y <= ( RPM^.Menu_Zone.Y + RPM^.Menu_Zone.H )) then begin getit := ' '; end else begin if RPM^.Mode <> RPMNoCancel then getit := #27 else getit := ' '; end; end; RPK_RightButton: if ( RPM^.Mode <> RPMNoCancel ) and Mouse_Active then getit := #27; {If we receive an ESC, better check to make sure we're in a} {cancelable menu. If not, convert the ESC to an unused key.} #27: If RPM^.Mode = RPMNoCancel then getit := 'Q'; { If we get a backspace, conver that to ESC. } #8: If RPM^.Mode <> RPMNoCancel then getit := #27; { Convert enter to space. } #13,#10: getit := ' '; end; {Check to see if a special MENU KEY has been pressed.} if RPM^.FirstKey <> Nil then begin m := RPM^.FirstKey; while m <> Nil do begin if getit = m^.k then begin UK := True; r := m^.value; end; m := m^.next; end; end; {Check for a SPACE or ESC.} until (getit = ' ') or (getit = #27) or UK; {The menu is no longer active.} RPM^.Active := False; {We have to send back a different value depending upon whether a selection} {was made or the menu was cancelled. If an item was selected, return its} {value field. The value always returned by a cancel will be -1.} {If a MenuKey was pressed, r already contains the right value.} if getit = ' ' then begin r := RPMLocateByPosition(RPM,RPM^.selectitem)^.value; end else if not UK then r := -1; SelectMenu := r; end; Procedure RPMSortAlpha(RPM: RPGMenuPtr); {Given a menu, RPM, sort its items based on the alphabetical} {order of their msg fields.} {I should mention here that I haven't written a sorting} {algorithm in years, and only once on a linked list (CS assignment).} {I think this is an insertion sort... I checked on internet for} {examples of sorting techniques, found a bunch of contradictory} {information, and decided to just write the easiest thing that} {would work. Since we're dealing with a relatively small number} {of items here, speed shouldn't be that big a concern.} var sorted: RPGMenuItemPtr; {The sorted list} a,b,c,d: RPGMenuItemPtr;{Counters. We always need them, you know.} youshouldstop: Boolean; {Can you think of a better name?} begin {Initialize A and Sorted.} a := RPM^.firstitem; Sorted := Nil; while a <> Nil do begin b := a; {b is to be added to sorted} a := a^.next; {increase A to the next item in the menu} {Give b's Next field a value of Nil.} b^.next := nil; {Locate the correct position in Sorted to store b} if Sorted = Nil then {This is the trivial case- Sorted is empty.} Sorted := b else if UpCase( b^.msg ) < Upcase( Sorted^.msg ) then begin {b should be the first element in the list.} c := sorted; sorted := b; sorted^.next := c; end else begin {c and d will be used to move through Sorted.} c := Sorted; {Locate the last item lower than b} youshouldstop := false; repeat d := c; c := c^.next; if c = Nil then youshouldstop := true else if UpCase( c^.msg ) > UpCase( b^.msg ) then begin youshouldstop := true; end; until youshouldstop; b^.next := c; d^.next := b; end; end; RPM^.firstitem := Sorted; end; Function SetItemByValue( RPM: RPGMenuPtr ; V: Integer ): RPGMenuItemPtr; { Search through the list, and set the SelectItem } { field to the first menu item which matches V. } var T: Integer; MI: RPGMenuItemPtr; begin if RPM = Nil then exit; MI := RPM^.FirstItem; T := 1; while (MI <> Nil) and (MI^.Value <> V) do begin MI := MI^.Next; Inc( T ); end; if MI <> Nil then begin RPM^.SelectItem := T; if (RPM^.selectitem < RPM^.topitem) or ((RPM^.selectitem - RPM^.topitem) > MenuHeight( RPM ) ) then begin {Determine an appropriate new value for topitem.} RPMReposition(RPM,True); end; end; SetItemByValue := MI; end; Procedure SetItemByPosition( RPM: RPGMenuPtr ; N: Integer ); { Search through the list, and set the SelectItem } { field to the Nth menu item. } begin if RPM = Nil then exit; if N <= RPM^.NumItem then begin RPM^.SelectItem := N; if (RPM^.selectitem < RPM^.topitem) or ((RPM^.selectitem - RPM^.topitem + 1) > MenuHeight( RPM ) ) then begin {Determine an appropriate new value for topitem.} RPMReposition(RPM,True); end; end; end; Procedure BuildFileMenu( RPM: RPGMenuPtr; const SearchPattern: String ); { Do a DosSearch for files matching SearchPattern, then add } { each of the files found to the menu. } var F: SearchRec; N: Integer; begin N := 1; FindFirst( SearchPattern , AnyFile , F ); While DosError = 0 do begin AddRPGMenuItem( RPM , F.Name , N ); Inc(N); FindNext( F ); end; end; Function SelectFile( RPM: RPGMenuPtr; ReDrawer: RedrawProcedureType ): String; { RPM is a menu created by the BuildFileMenu procedure. } { So, select one of the items and return the item name, which } { should be a filename. } var N: Integer; { The number of the file selected. } Name: String; { The name of the filename selected. } begin { Do the menu selection first. } N := SelectMenu( RPM , ReDrawer ); if N = -1 then begin { Selection was canceled. So, return an empty string. } Name := ''; end else begin { Locate the selected element of the menu. } Name := RPMLocateByPosition(RPM,RPM^.SelectItem)^.msg; end; SelectFile := Name; end; end. GearHead/damage.pp0000644000175000017500000010662210334666550012752 0ustar kaolkaolunit damage; {This unit handles damage.} { GearHead: Arena, a roguelike mecha CRPG Copyright (C) 2005 Joseph Hewitt This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. The full text of the LGPL can be found in license.txt. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } interface uses gears; Const NAG_Damage = 12; NAS_StrucDamage = 0; {Structural Damage is what we would} {normally refer to as HP loss.} NAS_ArmorDamage = 1; {As armor gets hit, it loses its} {protective ability.} NAS_OutOfAction = 2; { if OutOfAction <> 0 , this model is OutOfAction } NAS_Resurrections = 3; { Number of times the PC has cheated death. } { *** HISTORY VARIABLES *** } DAMAGE_LastPartHit: GearPtr = Nil; DAMAGE_EjectRoll: Boolean = False; DAMAGE_EjectOK: Boolean = False; DAMAGE_PilotDied: Boolean = False; DAMAGE_DamageDone: LongInt = 0; DAMAGE_OverKill: LongInt = 0; DAMAGE_Iterations: Integer = 0; DAMAGE_AmmoExplosion: Boolean = False; Num_Perm_Injuries = 5; Perm_Injury_List: Array [1..Num_Perm_Injuries] of Byte = ( 21,22,23,24,25 ); Perm_Injury_Slot: Array [1..Num_Perm_Injuries] of String = ( 'EYES','SPINE','MUSCULATURE','SKELETON','HEART' ); Function WeaponDC( Attacker: GearPtr ; AtOp: Integer ): Integer; Function GearCurrentDamage(Part: GearPtr): LongInt; Function GearCurrentArmor(Part: GearPtr): Integer; Function PercentDamaged( Master: GearPtr ): Integer; Function NotDestroyed(Part: GearPtr): Boolean; Function Destroyed(Part: GearPtr): Boolean; Function PartActive( Part: GearPtr ): Boolean; Function RollDamage( DC , Scale: Integer ): Integer; Function NumActiveGears(Part: GearPtr): Integer; Function FindActiveGear(Part: GearPtr; N: Integer): GearPtr; Function CountActivePoints(Master: GearPtr; G,S: Integer): Integer; Function CountActiveParts(Master: GearPtr; G,S: Integer): Integer; Function CountTotalParts(Master: GearPtr; G,S: Integer): Integer; Function SeekActiveIntrinsic( Master: GearPtr; G,S: Integer ): GearPtr; Function SeekNDPart( Master: GearPtr; G,S: Integer ): GearPtr; Function OverloadCapacity( Mek: GearPtr ): Integer; Function MechaManeuver( Mek: GearPtr ): Integer; Function MechaTargeting( Mek: GearPtr ): Integer; Function MechaSensorRating( Mek: GearPtr ): Integer; Function MechaStealthRating( Mek: GearPtr ): Integer; Function PCommRating( Master: GearPtr ): Integer; Function LocateGoodAmmo( Weapon: GearPtr ): GearPtr; Function WeaponAttackAttributes( Attacker: GearPtr ): String; Function HasAttackAttribute( AtAt: String; N: Integer ): Boolean; Function HasAreaEffect( AtAt: String ): Boolean; Function HasAreaEffect( Attacker: GearPtr ): Boolean; Function NonDamagingAttack( AtAt: String ): Boolean; Function NoCalledShots( AtAt: String; AtOp: Integer ): Boolean; Function AmmoRemaining( Weapon: GearPtr ): Integer; Function ScaleRange( Rng,Scale: Integer ): Integer; Function WeaponDescription( Weapon: GearPtr ): String; Function ExtendedDescription( Part: GearPtr ): String; Procedure ApplyPerminantInjury( PC: GearPtr ); Procedure ApplyCyberware( PC,Cyber: GearPtr ); implementation uses gearutil,ghchars,ghguard,ghmecha,ghmodule,ghmovers,ghsensor, ghsupport,ghswag,ghweapon,texutil; const MVSensorPenalty = 1; MVGyroPenalty = 6; TRSensorPenalty = 5; var Damage_Strings: SAttPtr; Function WeaponDC( Attacker: GearPtr ; AtOp: Integer ): Integer; { Calculate the amount of damage that this gear can do when used } { in an attack. } var D: Integer; Master: GearPtr; Procedure ApplyCCBonus; { Apply the close combat bonus for weapons. } begin if Master <> Nil then begin if Master^.G = GG_Character then begin D := D + ( CStat( Master, STAT_Body ) - 10 ) div 2; { Martial Arts attacks get a bonus based on skill level. } if Attacker^.G = GG_Module then begin D := D + ( NAttValue( Master^.NA , NAG_Skill , 9 ) - 1 ) div 2; end; if D < 1 then D := 1; end else if Master^.G = GG_Mecha then begin D := D + ( Master^.V - 1 ) div 2; { Zoanoids get a CC damage bonus. Apply that here. } if Master^.S = GS_Zoanoid then begin D := D + ZoaDmgBonus; end; end; end; end; begin { Error check - make sure we have a valid weapon. } if Attacker = Nil then Exit( 0 ); { Locate the master of this gear. } Master := Attacker^.Parent; if Master <> Nil then begin while Master^.Parent <> Nil do Master := Master^.Parent; end; if Attacker^.G = GG_Weapon then begin D := Attacker^.V; { Apply damage bonuses here. } if ( Attacker^.S = GS_Melee ) or ( Attacker^.S = GS_EMelee ) then begin ApplyCCBonus; end; end else if Attacker^.G = GG_Module then begin D := ModuleBaseDamage( Attacker ) div 2; if D < 1 then D := 1; ApplyCCBonus; end else if Attacker^.G = GG_Ammo then begin D := Attacker^.V; end else begin D := 0; end; { Apply bonuses for weapon add-ons. } Master := Attacker^.InvCom; while Master <> Nil do begin if ( Master^.G = GG_WeaponAddOn ) and NotDestroyed( Master ) then begin D := D + Master^.V; end; Master := Master^.Next; end; WeaponDC := D; end; Function GearCurrentDamage(Part: GearPtr): LongInt; {Calculate the current remaining damage points for} {this gear.} var it: LongInt; begin it := GearMaxDamage(Part); if it > 0 then begin it := it - NAttValue(Part^.NA,NAG_Damage,NAS_StrucDamage); if it < 0 then it := 0; end; GearCurrentDamage := it; end; Function GearCurrentArmor(Part: GearPtr): Integer; {Calculate the current remaining armor PV for} {this gear.} var it: Integer; begin if ( Part <> Nil ) and ( Part^.G >= 0 ) then begin it := GearMaxArmor(Part); it := it - NAttValue( Part^.NA , NAG_Damage , NAS_ArmorDamage ); if it < 0 then it := 0; end else begin it := 0; end; GearCurrentArmor := it; end; Function PercentDamaged( Master: GearPtr ): Integer; { Add up the damage scores of every part on this mecha, and } { return the percentage of undamaged mek. } var MD,CD: LongInt; { Max Damage , Current Damage } procedure CheckPart( Part: GearPtr ); { Examine this part and its children for damage. } var D: Integer; SPart: GearPtr; begin D := GearMaxDamage( Part ); if D > 0 then begin MD := MD + D; CD := CD + GearCurrentDamage( Part ); end; { Check sub components. } SPart := Part^.SubCom; while SPart <> Nil do begin CheckPart( SPart ); SPart := SPart^.Next; end; { Check inv components. } SPart := Part^.InvCom; while SPart <> Nil do begin CheckPart( SPart ); SPart := SPart^.Next; end; end; begin MD := 0; CD := 0; CheckPart( Master ); { Error check - don't divide by 0. } if MD < 1 then MD := 1; PercentDamaged := ( CD * 100 ) div MD; end; Function NotDestroyed(Part: GearPtr): Boolean; {Check this part and see whether or not it's been} {destroyed. For most parts, it isn't destroyed if it} {has any hits remaining. For parts whose HP = -1, the} {part counts as not destroyed if it has any not-destroyed} {subcomponents. For master gears, the not destroyed check} {might be a bit more complicated...} var CD: Integer; it: Boolean; begin if Part = Nil then begin { Error Check - Undefined parts automatically count } { as destroyed. } it := False; end else if Part^.G < 0 then begin { Virtual types never count as destroyed. } it := True; end else if ( Part^.G = GG_Shield ) or ( Part^.G = GG_ExArmor ) then begin { Armor type gears count as not destroyed if they have } { any armor rating left. } CD := GearCurrentArmor(Part); it := CD > 0; end else if Part^.G = GG_Mecha then begin {In order for a mecha to count as not destroyed,} {its body + engine must have some hits remaining.} {Locate the body...} Part := Part^.SubCom; { ASSERT: All level one subcomponents will be Modules. } while (Part <> Nil) and (Part^.S <> GS_Body) do begin Part := Part^.Next; end; {The nondestroyedness of the mecha depends upon the} {state of the body.} if Part = Nil then it := false else it := NotDestroyed(Part); { If the body is ok, check the engine. } if it then begin Part := Part^.SubCom; while (Part <> Nil) and ((Part^.G <> GG_Support) or (Part^.S <> GS_Engine)) do begin Part := Part^.Next; end; { The nondestroyedness of the mecha now depends } { upon the state of the engine. } if Part = Nil then it := false else it := NotDestroyed(Part); end; end else if Part^.G = GG_Character then begin {In order for a character to count as not destroyed,} {its main gear must have some hits remaining,} {as well as any subcom bodies & heads.} it := GearCurrentDamage(Part) > 0; if it then begin { Check all subcomponents. Bodies and heads must be intact. } Part := Part^.SubCom; while (Part <> Nil) do begin if Part^.G = GG_Module then begin if ( Part^.S = GS_Body ) or ( Part^.S = GS_Head ) then begin it := it and NotDestroyed( Part ); end; end; Part := Part^.Next; end; end; end else begin {Calculate the current damage points of the gear.} CD := GearCurrentDamage(Part); if CD = -1 then begin {This gear is a pod or other storage type.} {It counts as not destroyed if it has any not} {destroyed children.} Part := Part^.SubCom; it := false; while Part <> Nil do begin it := it OR NotDestroyed(Part); Part := Part^.Next; end; end else if GearMaxDamage( Part ) = 0 then begin { Parts with Max Damage = 0 can't be destroyed. } it := True; end else begin {This is a regular type gear with positive HP.} {Whether or not the gear is destroyed is based} {on whether or not it has HP left.} it := CD > 0; end; end; NotDestroyed := it; end; Function Destroyed(Part: GearPtr): Boolean; { Some other procedures could use this one... } begin Destroyed := Not NotDestroyed( Part ); end; Function PartActive( Part: GearPtr ): Boolean; { This function will check to see whether or not PART is } { fully functioning. A part is "active" if it is not destroyed, } { and if all of its parents up to root are also not destroyed. } begin { ERROR CHECK - make sure PART is a valid pointer. } if Part = Nil then Exit( False ); if Part^.Parent = Nil then PartActive := NotDestroyed( PART ) else PartActive := NotDestroyed( PART ) and PartActive( Part^.Parent ); end; Function RollDamage( DC , Scale: Integer ): Integer; { Roll random damage, then modify for scale. } { DC is Damage Class, DP is Damage Points. } var DP,T: Integer; begin DP := 1; while DC > 5 do begin DP := DP + Random( 10 ); DC := DC - 5; end; DP := DP + Random( DC * 2 ); if Scale > 0 then DP := DP * 4; if Scale > 1 then begin for t := 2 to Scale do DP := DP * 5; end; RollDamage := DP; end; Function NumActiveGears(Part: GearPtr): Integer; {Calculate the number of active sibling components in} {the list of parts PART.} var N: Integer; begin N := 0; while Part <> Nil do begin if NotDestroyed(Part) then Inc(N); Part := Part^.Next; end; NumActiveGears := N; end; Function FindActiveGear(Part: GearPtr; N: Integer): GearPtr; {Given a list of gears PART, locate the Nth gear which} {is not destroyed. If no such gear exists, closest match.} {Return NIL if there are no nondestroyed gears in the list.} var t: Integer; {A counter} it: GearPtr; {the gear that will be returned} begin {Error check. If N is less than 1, we can't process the} {request. There is no gear before the first, after all...} if N < 1 then N := 1; {Initialize values.} t := 0; it := Nil; {Process the list.} while (t <> N) and (Part <> Nil) do begin if NotDestroyed(PART) then begin it := Part; Inc(T); end; Part := Part^.Next; end; FindActiveGear := it; end; Function CountUpSibs(Part: GearPtr; G,S,Scale: Integer): Integer; {Count up the number of "active points" in this line} {of sibling parts, recursing to find the number of APs} {in all child parts.} var CD,MD,it: Integer; begin {Initialize our count to 0.} it := 0; {Scan through all parts in the line.} while Part <> Nil do begin {Check to see if this part matches our description.} {We are only concerned about parts which have not} {yet been destroyed.} if NotDestroyed(Part) then begin if (Part^.G = G) and (Part^.S = S) and (Part^.Scale >= Scale) then begin {Calculate the max damage of this part.} MD := GearMaxDamage(Part); if MD > 0 then begin CD := GearCurrentDamage(Part); it := it + ( Part^.V * CD + MD - 1 ) div MD; end else begin it := it + 1; end; end; {Check the subcomponents.} if Part^.SubCom <> Nil then it := it + CountUpSibs(Part^.SubCom,G,S,Scale); if Part^.InvCom <> Nil then it := it + CountUpSibs(Part^.InvCom,G,S,Scale); end; { IF NOTDESTROYED } Part := Part^.Next; end; CountUpSibs := it; end; Function CountActivePoints(Master: GearPtr; G,S: Integer): Integer; {Count up the number of "active points" worth of components} {which may be described by G,S. In MZ, one frequenly has to} {count the number of spaces worth of legs/wheels/thrusters/etc.} {This is sorta the same thing- it counts up the number of} {hits, then divides that by the scaling factor, rounding up.} begin CountActivePoints := CountUpSibs( Master^.SubCom , G , S , Master^.Scale ); end; Function CountTheBits(Part: GearPtr; G,S,Scale: Integer): Integer; {Count up the number of nondestroyed parts which correspond} {to description G,S.} var it: Integer; begin {Initialize our count to 0.} it := 0; {Scan through all parts in the line.} while Part <> Nil do begin {Check to see if this part matches our description.} {We are only concerned about parts which have not} {yet been destroyed.} if NotDestroyed(Part) then begin if (Part^.G = G) and (Part^.S = S) and (Part^.Scale >= Scale) then Inc(it); {Check the subcomponents.} if Part^.SubCom <> Nil then it := it + CountTheBits(Part^.SubCom,G,S,Scale); if Part^.InvCom <> Nil then it := it + CountTheBits(Part^.InvCom,G,S,Scale); end; Part := Part^.Next; end; CountTheBits := it; end; Function CountActiveParts(Master: GearPtr; G,S: Integer): Integer; {Count the number of nondestroyed components which correspond} {to description G,S.} begin CountActiveParts := CountTheBits( Master^.SubCom , G , S , Master^.Scale ); end; Function CountTotalBits(Part: GearPtr; G,S,Scale: Integer): Integer; {Count up the number of parts which correspond} {to description G,S.} var it: Integer; begin {Initialize our count to 0.} it := 0; {Scan through all parts in the line.} while Part <> Nil do begin {Check to see if this part matches our description.} if (Part^.G = G) and (Part^.S = S) and (Part^.Scale >= Scale) then begin Inc(it); {Check the subcomponents.} if Part^.SubCom <> Nil then it := it + CountTotalBits(Part^.SubCom,G,S,Scale); if Part^.InvCom <> Nil then it := it + CountTotalBits(Part^.InvCom,G,S,Scale); end; Part := Part^.Next; end; CountTotalBits := it; end; Function CountTotalParts(Master: GearPtr; G,S: Integer): Integer; {Count the number of components which correspond} {to description G,S.} begin CountTotalParts := CountTotalBits( Master^.SubCom , G , S , Master^.Scale ); end; Function SeekActiveIntrinsic( Master: GearPtr; G,S: Integer ): GearPtr; { Search through all the subcoms and equipment of MASTER and } { find a part which matches G,S. If more than one applicable } { part is found, return the part with the highest V field. } { If no such part is found, return Nil. } { FUNCTIONS BLOCK } Function CompGears( P1,P2: GearPtr ): GearPtr; { Given two gears, P1 and P2, return the gear with } { the higest V field. } var it: GearPtr; begin it := Nil; if P1 = Nil then it := P2 else if P2 = Nil then it := P1 else begin if P1^.V > P2^.V then it := P1 else it := P2; end; CompGears := it; end; Function SeekPartAlongTrack( P: GearPtr ): GearPtr; { Search this line of sibling components for a part } { which matches G , S. } var it: GearPtr; begin it := Nil; while P <> Nil do begin if NotDestroyed( P ) then begin if ( P^.G = G ) and ( P^.S = S ) then begin it := CompGears( it , P ); end; it := CompGears( SeekPartAlongTrack( P^.SubCom ) , it ); it := CompGears( it , SeekPartAlongTrack( P^.InvCom ) ); end; P := P^.Next; end; SeekPartAlongTrack := it; end; begin { Note that this procedure does not check the general inventory. } SeekActiveIntrinsic := SeekPartAlongTrack( Master^.SubCom ); end; Function SeekNDPart( Master: GearPtr; G,S: Integer ): GearPtr; { Locate a component matching G,S. The component must be working, } { but otherwise can be located anywhere in the PART tree. } { This procedure doesn't even care about scale... We just want } { the largest example of the part we're after. } Function CompGears( P1,P2: GearPtr ): GearPtr; { Given two gears, P1 and P2, return the gear with } { the higest V field. } var it: GearPtr; begin it := Nil; if P1 = Nil then it := P2 else if P2 = Nil then it := P1 else begin if P1^.V > P2^.V then it := P1 else it := P2; end; CompGears := it; end; Function SeekPartAlongTrack( P: GearPtr ): GearPtr; { Search this line of sibling components for a part } { which matches G , S. } var it: GearPtr; begin it := Nil; while P <> Nil do begin if NotDestroyed( P ) then begin if ( P^.G = G ) and ( P^.S = S ) then begin it := CompGears( it , P ); end; it := CompGears( SeekPartAlongTrack( P^.SubCom ) , it ); it := CompGears( it , SeekPartAlongTrack( P^.InvCom ) ); end; P := P^.Next; end; SeekPartAlongTrack := it; end; begin SeekNDPart := CompGears( SeekPartAlongTrack( Master^.SubCom ) , SeekPartAlongTrack( Master^.InvCom ) ); end; Function OverloadCapacity( Mek: GearPtr ): Integer; { Return the amount of energy this mecha can safely drain without } { suffering an overload penalty. } begin OverloadCapacity := Mek^.V * 10; end; Function MechaManeuver( Mek: GearPtr ): Integer; { Check out a mecha-type gear and determine its } { maneuverability class, adjusted for damage. } var MV,OL: Integer; Gyro: GearPtr; begin { Error check- MV can only be calculated for valid mecha. } if (Mek = Nil) or (Mek^.G <> GG_Mecha) then Exit( 0 ); MV := FormMVBonus[ Mek^.S ] + BaseMVTVScore( Mek ); { Modify for the gyroscope and sensor package. } if SeekActiveIntrinsic( Mek , GG_Sensor , GS_MainSensor ) = Nil then MV := MV - MVSensorPenalty; Gyro := SeekActiveIntrinsic( Mek , GG_Support , GS_Gyro ); if Gyro = Nil then MV := MV - MVGyroPenalty else MV := MV + Gyro^.V - 1; { Add the penalty for engine overload. } OL := NAttValue( Mek^.NA , NAG_Condition , NAS_Overload ) - OverloadCapacity( Mek ); if OL > 14 then begin MV := MV - ( ( OL - 5 ) div 10 ); end; { Up to this point, no modifiers should take MV above 0. } if MV > 0 then MV := 0; { Biotech mecha get a +1 to MV and TR. } if NAttValue( Mek^.NA , NAG_GearOps , NAS_Material ) = NAV_BioTech then Inc( MV ); MechaManeuver := MV; end; Function MechaTargeting( Mek: GearPtr ): Integer; { Check out a mecha-type gear and determine its } { targeting class, adjusted for damage. } var TR,OL: Integer; TarCom: GearPtr; { Targeting Computer } begin { Error check- MV can only be calculated for valid mecha. } if (Mek = Nil) or (Mek^.G <> GG_Mecha) then Exit( 0 ); TR := FormTRBonus[ Mek^.S ] + BaseMVTVScore( Mek ); TarCom := SeekActiveIntrinsic( Mek , GG_Sensor , GS_TarCom ); if TarCom <> Nil then TR := TR + TarCom^.V; { Modify for sensors, or lack thereof. } if SeekActiveIntrinsic( Mek , GG_Sensor , GS_MainSensor ) = Nil then TR := TR - TRSensorPenalty; { Add the penalty for engine overload. } OL := NAttValue( Mek^.NA , NAG_Condition , NAS_Overload ) - OverloadCapacity( Mek ); if OL > 9 then begin TR := TR - ( OL div 10 ); end; { Up to this point, no modifiers should take TR above 0. } if TR > 0 then TR := 0; { Biotech mecha get a +1 to MV and TR. } if NAttValue( Mek^.NA , NAG_GearOps , NAS_Material ) = NAV_BioTech then Inc( TR ); MechaTargeting := TR; end; Function MechaSensorRating( Mek: GearPtr ): Integer; { Calculate the sensor rating for this mecha. } var SR: Integer; Sens: GearPtr; begin { Error check- MV can only be calculated for valid mecha. } if (Mek = Nil) or (Mek^.G <> GG_Mecha) then Exit( 0 ); { Locate the sensor package. } Sens := SeekActiveIntrinsic( Mek , GG_Sensor , GS_MainSensor ); if Sens = Nil then SR := -8 else begin SR := Sens^.V - 7; { If the sensors are mounted in a Head module, +3 bonus. } { This bonus only applies to forms which are allowed to } { have heads- so, if you had a transforming battroid/tank, } { the sensors would always work but the +3 bonus would only } { apply in battroid form. } if InGoodModule( Sens ) then begin Sens := FindModule( Sens ); if ( Sens <> Nil ) and ( Sens^.S = GS_Head ) then SR := SR + 3; end; end; MechaSensorRating := SR; end; Function MechaStealthRating( Mek: GearPtr ): Integer; { Calculate the stealth rating for this mecha. This will be } { the target number to beat when trying to spot the mecha. } var SR: Integer; begin if Mek = Nil then begin SR := 0; end else if Mek^.G = GG_Character then begin SR := 25 - Mek^.Stat[ STAT_Body ]; end else if Mek^.G = GG_Mecha then begin SR := 16 - Mek^.V; end else SR := 12; if SR < 5 then SR := 5; MechaStealthRating := SR; end; Function PCommRating( Master: GearPtr ): Integer; { Return the rating of the master's personal communications rating. } var it: GearPtr; begin it := SeekNDPart( Master , GG_Electronics , GS_PCS ); if it = Nil then begin PCommRating := 0; end else begin PCommRating := it^.V; end; end; Function LocateGoodAmmo( Weapon: GearPtr ): GearPtr; { Locate the first block of usable ammunition for the weapon listed. } { In order to be usable, it must: Fail the NotGoodAmmo function, and } { also it must not be destroyed. } { If no good ammo exists, this function returns NIL. } var Ammo,GAmmo: GearPtr; begin Ammo := Weapon^.SubCom; GAmmo := Nil; while ( Ammo <> Nil ) and ( GAmmo = Nil ) do begin if NotDestroyed( Ammo ) and not (NotGoodAmmo(Weapon,Ammo)) then begin GAmmo := Ammo; end; ammo := ammo^.Next; end; LocateGoodAmmo := GAmmo; end; Function WeaponAttackAttributes( Attacker: GearPtr ): String; { Return the attack type for this particular attack. } var it: String; ammo: GearPtr; begin { Error check. } if Attacker = Nil then Exit( '' ); { Grab the TYPE SAtt from the weapon itself. } it := SAttValue( Attacker^.SA , 'TYPE' ); { If appropriate, grab the TYPE from its ammo as well. } if Attacker^.G = GG_Weapon then begin if ( Attacker^.S = GS_Ballistic ) or ( Attacker^.S = GS_Missile ) then begin Ammo := LocateGoodAmmo( Attacker ); if Ammo <> Nil then begin it := SAttValue( Ammo^.SA , 'TYPE' ) + ' ' + it; end; end; end; { Add the TYPE from the weapon add-ons. } Ammo := Attacker^.InvCom; while Ammo <> Nil do begin if ( Ammo^.G = GG_WeaponAddOn ) and NotDestroyed( Ammo ) then begin it := SAttValue( Ammo^.SA , 'TYPE' ) + ' ' + it; end; Ammo := Ammo^.Next; end; WeaponAttackAttributes := it; end; Function HasAttackAttribute( AtAt: String; N: Integer ): Boolean; { Return TRUE if the listed attack attribute is posessed by } { this weapon, or FALSE otherwise. } begin if ( N < 1 ) or ( N > Num_Attack_Attributes ) then Exit( False ); HasAttackAttribute := AStringHasBString( AtAt , AA_Name[ N ] ); end; Function HasAreaEffect( AtAt: String ): Boolean; { Return TRUE if the provided attack attributes will result } { in an area effect attack, or FALSE otherwise. } begin HasAreaEffect := AStringHasBString( ATAt , AA_Name[AA_BlastAttack] ) or AStringHasBString( ATAt , AA_Name[AA_LineAttack] ) or AStringHasBString( ATAt , AA_Name[AA_Scatter] ); end; Function HasAreaEffect( Attacker: GearPtr ): Boolean; { Return TRUE if the listed weapon is of an area effect type, } { or FALSE otherwise. } begin HasAreaEffect := HasAreaEffect( WeaponAttackAttributes( Attacker ) ); end; Function NonDamagingAttack( AtAt: String ): Boolean; { Return TRUE if the Attacker is a non-damaging attack. } begin NonDamagingAttack := HasAttackAttribute( AtAt, AA_Smoke ) or HasAttackAttribute( AtAt , AA_Gas ) or HasAttackAttribute( AtAt , AA_Drone ); end; Function NoCalledShots( AtAt: String; AtOp: Integer ): Boolean; { Return TRUE if the weapon in question, using the requested } { attack option value, is incapable of making a called shot. } begin if ( AtOp > 0 ) or AStringHasBString( AtAt , AA_Name[AA_SwarmAttack] ) or AStringHasBString( AtAt , AA_Name[AA_Hyper] ) or HasAreaEffect( AtAt ) then begin NoCalledShots := True; end else begin NoCalledShots := False; end; end; Function AmmoRemaining( Weapon: GearPtr ): Integer; { Determine how many shots this weapon has remaining. } var Ammo: GearPtr; begin { Error Check- make sure this is actually a weapon. } if ( Weapon = Nil ) or ( Weapon^.G <> GG_Weapon ) then Exit( 0 ); { Find the ammo gear, if one exists. } Ammo := LocateGoodAmmo( Weapon ); if Ammo = Nil then Exit( 0 ); { Return the number of shots left. } AmmoRemaining := Ammo^.Stat[STAT_AmmoPresent] - NAttValue( Ammo^.NA , NAG_WeaponModifier , NAS_AmmoSpent ); end; Function ScaleRange( Rng,Scale: Integer ): Integer; { Provide a universal range measurement. } begin while Scale > 0 do begin Rng := Rng * 2; Dec( Scale ); end; ScaleRange := Rng; end; Function BasicWeaponDesc( Weapon: GearPtr ): String; {Supply a default name for this particular weapon.} begin {Convert the size of the weapon to a string.} if Weapon^.G = GG_Weapon then begin BasicWeaponDesc := DCName( WeaponDC( Weapon , 0 ) , Weapon^.Scale ) + ' ' + DefaultWeaponName[Weapon^.S]; end else begin BasicWeaponDesc := DCName( WeaponDC( Weapon , 0 ) , Weapon^.Scale ); end; end; Function WeaponDescription( Weapon: GearPtr ): String; { Create a description for this weapon. } var Master: GearPtr; desc,AA: String; T: Integer; begin { Take the default name for the weapon from the WeaponName } { function in ghweapon. } desc := BasicWeaponDesc( Weapon ); if Weapon^.G = GG_Weapon then begin Master := FindMaster( Weapon ); if Master <> Nil then begin if Master^.Scale <> Weapon^.Scale then begin desc := desc + ' SF:' + BStr( Weapon^.Scale ); end; end else if Weapon^.Scale > 0 then begin desc := desc + ' SF:' + BStr( Weapon^.Scale ); end; AA := WeaponAttackAttributes( Weapon ); if (Weapon^.S = GS_Ballistic) or (Weapon^.S = GS_BeamGun) or (Weapon^.S = GS_Missile) then begin T := ScaleRange( Weapon^.Stat[STAT_Range] , Weapon^.Scale ); if HasAttackAttribute( AA , AA_LineAttack ) then begin desc := desc + ' RNG:' + BStr( T ) + '-' + BStr( T * 2 ); end else begin desc := desc + ' RNG:' + BStr( T ) + '-' + BStr( T * 2 ) + '-' + BStr( T * 3 ); end; end else if HasAttackAttribute( AA , AA_Extended ) then begin desc := desc + ' RNG:' + BStr( ScaleRange( 2 , Weapon^.Scale ) ); end; if Weapon^.Stat[STAT_Accuracy] > -1 then begin desc := desc + ' ACC:+' + BStr( Weapon^.Stat[STAT_Accuracy] ); end else begin desc := desc + ' ACC:' + BStr( Weapon^.Stat[STAT_Accuracy] ); end; desc := desc + ' SPD:' + BStr( Weapon^.Stat[STAT_Recharge] ); if (Weapon^.S = GS_Ballistic) or (Weapon^.S = GS_BeamGun) then begin if Weapon^.Stat[ STAT_BurstValue ] > 0 then desc := desc + ' BV:' + BStr( Weapon^.Stat[ STAT_BurstValue ] + 1 ); end; if (Weapon^.S = GS_Ballistic) or (Weapon^.S = GS_Missile) then begin desc := desc + ' ' + BStr( AmmoRemaining( Weapon ) ) + '/' + BStr( Weapon^.Stat[ STAT_Magazine] ) + 'a'; end; if HasAttackAttribute( AA , AA_Mystery ) then begin desc := desc + ' ???'; end else begin if AA <> '' then begin desc := desc + ' ' + UpCase( AA ); end; end; end else if Weapon^.G = GG_Ammo then begin AA := WeaponAttackAttributes( Weapon ); if Weapon^.S = GS_Grenade then begin desc := desc + ' RNG:T'; if Weapon^.Stat[ STAT_BurstValue ] > 0 then desc := desc + ' BV:' + BStr( Weapon^.Stat[ STAT_BurstValue ] + 1 ); end; desc := desc + ' ' + BStr( Weapon^.Stat[STAT_AmmoPresent] - NAttValue( Weapon^.NA , NAG_WeaponModifier , NAS_AmmoSpent ) ) + '/' + BStr( Weapon^.Stat[ STAT_AmmoPresent] ) + 'a'; if HasAttackAttribute( AA , AA_Mystery ) then begin desc := desc + ' ???'; end else begin if AA <> '' then begin desc := desc + ' ' + UpCase( AA ); end; end; end; desc := desc + ' ARC:' + SAttValue( Damage_Strings , 'WEAPONINFO_ARC' + BStr( WeaponArc( Weapon ) ) ); WeaponDescription := desc; end; Function WAODescription( Weapon: GearPtr ): String; { Create a description for this weapon. } var desc,AA: String; begin { Take the default name for the weapon from the WeaponName } { function in ghweapon. } desc := SAttValue( Damage_Strings , 'WAO_' + BStr( Weapon^.S ) ); if Weapon^.V <> 0 then desc := desc + ' DC:' + SgnStr( Weapon^.V ); if Weapon^.Stat[ STAT_Range ] <> 0 then desc := desc + ' RNG:' + SgnStr( Weapon^.Stat[ STAT_Range ] ); if Weapon^.Stat[ STAT_Accuracy ] <> 0 then desc := desc + ' ACC:' + SgnStr( Weapon^.Stat[ STAT_Accuracy ] ); if Weapon^.Stat[ STAT_Recharge ] <> 0 then desc := desc + ' SPD:' + SgnStr( Weapon^.Stat[ STAT_Recharge ] ); AA := WeaponAttackAttributes( Weapon ); if HasAttackAttribute( AA , AA_Mystery ) then begin desc := desc + ' ???'; end else if AA <> '' then begin desc := desc + ' ' + UpCase( AA ); end; WAODescription := desc; end; Function PCSDescription( N: Integer ): String; { Return a description of this PCS's capabilities. } var it: String; T: Integer; begin it := SAttValue( Damage_Strings , 'PCS_Fun1' ); for t := 2 to N do begin it := it + SATtValue( Damage_Strings , 'PCS_Fun'+BStr( T ) ); end; PCSDescription := it; end; Function MoveSysDescription( Part: GearPtr ): String; { Return a description of the size/type of this movement } { system. } begin MoveSysDescription := SATtValue( Damage_Strings , 'MoveSys_Class' ) + ' ' + BStr( Part^.V ) + ' ' + MoveSysMan[ Part^.S ].Name; end; Function ModifierDescription( Part: GearPtr ): String; { Return a description for this modifier gear. } var it: String; T: Integer; begin if Part^.S = GS_StatModifier then begin it := ''; for t := 1 to NumGearStats do begin if Part^.Stat[ T ] <> 0 then begin if it <> '' then it := it + ', '; it := it + SgnStr( Part^.Stat[ T ] ) + ' ' + StatName[ T ]; end; end; end else if Part^.S = GS_SkillModifier then begin if ( Part^.Stat[ STAT_SkillToModify ] >= 1 ) and ( Part^.Stat[ STAT_SkillToModify ] <= NumSkill ) then begin it := SkillMan[ Part^.Stat[ STAT_SkillToModify ] ].Name; end else begin it := 'Unknown Skill'; end; it := it + ' ' + SgnStr( Part^.Stat[ STAT_SkillModBonus ] ); end; if Part^.V > 0 then begin if it <> '' then it := it + ', '; it := it + BStr( Part^.V ) + ' Trauma'; end; if it <> '' then it := it + '.'; ModifierDescription := it; end; Function ShieldDescription( Part: GearPtr ): String; { Return a description of the size/type of this movement } { system. } begin ShieldDescription := SATtValue( Damage_Strings , 'Shield_Desc' ) + SgnStr( Part^.Stat[ STAT_ShieldBonus ] ); end; Function UsableDescription( Part: GearPtr ): String; { Return a description of the size/type of this movement } { system. } var msg: String; begin msg := ReplaceHash( SATtValue( Damage_Strings , 'Usable_Desc' ) , BStr( Part^.Stat[ STAT_UseBonus ] ) ); msg := ReplaceHash( msg , BStr( Part^.Stat[ STAT_UseRange ] ) ); UsableDescription := msg; end; Function ExtendedDescription( Part: GearPtr ): String; { Provide an extended description telling all about the } { attributes of this particular item. } var it: String; SC: GearPtr; begin { Error check first. } if Part = Nil then Exit( '' ); { Start examining the part. } it := ''; if ( Part^.G = GG_Weapon ) then begin it := WeaponDescription( Part ); end else if ( Part^.G = GG_Ammo ) then begin it := WeaponDescription( Part ); end else if ( Part^.G = GG_Electronics ) and ( Part^.S = GS_PCS ) then begin it := PCSDescription( Part^.V ); end else if Part^.G = GG_MoveSys then begin it := MoveSysDescription( Part ); end else if Part^.G = GG_Modifier then begin it := ModifierDescription( Part ); end else if Part^.G = GG_Usable then begin it := UsableDescription( Part ); end else if Part^.G = GG_Shield then begin it := ShieldDescription( Part ); SC := Part^.SubCom; while ( SC <> Nil ) do begin it := it + ' ' + ExtendedDescription( SC ); SC := SC^.Next; end; end else if Part^.G = GG_WeaponAddOn then begin it := WAODescription( Part ); SC := Part^.SubCom; while ( SC <> Nil ) do begin it := it + ' ' + ExtendedDescription( SC ); SC := SC^.Next; end; end else if Part^.G = GG_Support then begin it := ReplaceHash( SAttValue( Damage_Strings , 'SupportDesc' ) , BStr( Part^.V ) ); end else if Part^.G <> GG_Module then begin SC := Part^.SubCom; while ( SC <> Nil ) do begin it := it + ' ' + ExtendedDescription( SC ); SC := SC^.Next; end; end; ExtendedDescription := it; end; Procedure ApplyPerminantInjury( PC: GearPtr ); { The PC has been through a beating. Apply a perminant injury, and destroy } { any relevant cyberware found. } var Injury: Integer; SC,SC2: GearPtr; begin Injury := Random( Num_Perm_Injuries ) + 1; SetNAtt( PC^.NA , NAG_StatusEffect , Perm_Injury_List[ Injury ] , -1 ); SC := PC^.SubCom; while SC <> Nil do begin SC2 := SC^.Next; if UpCase( SAttValue( SC^.SA , SAtt_CyberSlot ) ) = Perm_Injury_Slot[ Injury ] then begin RemoveGear( PC^.SubCom , SC ); end; SC := SC2; end; end; Procedure ApplyCyberware( PC,Cyber: GearPtr ); { A cybernetic item is being installed into the PC. This may heal a current } { perminant injury. Yay! Check to see whether or not it will. } var Slot: String; T: Integer; begin Slot := UpCase( SAttValue( Cyber^.SA , SAtt_CyberSlot ) ); for t := 1 to Num_Perm_Injuries do begin if Perm_Injury_Slot[ t ] = Slot then begin SetNAtt( PC^.NA , NAG_StatusEffect , Perm_Injury_List[ T ] , 0 ); end; end; end; initialization Damage_Strings := LoadStringList( Damage_Strings_File ); finalization DisposeSAtt( Damage_Strings ); end. GearHead/ghholder.pp0000644000175000017500000000514310334666460013324 0ustar kaolkaolunit ghholder; { This unit defines hands and weapon mounts. } { GearHead: Arena, a roguelike mecha CRPG Copyright (C) 2005 Joseph Hewitt This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. The full text of the LGPL can be found in license.txt. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } interface uses gears; { *** HOLDER FORMAT *** } { G = GG_Holder } { S = Holder Type } { V = Undefined } const GS_Hand = 0; GS_Mount = 1; function HolderName( Part: GearPtr ): String; Procedure CheckHolderRange( Part: GearPtr ); Function IsLegalHolderInv( Slot, Equip: GearPtr ): Boolean; implementation function HolderName( Part: GearPtr ): String; { Return a default name for this part type. } begin if Part^.S = GS_Hand then HolderName := 'Hand' else if Part^.S = GS_Mount then HolderName := 'Mounting Point'; end; Procedure CheckHolderRange( Part: GearPtr ); { Examine everything about this part and make sure the values } { fall within the acceptable range. } var T: Integer; begin { Check S - Holder Type } if Part^.S < 0 then Part^.S := 1 else if Part^.S > ( 1 ) then Part^.S := 1; { Check V - Undefined } Part^.V := 1; { Check Stats - No Stats are defined. } for t := 1 to NumGearStats do Part^.Stat[ T ] := 0; end; Function IsLegalHolderInv( Slot, Equip: GearPtr ): Boolean; { Check EQUIP to see if it can be stored in SLOT. } { INPUTS: Slot and Equip must both be properly allocated gears. } { Mounting Points may mount weapons, movesys. } { Hands may hold weapons, sensors. } var it: Boolean; begin if Slot^.S = GS_Hand then begin Case Equip^.G of GG_Weapon: it := true; else it := False; end; end else begin Case Equip^.G of GG_Weapon: it := true; GG_MoveSys: it := true; else it := False; end; end; { If the item is of a different scale than the holder, } { it can't be held. } if Equip^.Scale <> Slot^.Scale then it := False; IsLegalHolderInv := it; end; end. GearHead/congfx.pp0000644000175000017500000002661410461334060013007 0ustar kaolkaolunit ConGfx; { GearHead: Arena, a roguelike mecha CRPG Copyright (C) 2005 Joseph Hewitt This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. The full text of the LGPL can be found in license.txt. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } interface uses crt; const { For the purpose of making things easy on me, the } { screen is divided into several zones. } NumZones = 30; ZONE_Map = 1; ZONE_Clock = 2; ZONE_Info = 3; ZONE_Menu = 4; ZONE_Menu1 = 5; ZONE_Menu2 = 6; ZONE_Dialog = 7; ZONE_HQPilots = 8; ZONE_HQMecha = 9; ZONE_CharGenMenu = 10; ZONE_CharGenDesc = 11; ZONE_InteractStatus = 12; ZONE_InteractMenu = 13; ZONE_InteractMsg = 14; ZONE_InteractTotal = 15; ZONE_TextInput = 16; ZONE_EqpMenu = 17; ZONE_InvMenu = 18; ZONE_CharGenPrompt = 19; ZONE_Biography = 20; ZONE_SkillGenMenu = 21; ZONE_SkillGenDesc = 22; ZONE_SubInfo = 23; ZONE_Factory_Caption = 24; ZONE_Factory_Parts = 25; ZONE_YesNoTotal = 26; ZONE_YesNoPrompt = 27; ZONE_YesNoMenu = 28; ZONE_UsagePrompt = 29; ZONE_UsageMenu = 30; ZONE_MemoText = 27; ZONE_MemoMenu = 28; ScreenZone: Array [1..NumZones , 1..4] of Integer = ( ( 2 , 2 , -32 , -6 ), ( -30 , -5 , -1 , -5 ), ( -30 , 1 , -1 , 10 ), ( -30 , 11 , -1 , -6 ), ( -30 , 11 , -1 , 13 ), ( -30 , 14 , -1 , -6 ), ( 1 , -4 , -1 , 0 ), ( 3 , 3 , -62 , -6 ), ( -60 , 3 , -32 , -6 ), ( -29 , 4 , -2 , 0 ), ( 2 , -4 , -32 , 0 ), ( 2 , 2 , 46 , 5 ), ( 2 , 13 , 46 , 19 ), ( 2 , 6 , 46 , 12 ), ( 1 , 1 , 47 , 20 ), ( -71 , -15 , -40 , -12 ), ( 4 , 3 , 44 , 7 ), ( 4 , 9 , 44 , 18 ), ( -28 , 2 , -3 , 2 ), ( 4 , -10 , -34 , -6 ), ( -29 , -21 , -2 , -10 ), ( -28 , -7 , -3 , -2 ), ( -29 , 2 , -2 , 9 ), ( 2 , 2 , -32 , -20 ), ( 2 , -18 , -32 , -6 ), ( -69 , -21 , -37 , -9 ), ( -68 , -20 , -38 , -13 ), ( -68 , -11 , -38 , -10 ), ( -68 , -20 , -38 , -17 ), ( -68 , -15 , -38 , -10 ) ); { *** STANDARD COLORS *** } StdBlack: Byte = Black; StdWhite: Byte = White; MenuItem: Byte = Cyan; MenuSelect: Byte = LightCyan; TerrainGreen: Byte = Green; PlayerBlue: Byte = LightBlue; AllyPurple: Byte = LightMagenta; EnemyRed: Byte = Red; NeutralGrey: Byte = LightGray; InfoGreen: Byte = Green; InfoHiLight: Byte = LightGreen; TextboxGrey: Byte = DarkGray; AttackColor: Byte = LightRed; NeutralBrown: Byte = Yellow; BorderBlue: Byte = Blue; Procedure ClipZone( ZoneNumber: Integer ); Procedure MaxClipZone; Procedure ClrZone( ZoneNumber: Integer ); Procedure ClrScreen; Procedure DrawZoneBorder( X1, Y1, X2, Y2, Color: Byte ); Procedure DrawZoneBorder( Z: Integer; C: Byte ); Procedure DrawExtBorder( Z: Integer; C: Byte ); Procedure DrawMapBorder( N,E,S,W: Boolean ); Procedure DrawBPBorder; Procedure DrawCharGenBorder; Procedure SetupCombatDisplay; Procedure SetupHQDisplay; Procedure SetupFactoryDisplay; Procedure SetupYesNoDisplay; Procedure SetupMemoDisplay; Procedure SetupInteractDisplay( TeamColor: Byte ); implementation uses ui4gh; {$I boxdraw.inc} Procedure ClipZone( ZoneNumber: Integer ); { Set the clipping bounds to this defined zone. } begin Window( ScreenZone[ZoneNumber,1] , ScreenZone[ZoneNumber,2] , ScreenZone[ZoneNumber,3] , ScreenZone[ZoneNumber,4] ); end; Procedure MaxClipZone; { Restore the clip area to the maximum possible area. } begin Window( 1 , 1 , ScreenColumns , ScreenRows ); end; Procedure ClrZone( ZoneNumber: Integer ); { Clear the specified screen zone. } begin ClipZone( ZoneNumber ); TextBackground( Black ); ClrScr; MaxClipZone; end; Procedure ClrScreen; { Clear the entire screen. } begin TextBackground( Black ); MaxClipZone; ClrScr; end; Procedure DrawZoneBorder( X1, Y1, X2, Y2, Color: Byte ); { Do a lovely box in the specified color around the specified zone. } var t: integer; {a counter, of the house of CBM.} begin {Set the color for the box.} TextColor(Color); TextBackground( Black ); {$IFDEF NeedShifts} ShiftAltCharset; {$ENDIF} {Print the four corners.} GotoXY(X1,Y1); write(BoxUpperLeft); GotoXY(X2,Y1); write(BoxUpperRight); GotoXY(X1,Y2); write(BoxLowerLeft); GotoXY(X2,Y2); write(BoxLowerRight); {Print the two horizontal edges.} for t := X1+1 to X2-1 do begin GotoXY(t,Y1); write(BoxHorizontal); GotoXY(t,Y2); write(BoxHorizontal); end; {Print the two vertical edges.} for t := Y1+1 to Y2-1 do begin GotoXY(X1,t); write(BoxVertical); GotoXY(X2,t); write(BoxVertical); end; {$IFDEF NeedShifts} ShiftNormalCharset; {$ENDIF} end; Procedure DrawZoneBorder( Z: Integer; C: Byte ); { Do a box around this zone. } begin DrawZoneBorder( ScreenZone[Z,1], ScreenZone[Z,2], ScreenZone[Z,3], ScreenZone[Z,4], C ); end; Procedure DrawExtBorder( Z: Integer; C: Byte ); { Do a box around this zone. } begin DrawZoneBorder( ScreenZone[Z,1] - 1, ScreenZone[Z,2] - 1, ScreenZone[Z,3] + 1, ScreenZone[Z,4] + 1, C ); end; Procedure DrawMapBorder( N,E,S,W: Boolean ); { Draw a box one character outside of the map zone. } { If any of the directions are set to TRUE, print a "MORE" } { prompt along that side. } var T: Integer; begin { Start by drawing the border itself. } DrawZoneBorder( ScreenZone[ ZONE_Map , 1 ] - 1 , ScreenZone[ ZONE_Map , 2 ] - 1 , ScreenZone[ ZONE_Map , 3 ] + 1 , ScreenZone[ ZONE_Map , 4 ] + 1 , Cyan ); { Draw "MORE"s as appropriate. } If N then begin GotoXY( ( ScreenZone[ ZONE_Map , 1 ] + ScreenZone[ ZONE_Map , 3 ] ) div 2 - 2 , ScreenZone[ ZONE_Map , 2 ] - 1 ); Write( '+++++' ); end; If S then begin GotoXY( ( ScreenZone[ ZONE_Map , 1 ] + ScreenZone[ ZONE_Map , 3 ] ) div 2 - 2 , ScreenZone[ ZONE_Map , 4 ] + 1 ); Write( '+++++' ); end; If W then begin for t := 1 to 4 do begin GotoXY( ScreenZone[ ZONE_Map , 1 ] - 1 , ( ScreenZone[ ZONE_Map , 2 ] + ScreenZone[ ZONE_Map , 4 ] ) div 2 - 2 + T ); Write( '+' ); end; end; If E then begin for t := 1 to 4 do begin GotoXY( ScreenZone[ ZONE_Map , 3 ] + 1 , ( ScreenZone[ ZONE_Map , 2 ] + ScreenZone[ ZONE_Map , 4 ] ) div 2 - 2 + T ); Write( '+' ); end; end; end; Procedure DrawBPBorder; { Do the border for the BackPack routines. } var T: Integer; begin DrawZoneBorder( ScreenZone[ ZONE_EqpMenu , 1 ] - 1 , ScreenZone[ ZONE_EqpMenu , 2 ] - 1 , ScreenZone[ ZONE_InvMenu , 3 ] + 1 , ScreenZone[ ZONE_InvMenu , 4 ] + 1 , White ); GotoXY( ScreenZone[ ZONE_EqpMenu , 1 ] , ScreenZone[ ZONE_EqpMenu , 4 ] + 1 ); {$IFDEF NeedShifts} ShiftAltCharset; {$ENDIF} for t := 1 to (ScreenZone[ ZONE_EqpMenu , 3 ] - ScreenZone[ ZONE_EqpMenu , 1 ] + 1 ) do write(BoxSeperator); {$IFDEF NeedShifts} ShiftNormalCharset; {$ENDIF} end; Procedure DrawCharGenBorder; { Do the border for the character generator routines. } begin DrawZoneBorder( ScreenZone[ ZONE_Map , 1 ] - 1 , ScreenZone[ ZONE_Map , 2 ] - 1 , ScreenZone[ ZONE_Map , 3 ] + 1 , ScreenZone[ ZONE_Map , 4 ] + 1 , PlayerBlue ); DrawZoneBorder( ScreenZone[ ZONE_CharGenPrompt , 1 ] - 1 , ScreenZone[ ZONE_CharGenPrompt , 2 ] - 1 , ScreenZone[ ZONE_CharGenPrompt , 3 ] + 1 , ScreenZone[ ZONE_CharGenPrompt , 4 ] + 1 , Blue ); end; Procedure SetupCombatDisplay; { Clear the screen & draw boxes. } begin ClrScr; end; Procedure SetupHQDisplay; { CLear the screen & draw boxes. } begin ClrScr; end; Procedure SetupFactoryDisplay; { CLear the screen & draw boxes. } begin ClrScr; DrawExtBorder( ZONE_Factory_Parts , LightGray ); DrawExtBorder( ZONE_Factory_Caption , White ); end; Procedure SetupYesNoDisplay; { Set up the display for the YesNo box. } var T: Integer; begin ClrZone( ZONE_YesNoTotal ); DrawZoneBorder( ZONE_YesNoTotal , LightBlue ); GotoXY( ScreenZone[ ZONE_YesNoMenu , 1 ] , ScreenZone[ ZONE_YesNoMenu , 2 ] - 1 ); {$IFDEF NeedShifts} ShiftAltCharset; {$ENDIF} for t := 1 to (ScreenZone[ ZONE_YesNoMenu , 3 ] - ScreenZone[ ZONE_YesNoMenu , 1 ] + 1 ) do write(BoxSeperator); {$IFDEF NeedShifts} ShiftNormalCharset; {$ENDIF} end; Procedure SetupMemoDisplay; { Draw a nice border and some instructions for the memo display. } var T: Integer; begin ClrZone( ZONE_YesNoTotal ); DrawZoneBorder( ZONE_YesNoTotal , LightMagenta ); GotoXY( ScreenZone[ ZONE_YesNoMenu , 1 ] , ScreenZone[ ZONE_YesNoMenu , 2 ] - 1 ); {$IFDEF NeedShifts} ShiftAltCharset; {$ENDIF} for t := 1 to (ScreenZone[ ZONE_YesNoMenu , 3 ] - ScreenZone[ ZONE_YesNoMenu , 1 ] + 1 ) do write(BoxSeperator); {$IFDEF NeedShifts} ShiftNormalCharset; {$ENDIF} end; Procedure SetupInteractDisplay( TeamColor: Byte ); { Draw the display for the interaction interface. } begin ClrZone( ZONE_InteractTotal ); DrawZoneBorder( ZONE_InteractTotal , TeamColor ); end; Procedure AnchorEdge(var value: Integer; limit: Integer); begin if value < 1 then value := limit + value; end; Procedure CheckDimensions; { If the screen dimensions have been redefined, we'll need to alter } { the dimensions of the screen zones. } var t, uRows, uCols, iRowOff, iColOff: Integer; begin if ScreenRows > 57 then uRows := 57 else uRows := ScreenRows; if ScreenColumns > 83 then uCols := 83 else uCols := ScreenColumns; iRowOff := (uRows - 25) div 2; iColOff := (uCols - 78) div 2; for t := 1 to NumZones do begin case t of ZONE_InteractStatus, ZONE_InteractMenu, ZONE_InteractMsg, ZONE_InteractTotal, ZONE_InvMenu, ZONE_EqpMenu: begin { Center the interaction and inventory windows within the map window } ScreenZone[t,1] := ScreenZone[t,1] + iColOff; ScreenZone[t,2] := ScreenZone[t,2] + iRowOff; ScreenZone[t,3] := ScreenZone[t,3] + iColOff; ScreenZone[t,4] := ScreenZone[t,4] + iRowOff; end; ZONE_Dialog: begin { The dialog window recieves any slop lines at the bottom of the screen } AnchorEdge(ScreenZone[t,1],uCols); AnchorEdge(ScreenZone[t,2],uRows); AnchorEdge(ScreenZone[t,3],uCols); ScreenZone[t,4] := ScreenRows; end; else begin { Normal zone anchoring. Most zone corners are specified relative to edges of an screen area which ranges from 80x25 to 83x57 depending on the underlying terminal support.} AnchorEdge(ScreenZone[t,1],uCols); AnchorEdge(ScreenZone[t,2],uRows); AnchorEdge(ScreenZone[t,3],uCols); AnchorEdge(ScreenZone[t,4],uRows); end; end; end; end; initialization CursorOff; {LINUX ALERT... Maybe also doesn't work on Win2000} ClrScr; CheckDimensions; finalization {$IFNDEF DEBUG} NormVideo; ClrScr; {$ENDIF} CursorOn; end. GearHead/Series/0000755000175000017500000000000010640175275012415 5ustar kaolkaolGearHead/Series/TS_XRAN_aC--_FaceYourEnemy.txt0000644000175000017500000004004210166326164017662 0ustar kaolkaolplot 0 name % Edited to v0.901 standard % E1 is the scene for the current episode. % E2 is the character who will give the PC a mission. % E3 is the scene to be used in the next episode. Element1 Element2 Element3 Element4 Element5 % V1 = Initialization Counter % V2 = Combat Counter % V3 = Conversation Counter % V4 = Combat Trigger % V5 = Enemy only dies once... % On a cleanup request just delete this plot. cleanup start GoCheckInit .e2dies GoE2DiesNoFac GoE2DeathFinal % Upon entering the episode location, the trigger for combat upon leaving town will % be set. GoCheckSet Msg1 <\ELEMENT 2 : I die... but \NARRATIVE 2 will avenge me...> Msg2 Msg3 GoStartCombat .start .nu1 .nu2 % Combat check. If combat has been entered, V2=1. % Combat ends in victory if the number of active masters on % team two drops to zero, or ends in defeat is the number of % active masters on team one drops to zero. After combat, V2=3 % if the player was victorious or V2=2 is the player lost. nu1 nu2 Msg101 sub Persona 2 greeting GoCheckLoss GoCheckFirst GoInTown result1 result2 result3 GoR3NoMystery result4 result5 GoR5NoMystery result6 result7 result8 result9 Msg1 Msg1_1 CMsg1_1 Msg1_2 CMsg1_2 Msg1_3 CMsg1_3 Msg1_4 CMsg1_4 Msg1_5 CMsg1_5 Msg1_6 CMsg1_6 Msg1_7 CMsg1_7 Msg2 Msg5 Msg5_1 CMsg5_1 Msg5_2 CMsg5_2 Msg5_3 CMsg5_3 Msg5_4 CMsg5_4 Msg5_5 CMsg5_5 Msg5_6 CMsg5_6 Msg5_7 CMsg5_7 Msg6 Msg7 Msg7_1 CMsg7_1 Msg7_2 CMsg7_2 Msg7_3 CMsg7_3 Msg7_4 CMsg7_4 Msg7_5 CMsg7_5 Msg7_6 CMsg7_6 Msg7_7 <\PC , you are hereby challenged to a duel, to take place right here and right now. If you dishonor me by refusing I will have no choice but to kill you.> CMsg7_7 Msg7_8 CMsg7_8 Msg7_9 CMsg7_9 Msg8 Msg8_1 CMsg8_1 Msg8_2 CMsg8_2 Msg8_3 CMsg8_3 Msg8_4 CMsg8_4 Msg8_5 CMsg8_5 Msg8_6 CMsg8_6 Msg8_7 CMsg8_7 Msg8_8 CMsg8_8 Msg8_13 CMsg8_13 Msg9 Msg9_3 CMsg9_3 Msg9_4 CMsg9_4 Msg10 Msg10_2 CMsg10_2 Msg10_4 CMsg10_4 Msg10_7 CMsg10_7 Msg10_8 CMsg10_8 Msg10_10 CMsg10_10 Msg10_11 CMsg10_11 Msg10_12 CMsg10_12 Msg10_13 CMsg10_13 Msg15 Msg15_1 CMsg15_1 Msg15_2 CMsg15_2 Msg15_8 CMsg15_8 Msg15_9 CMsg15_9 Msg15_10 CMsg15_10 Msg15_11 CMsg15_11 Msg15_12 CMsg15_12 Msg15_13 CMsg15_13 Msg16 Msg16_1 CMsg16_1 Msg16_2 CMsg16_2 Msg16_3 CMsg16_3 Msg16_4 CMsg16_4 Msg16_5 CMsg16_5 Msg16_6 CMsg16_6 Msg16_7 CMsg16_7 Msg16_8 CMsg16_8 Msg17 Msg17_2 CMsg17_2 Msg17_3 CMsg17_3 Msg17_4 CMsg17_4 Msg17_9 CMsg17_9 Msg18 Msg19 Msg20 Msg21 <\ELEMENT 2 hates you because of a love triangle from middle school.> Msg22 Msg23 Msg24 Prompt1 Prompt1_1 Prompt1_2 Prompt1_3 CPrompt1_3 Prompt2 Prompt2_1 Prompt3 Prompt3_1 Prompt4 Prompt4_1 Prompt4_2 CPrompt4_2 Prompt5 Prompt5_1 Prompt6 Prompt7 Prompt8 Prompt9 Persona 4 rumor greeting GoNotInPlay Msg1 <\ELEMENT 2 is in town doing some shopping.> end GearHead/Series/TS_MONK_ItemSearch_PLOT1_TreasureMap.txt0000644000175000017500000001466610056233110021660 0ustar kaolkaolPlot 0 name % An item will be recovered. This item will lead to the next % clue; the PC can discover the next clue himself by examining % the item. element1 element2 element3 % E4 is the persona to control this plot. % As long as E3 can be picked up some time, or the code % contained under ".getkey" below is otherwise executed % at some time, what E4 does exactly doesn't matter. Element4 Element5 % V1 = Initialization Counter % V2 = Clue number for this plot % V3 = Have picked up item % V4 = Have purchased or stolen the map % At startup, initialize the item. start GoInitMap GoCheckClue GoDelete % As soon as the item is gotten, this plot starts the clue % countdown and loads the next relay. You might want to move % this so that the countdown starts only if the item is given % to E4 or some other condition... .getkey % When the item is used, it reveals the next clue. .usekey % If the map is gotten, set P4 to 1. .getmap % At cleanup just get rid of this plot. cleanup sub Persona 4 rumor % V2 = Message Randomizer % V4 = Price asked for map greeting GoSellMap GoSecondTime result1 GoR1Buy result2 result3 result4 result5 result6 % 01 - 03 : Bandit will offer the map for sale, first time. Msg1 Msg2 Msg3 % 04 - 06 : Bandit will offer the map for sale, second time. Msg4 Msg5 Msg6 % 07 - 09 : Bandit will explain why he doesn't want map himself. Msg7 Msg8 Msg9 % 10 - 12 : PC has purchased the map. Msg10 Msg11 Msg12 % 101 : PC can't afford the map. Msg101 % 102 : PC doesn't want the map. Msg102 % 01 - 02 : Player will buy the map. Prompt1 Prompt2 % 03 - 04 : Player will ask what's wrong with the map. Prompt3 Prompt4 % 05 - 06 : Player isn't interested in the map. Prompt5 Prompt6 end inv treasure 5000 name % instead of investigation you can use Science(29), Mysticism(34), % CodeBreaking(32) or Survival(14) % V1 = Location of next encounter % V2 = Clue number for this item % V3 = Investigation Indicator % V4 = PC Investigation skill when last tried use GoNoSolve Clue37 Clue29 GoDid Msg1 Msg2 Msg3 Treasure 1 name place <4> % V1 = Scene to be used in. % V2 = E3 item % V3 = Difficulcy Level use GoStartCombat .scene GoNotHere GoPlotOver Msg1 Msg2 Msg3 Msg4 Msg5 end GearHead/Series/TS_STORY_Entry_UAU_Amnesia.txt0000644000175000017500000001652610205741324020035 0ustar kaolkaolStory name % V1 = Initialization Counter % S101 = Load new episode when S101 = 1 % S102 = # PC Wins % S103 = Difficulcy Level, load ending when S103>75 % S104 = # Wins when level last increased % S105 = Location Clue % The first START, force a conversation with Hyolee, set the % trapper as the PC's ally, and randomly determine which key % NPC is the biggest bad guy. Start GoSetOps .intro Msg1 Msg2 Msg3 GoCheckClue GoNoClue Msg5 Element1 Element2 Element3 Stat 3 10 % E4 is Hogye, E5 is the trapper element4 Stat 4 2 element5 XREnemy 0 XRMystery 3 XRBadThing 1 hour GoLoadEpisode GoCheckHint .xplot .xend .xhint sub end inv NPC Mecha Pilot mecha EquipChar 50000 NPC Bounty Hunter job place <4 SD ALly> chardesc Male Old Heroic Shy Plot 0 % Note that I am hotloading this plot- DO NOT % DO THIS YOURSELF!!! I can get away with it because % I'm the programmer. Note that because this plot is % getting sneaked into the adventure riding under a % story gear, it will not be initialized by the % MATCH_PLOT_TO_ADVENTURE procedure. In this case % it shouldn't matter because the story is loaded at % the game's setup, and all the elements are starting % initialized. However, in general, I think this is % very bad form... name start GoDelete % Element 1 is Hyolee. Element1 Stat 1 1 % Element 2 is Megi. Element2 Stat 2 17 sub Persona 1 % Hyolee will greet the PC and tell him to go % speak with Megi. greeting GoBeenBefore result1 result2 result3 result4 result5 result6 Msg1 Msg2 Msg3 Msg4 Msg5 Msg6 Msg7 Prompt1 Prompt2 Prompt3 Prompt4 Prompt5 Prompt6 Persona 2 % Megi will speak with the PC and then allow % conversation branches to load the various job % plots, or the tutorial plot. greeting GoFirstTime result1 result2 result3 result4 result5 result6 result7 .JobStory result8 .CrimeStory result9 .Tutorial result10 GoEndPlot Msg1 Msg2 Msg3 Msg4 Msg5 Msg6 Msg7 Msg8 Msg9 Msg10 Msg11 Msg12 Msg13 Prompt1 Prompt2 Prompt3 Prompt4 Prompt5 Prompt6 Prompt7 Prompt8 Prompt9 Prompt10 end end GearHead/Series/SCENE_DefeatLeader.txt0000644000175000017500000000075510013773154016401 0ustar kaolkaolscene 0 2 % "Defeat the Leader" scene % V1 = Leader UID % V3 = Leader has been stopped if V3=1 ForestMap start Nu1 .courierdown Msg1 <\PILOT L1 is the leader. You must defeat him; all other mechas are incidental.> Msg3 <\PILOT L1 has been defeated! Your mission is a success.> sub Team 1 SetAlly -1 SetEnemy 2 Team 2 SetEnemy 1 PARAX 25 PARAY 25 end GearHead/Series/SCENE_SewerDivers.txt0000644000175000017500000000414410560007556016335 0ustar kaolkaolScene 0 0 % This scene is named after my favorite stage direction % from Shakespeare... "enter a sewer, divers" % Anyhow, it's a sewer. The PC can go up and return to % the calling scene, or kill all the monsters present and % descend to the next scene. Supposedly the calling plot must % record how deep the PC has gone. % INTERFACE % Use the following to enter this dungeon: % % GoStartCombat % .scene % .mdesc % % This code assumes the usual convention of setting P2=1 when % combat is entered. To measure the deepest level that the PC % has cleared, insert the following code in the plot: % % nu1 % nu2 % % This will save the deepest dungeon depth as P100, % and will set P2=2 when the PC leaves the dungeon. % V1 = Depth % V3 = Monsters dead message special NU1 NU2 % Every level you descend does a bit more morale damage, as the smell % starts to get to you... start Msg1 Msg1_1 Msg2 CaveMap BorderType 29 FloorType 17 MarbleType 7 sub Team 1 SetEnemy 2 Team 2 SetEnemy 1 home rect width 3 height 3 FloorType 17 sub StairsUp Destination -1 use end rect name width 8 height 8 FloorType 17 sub StairsDown Destination 1 use .scene .mdesc GoMoreMonsters Msg101 end end GearHead/Series/ARC_TS_Hyolee.txt0000644000175000017500000001152510145760334015476 0ustar kaolkaolPlot 0 name % Element 1 is Hyolee. element1 Stat 1 1 % Element 2 is Calmegie Research Station element2 stat 2 8 % Element 3 is Fluffy element3 % Element 4 is also Prefab element4 % This story arc will exit if Hyolee is killed. UTD1 sub Persona 1 greeting goQuestStarted goNoJournal result1 result2 result3 result4 result5 result6 result7 result8 result9 result10 GoReallyDead result11 GoFluffyDied result12 msg2 msg3 msg4 msg5 msg6 msg7 msg8 msg9 msg11 msg12 msg13 msg14 msg15 msg16 Msg17 Msg18 prompt1 prompt2 prompt3 prompt4 prompt5 prompt6 prompt7 prompt8 prompt9 prompt10 prompt11 prompt12 Persona 3 % If the PC makes an intimidation roll vs 10, Fluffy will run away! greeting msg1 end inv Chara name <"Fluffy" the Styracosaurus> job place <2 enemy> roguechar home chardesc Female sdl_sprite sdl_colors <100 130 110 240 200 50 220 0 0> scale 1 statline 12 19 10 7 5 6 2 2 size 1 skill 8 6 skill 9 4 skill 10 4 skill 12 8 skill 13 5 mod head Armor 1 sub gear 4 0 2 name stat 3 1 end mod body Armor 5 mod leg Armor 3 name mod leg Armor 3 name mod leg Armor 3 name mod leg Armor 3 name mod tail Armor 2 end Gear 12 1 25 name scale 0 place <2> home end GearHead/Series/TS_PLOT_GuardianPromotion_1.txt0000644000175000017500000001037210205741230020271 0ustar kaolkaolPlot 0 name % The PC has gone up a rank in the military, and will % now get a reward for it. % Element 1 is the calling faction % Element 2 is the character who'll give the PC the reward Element2 % These are faction rewards... Element3 Element4 Element5 Element6 % V1 = Email Indicator % This plot will remain active until the PC collects his % reward, until the NPC dies, or until the PC is no longer % a member of the calling faction. start GoReschedule GoDelete Msg1 <\ELEMENT 2 @ \SCENE EScene 2 :// You've earned a promotion. Come see me to accept your reward.> Msg2 <\ELEMENT 2 @ \SCENE EScene 2 :// I have urgent business which requires your attention at once.> Msg3 <\ELEMENT 2 @ \SCENE EScene 2 :// Report here for debriefing at once, \RANK .> Msg4 <\ELEMENT 2 @ \SCENE EScene 2 :// You have been promoted. Report here to receive your comission.> Msg5 <\ELEMENT 2 @ \SCENE EScene 2 :// Your presence is required at headquarters immediately.> sub Persona 2 % V1 = Faction level the PC is being rewarded for. greeting GoL0 GoL1 .mek1 GoL2 GoL3 GoL4 .mek2 GoL5 GoL6 GoL7 GoL8 .mek3 GoBigLevel Msg1 Msg2 Msg3 Msg4 Msg5 Msg6 Msg7 Msg8 Msg9 Msg10 end inv Gun 6 name Range 5 BV 3 Magazine 80 mass -7 Acc 1 Recharge 7 sub ammo 6 type mass -1 end BodyArmor 9 name Mass -13 sub MLauncher 3 name Acc -1 Magazine 30 range 8 type sub Rockets 3 end end Melee 23 name mass -15 type Acc 2 Recharge 4 HeadArmor 9 name mass -16 sub PCS 3 mass -2 end end GearHead/Series/TS_CORP_NewFactory_PLOT_Default.txt0000644000175000017500000003310210205741230020754 0ustar kaolkaolPlot 0 name % [[Ver1.5]] % ********************** % *** ELEMENTS BLOCK *** % ********************** % E1 is the faction behind the story Element1 Element2 Element3 % ******************** % *** SCRIPT BLOCK *** % ******************** % V1 = Time Limit % V2 = Combat Indicator, if V2=1 combat has been entered % V3 = Email sent indicator. % If P3=-1, PC has been denied the job % V4 = Original home of E2 % S101 = Faction Victory Count % S102 = Enemy Victory Count (if appropriate) % S103 = How many times PC fought for faction % S104 = How many times PC fought against faction % On a cleanup request, delete this plot unless combat has been % entered. cleanup % Time limit. This plot will conclude in one day, or immediately % if NPC E2 is killed. % At this startup, move the NPC to the factory site. start GoCheckTime GoDelete % Combat check. If combat has been entered, V2=1. % Combat ends in victory if the number of active masters on % team two drops to zero, or ends in defeat is the number of % active masters on team one drops to zero. After combat, V2=3 % if the player was victorious or V2=2 is the player lost. % Finally, if the player won, the calling story's faction victory % count (by default now story variable 101) will be increased. nu1 nu2 % Email check. If the PC belongs to the same faction as the NPC, % he may receive an email about the mission. Make a check every % 5 minutes. 5Min % ********************* % *** MESSAGE BLOCK *** % ********************* % 01 - 05 : Email Messages. % The NPC is offering the PC a mission via email. Msg1 <\PERSONA E2 @ \SCENE EScene 2 :// You have been assigned to the new factory project. Meet me in \ELEMENT 3 .> Msg2 <\PERSONA E2 @ \SCENE EScene 2 :// Your services are required for the company. Come to \ELEMENT 3 at once.> Msg3 <\PERSONA E2 @ \SCENE EScene 2 :// \RANK , you have been given an assignment. Meet me in \ELEMENT 3 .> Msg4 <\PERSONA E2 @ \SCENE EScene 2 :// I've got a company assignment for you, \PC . Meet me here and we'll discuss it.> Msg5 <\PERSONA E2 @ \SCENE EScene 2 :// Come to \ELEMENT 3 for a corporate assignment. Our new factory is going up.> sub % This next bit is the conversation which will happen when the % PC speaks to E2. Persona 2 rumor % ******************** % *** SCRIPT BLOCK *** % ******************** % If you're feeling faint of heart, just skip this % and jump straight to the messages block below. % Here are the variables used in this conversation: % V1 = Job offer counter, V1=1 is job offered, V1=-1 if job denied % V2 = Message Randomizer % V3 = Threat value of enemy mecha % V4 = Reward offered to PC for the mission % At startup, make sure the NPC has been moved to the proper scene. Greeting % Next, check to see whether the PC has already % completed the mission or not. GoRealStart GoCheckLoss GoCheckJob % The first time the PC meets the NPC, the PC will be given the % mission automatically if he's part of the same faction, or if % he is a friend of the NPC, or if he's already been sent email. % The PC will be denied the mission if he's helped the enemy. GoCheckFirst GoCheckFaction GoCheckEmail % If the reaction score is greater than 20, PC will automatically % be offered the job, but unlike above will not be automatically % expected to accept it, GoCheckFriend GoNoAutomatic GoDenied GoFirstDesc GoAddComOps % The PC will enter combat here. result1 GoStartCombat .nu1 .nu2 result2 % The PC needs some time to get ready. result3 result4 % The PC will be told the enemy's point value. result5 result6 % The PC accepts the job offer. result7 result8 % The PC refuses the job offer. result9 result10 % The PC tries to get the job via "PLAN A"- be cheerful. result11 result12 result13 % PLAN "A", whatever it was, has failed... GoR11Lose % The PC tries to get the job via "PLAN B"- be friendly. % This is done with the Conversation skill. result14 result15 result16 % PLAN "B", whatever it was, has failed... GoR14Lose % The player doesn't want this stinkin' job. result17 result18 result19 % ********************* % *** MESSAGE BLOCK *** % ********************* % 01 - 05 : Player has won the battle and is being paid. Msg1 Msg2 Msg3 Msg4 Msg5 % 06 - 10 : Player has lost the battle. Msg6 Msg7 Msg8 Msg9 Msg10 % 11 - 15 : Description of mission. % use "$ \VAL V4 " to insert the pay for the mission, % and don't forget to mention that the PC also gets salvage. Msg11 Msg12 Msg13 Msg14 Msg15 % 16 - 20 : Player is asked if he is looking for a job. Msg16 <\ELEMENT 1 needs you for a combat mission. Are you interested in working for the company?> Msg17 Msg18 Msg19 Msg20 % 21 - 25 : NPC implies job, PC might have chance to get it. Msg21 Msg22 Msg23 Msg24 Msg25 <\ELEMENT 1 is the best employer in the Federated Territories. Our new factory will create jobs for the people of \ELEMENT 3 !> % 26 - 30 : PC will be told exact enemy point value. % use "\VAL V3 " to insert the value. Msg26 Msg27 Msg28 Msg29 Msg30 % 31 - 35 : "PLAN A" or "PLAN B" worked... the PC is offered % a job and may choose either prompt7/8 to accept or prompt9/10 % to reject it. Msg31 Msg32 Msg33 Msg34 Msg35 % 36 - 40 : Combat is starting. Msg36 Msg37 Msg38 Msg39 Msg40 % 101 : Player accepted job, then left to get ready. Msg101 % 102 : Player has refused to take job; answer to prompts 9-10. Msg102 % 103 : Player has asked for some time to get ready. Msg103 % 104 : "PLAN A" has failed, and the PC is not offered a job. Msg104 % 105 : "PLAN B" has failed, and the PC is not offered a job. Msg105 % 106 : Player doesn't want job; answer to prompts 17-19. msg106 % 107 : Memo msg107 <\ELEMENT 2 in \SCENE EScene 2 offered you a combat mission.> % 108 : NPC hasn't been moved yet. Msg108 % 01 - 02 : Ready to start the mission Prompt1 Prompt2 % 03 - 04 : Need time to get ready first. Prompt3 Prompt4 % 05 - 06 : What is the enemy point value? Prompt5 Prompt6 % 07 - 08 : After being asked if he wants a job, PC says yes. Prompt7 Prompt8 % 09 - 10 : After being asked if he wants a job, PC says no. Prompt9 Prompt10 % 11 - 13 : Player tries to get job using PLAN "A". Prompt11 Prompt12 Prompt13 % 14 - 16 : Player tries to get job using PLAN "B". Prompt14 Prompt15 Prompt16 % 17 - 19 : Player doesn't much care for the job. Prompt17 Prompt18 Prompt19 end GearHead/Series/TS_GRD_PumpPusher_PLOTF_PlotFix.txt0000644000175000017500000000027610556526022021002 0ustar kaolkaolPlot 0 name % Apparently there's no guardian in town. Move one there. Element1 Element2 Start GearHead/Series/PLOT_GuardJob1.txt0000644000175000017500000003015310205741230015557 0ustar kaolkaolPlot 0 name % [[Ver1.4]] % ********************** % *** ELEMENTS BLOCK *** % ********************** % E1 is the faction behind the story Element1 Element2 % ******************** % *** SCRIPT BLOCK *** % ******************** % V1 = Time Limit % V2 = Combat Indicator, if V2=1 combat has been entered % V3 = Email sent indicator. % Time limit. This plot will conclude in one day, or immediately % if NPC E2 is killed. start GoCheckTime GoDelete % Combat check. If combat has been entered, V2=1. % Combat ends in victory if the number of active masters on % team two drops to zero, or ends in defeat is the number of % active masters on team one drops to zero. After combat, V2=3 % if the player was victorious or V2=2 is the player lost. % Finally, if the player won, the calling story's faction victory % count (by default now story variable 101) will be increased. nu1 nu2 % Email check. If the PC belongs to the same faction as the NPC, % he may receive an email about the mission. Make a check every % 5 minutes. 5Min % ********************* % *** MESSAGE BLOCK *** % ********************* % 01 - 05 : Email Messages. % The NPC is offering the PC a mission via email. Msg1 <\PERSONA E2 @ \SCENE EScene 2 :// Got a mission for you here in \SCENE ESCENE 2 if you're in the area.> Msg2 <\PERSONA E2 @ \SCENE EScene 2 :// Guardian business in \SCENE EScene 2 ; report here for mission against bandits.> Msg3 <\PERSONA E2 @ \SCENE EScene 2 :// If you're in the area I could use your assistance on a case.> Msg4 <\PERSONA E2 @ \SCENE EScene 2 :// Got a bandit problem in \SCENE EScene 2 ; if you're in the area stop by for mission.> Msg5 <\PERSONA E2 @ \SCENE EScene 2 :// Your assistance is required on an important case.> sub % This next bit is the conversation which will happen when the % PC speaks to E2. Persona 2 rumor % ******************** % *** SCRIPT BLOCK *** % ******************** % If you're feeling faint of heart, just skip this % and jump straight to the messages block below. % Here are the variables used in this conversation: % V1 = Job offer counter, V1=1 is job offered, V1=-1 if job denied % V2 = Message Randomizer % V3 = Threat value of enemy mecha % V4 = Reward offered to PC for the mission % At startup, first check to see whether the PC has already % completed the mission or not. Greeting GoCheckLoss GoCheckJob % The first time the PC meets the NPC, the PC will be given the % mission automatically if he's part of the same faction, or if % he is a friend of the NPC, or if he's already been sent email. % The PC will be denied the mission if he's helped the enemy. GoCheckFirst GoCheckFaction GoCheckEmail GoCheckFriend % If the PC is not automatically offered the job, there's still % a chance to get the job... as long as the NPC doesn't hate him. GoNoAutomatic GoDenied GoAddComOps result1 GoStartCombat .edesc .nu1 .nu2 result2 % The PC needs some time to get ready. result3 result4 % The PC will be told the enemy's point value. result5 result6 % The PC accepts the job offer. result7 result8 % The PC refuses the job offer. result9 result10 % The PC tries to get the job via "PLAN A"- Lawful reputation. result11 result12 result13 GoR11Lose % The PC tries to get the job via "PLAN B"- be friendly. % This is done with the Conversation skill. result14 result15 result16 % PLAN "B", whatever it was, has failed... GoR14Lose % The player doesn't want this stinkin' job. result17 result18 result19 % ********************* % *** MESSAGE BLOCK *** % ********************* % 01 - 05 : Player has won the battle and is being paid. Msg1 Msg2 Msg3 Msg4 Msg5 % 06 - 10 : Player has lost the battle. Msg6 Msg7 Msg8 Msg9 Msg10 % 11 - 15 : Description of mission. % use "$ \VAL V4 " to insert the pay for the mission, % and don't forget to mention that the PC also gets salvage. Msg11 Msg12 Msg13 Msg14 Msg15 % 16 - 20 : Player is asked if he is looking for a job. Msg16 Msg17 Msg18 Msg19 Msg20 % 21 - 25 : NPC implies job, PC might have chance to get it. Msg21 Msg22 Msg23 Msg24 Msg25 % 26 - 30 : PC will be told exact enemy point value. % use "\VAL V3 " to insert the value. Msg26 Msg27 Msg28 Msg29 Msg30 % 31 - 35 : "PLAN A" or "PLAN B" worked... the PC is offered % a job and may choose either prompt7/8 to accept or prompt9/10 % to reject it. Msg31 Msg32 Msg33 Msg34 Msg35 % 36 - 40 : Combat is starting. Msg36 Msg37 Msg38 Msg39 Msg40 % 101 : Player accepted job, then left to get ready. Msg101 % 102 : Player has refused to take job; answer to prompts 9-10. Msg102 % 103 : Player has asked for some time to get ready. Msg103 % 104 : "PLAN A" has failed, and the PC is not offered a job. Msg104 % 105 : "PLAN B" has failed, and the PC is not offered a job. Msg105 % 106 : Player doesn't want job; answer to prompts 17-19. msg106 % 107 : Memo msg107 <\ELEMENT 2 in \SCENE EScene 2 offered you a combat mission against bandits.> % 01 - 02 : Ready to start the mission Prompt1 Prompt2 % 03 - 04 : Need time to get ready first. Prompt3 Prompt4 % 05 - 06 : What is the enemy point value? Prompt5 Prompt6 % 07 - 08 : After being asked if he wants a job, PC says yes. Prompt7 Prompt8 % 09 - 10 : After being asked if he wants a job, PC says no. Prompt9 Prompt10 % 11 - 13 : Player tries to get job using PLAN "A". Prompt11 Prompt12 Prompt13 % 14 - 16 : Player tries to get job using PLAN "B". % By default, PLAN "B" is to be friendly and personable. Prompt14 Prompt15 Prompt16 % 17 - 19 : Player doesn't much care for the job. Prompt17 Prompt18 Prompt19 end GearHead/Series/PLOT_GuardJob4.txt0000644000175000017500000002446510111156124015571 0ustar kaolkaolPlot 0 name % VARIABLES USED % 1 -> Time Limit Timer % 2 -> Combat Indicator element1 % Time limit - this plot will fade after about half a day. START GotoCheckTime GoDelete % If combat has been entered, V2 = 1. This is important to keep % the events below from activating in scenes other than the % plot's combat... % After combat, V2=2 if the player lost, or V2=3 if the player won. NU1 NU2 sub Persona 1 rumor % The NPC who will offer the job. % PCs who don't have mecha will be sent elsewhere... % Only PCs with good reaction score will be offered a job. % V1 = Threat Value % V2 = Message Randomizer % V3 = Phase Indicator, PC gets only one pass through conversation greeting GoCheckLoss GoCheckMission GoHasChance GoMaybeOK % PCs with a medium reaction score have a chance to get offered a job, % if they make a good impression on the NPC. GoMedReact GoLowReact GoNothing % With no meks, the PC won't get offered a job at all, but may be told % about it. GoNoMeks % Result 1 -> The player is offering his services result1 % Result 2 -> The player will try to impress the NPC with INTIMIDATION result2 GoNotScary % Result 3 -> The player goes quietly away. result3 % Result 4 -> Go straight to the job description. result4 % Result 5 -> Go away. result5 % The NPC will describe the job being offered. This will depend upon the % PC's reputation. % V1 = Threat Value of Encounter GoJobDesc GoLvl9 GoLvl8 GoLvl7 GoLvl6 GoLvl5 GoLvl4 GoLvl3 GoLvl2 GoLvl1 GoLvl0 % The encounter has been described, and a threat rating been set. % See whether or not the PC will accept the job. GoChoose Result6 FrzNU1 FrzNU2 .enemydata result7 result8 result9 Msg1 Msg2 <\ELEMENT 1 in \SCENE EScene 1 asked you to investigate a mecha gang.> Msg3 Msg4 Msg5 Msg6 Msg7 Msg8 Msg9 Msg10 Msg11 Msg12 Msg13 Msg14 Msg15 Msg16 Msg17 Msg18 Msg19 Msg20 Msg21 Msg22 Msg101 Msg102 Msg103 Msg104 Msg105 Msg111 Msg112 Msg113 Msg114 Msg115 Msg121 Msg122 Msg123 Msg124 Msg125 Msg126 prompt1 prompt2 prompt3 prompt4 prompt5 prompt6 end GearHead/Series/TS_PLOT_ThiefPromotion_Default.txt0000644000175000017500000002005510563355063021035 0ustar kaolkaolPlot 0 name % Unlike the other promotions, the PC is gonna have to work for % his reward here. However, the rewards should be pretty good. % Element 1 is the calling faction % Element 2 is the character who'll give the PC the reward Element2 % These are faction rewards... Element3 Element4 Element5 Element6 Element7 % P1 = Email Indicator % P2 = Combat Indicator % P3 = Level the PC is being rewarded for % This plot will remain active until the PC collects his % reward, until the NPC dies, or until the PC is no longer % a member of the calling faction. start GoReschedule GoDelete % If combat has started, if the local variable 2 is nonzero, if the PC has left the map, % then he's gonna get rewarded based on P1. nu1 .topmek <*.txt> GoLvl10 GoLvl9 GoLvl8 .huge2mek GoLvl7 .hugemek GoLvl6 GoLvl5 .bigmek GoLvl4 GoLvl3 .medmek GoLvl2 GoLvl1 .lowmek Msg1 <\ELEMENT 2 @ \SCENE EScene 2 :// You've shown some talent. I have a big job for you.> Msg1_1 <\ELEMENT 2 @ \SCENE EScene 2 :// How'd you like to expand your skills into something bigger?> Msg1_2 <\ELEMENT 2 @ \SCENE EScene 2 :// Got a lead on something you'd like to own, I'm sure.> Msg1_3 <\ELEMENT 2 @ \SCENE EScene 2 :// Come on over, you dirty \RANK .> Msg1_4 <\ELEMENT 2 @ \SCENE EScene 2 :// I have something for you. Better hurry before I take it myself.> Msg1_5 <\ELEMENT 2 @ \SCENE EScene 2 :// Hey \PC , got a surprise to celebrate your new status as \RANK .> CMsg1_5 sub Persona 2 % V1 = Have been offered mission greeting GoCheckMission GoFirstTime result1 GoStartCombat .scene result2 Msg1 Msg1_1 Msg1_2 Msg2 Msg2_1 CMsg2_1 Msg2_2 CMsg2_2 Msg2_3 CMsg2_3 Msg2_4 CMsg2_4 Msg2_5 CMsg2_5 Msg2_6 CMsg2_6 Msg2_7 CMsg2_7 Msg3 Msg3_1 Msg4 Msg4_1 CMsg4_1 Msg4_2 CMsg4_2 Msg4_3 CMsg4_3 Msg4_4 CMsg4_4 Msg4_5 CMsg4_5 Msg4_6 CMsg4_6 Msg5 Msg5_1 Msg5_2 Prompt1 Prompt1_1 Prompt1_2 Prompt2 Prompt2_1 Prompt2_2 end inv STC GR-12 EMelee 9 scale 2 name type Speed 6 Acc 1 desc STC NUKE-1 Gun 7 scale 2 name Speed 4 range 5 magazine 20 desc sub Ammo 7 type end Battroid 4 name desig SDL_SPRITE SDL_COLORS <103 3 45 80 90 85 200 150 0> BioTech mod head size 3 Armor 4 mass -3 sub Sensor 8 TarComp 2 STC LAS-5 name type Speed 5 end mod body Armor 4 mass -5 sub CPit Armor 2 mass -1 Gyro 3 Armor 2 mass -1 Engine 4 Armor 2 mass -1 HighOutput Mount name Mount name ECM 5 ArcJet 4 end mod arm size 3 Armor 4 mass -4 name sub Hand Mount name Melee 6 name Recharge 3 type end mod arm size 3 Armor 4 mass -4 name sub Hand Mount name Melee 6 name Recharge 3 type end mod leg size 5 armor 4 mass -5 name sub Mount name ArcJet 4 end mod leg size 5 armor 4 mass -5 name sub Mount name ArcJet 4 end SkillModifier 40 Name Type CyberSlot SkillModStealth SkillModAmount 5 mass 120 SkillModifier 40 Name Type CyberSlot SkillModMechaFighting SkillModAmount 5 mass 74 end end GearHead/Series/TS_SCENE_Ziggurat.txt0000644000175000017500000000222010116212010016242 0ustar kaolkaolSCene 0 % Ziggurat Basement % This is an infinite dungeon. Once the specified level is reached, % the item will be inserted. % In this case, the item is the Fuel Rod for the Argoseyer. % V3 = *Current Depth % V5 = Initialization Counter special NU1 MonkeyMap BorderType 33 FloorType 28 SecretDoorChance 60 LockedDoorChance 40 start Msg1 GET55 sub Team 1 SetEnemy 2 Team 2 SetEnemy 1 type stat 2 42 Team 3 home rect FloorType 28 sub StairsUp Destination -1 use GoUpStairs .sitename end rect FloorType 28 name sub StairsDown Destination 1 use .sitename update end end GearHead/Series/TS_MONK_ItemSearch_PLOT2_Codex.txt0000644000175000017500000000743410057223030020467 0ustar kaolkaolPlot 0 name % A conclusion for the item search plot. This conclusion will end the story, % either in victory or in defeat for the PC... % E1 is the scene where this plot will take place. Element1 % E2 is the character who knows where the fire is. Element2 % E3 is the "Codex" itself. Element3 % V1 = Initialization Counter % V2 = Combat Indicator start .getkey GoCheckDelete CleanUp sub Persona 2 rumor greeting GoCheckMission result1 result2 result3 result4 result5 .scene .mon Msg1 Msg2 Msg3 <\ELEMENT 2 in \ELEMENT 1 discovered the old public library.> Msg4 Msg5 Msg6 Msg7 Msg8 Prompt1 Prompt2 Prompt3 Prompt4 Prompt5 end inv STC BOOKSHELF-1 name % V1 = SkXP to award % V2 = Skill to improve use GoPickSkill GoPick2 GoPick3 GoPick4 GoPick5 GoPick6 GoPick7 GoPick8 GoPick9 GoPick10 GoUse Msg5 Msg8 Msg9 Msg11 Msg14 Msg15 Msg16 Msg18 Msg22 Msg25 Msg101 Msg102 Msg103 Msg104 end GearHead/Series/TS_MONK_ItemSearch_PLOT1_Basement.txt0000644000175000017500000001606710112470710021165 0ustar kaolkaolPlot 0 name % An item will be recovered. This item will lead to the next % clue; the PC can discover the next clue himself by examining % the item. element1 element2 element3 % E4 is the persona to control this plot. % As long as E3 can be picked up some time, or the code % contained under ".getkey" below is otherwise executed % at some time, what E4 does exactly doesn't matter. Element4 % V1 = Initialization Counter % V2 = Clue number for this plot % V3 = Have picked up item % At startup, initialize the item. start GoCheckClue GoDelete % As soon as the item is gotten, this plot starts the clue % countdown and loads the next relay. You might want to move % this so that the countdown starts only if the item is given % to E4 or some other condition... .getkey % When the item is used, it reveals the next clue. .usekey % At cleanup just get rid of this plot. cleanup sub Persona 4 rumor % V1 = Mission Accepted Counter % V2 = Message Randomizer greeting % Upon winning the mission, you may want to destroy the item if % the NPC takes it. Otherwise the NPC can just let the PC keep it. GoCheckWin GoCheckMission GoDelete % Right now the PC has only one chance to get the mission- % be reasonably well liked. This can be altered so the PC % can get the mission if his traits are right, if he's been % given the mission by N1, or whatever else. GoCheckFirst GoNoChance GoAddComOps result1 result2 % If the PC doesn't want this mission, the entire story will % be blocked. No point continuing if the player doesn't want... result3 result4 % For the purposes of this template, I'll use the ITEM DUNGEON scene. result5 GoStartCombat .scene result6 result7 result8 % 01 - 03 : PC has retrieved the item. Msg1 Msg2 Msg3 % 04 - 06 : Mission description. Msg4 Msg5 Msg6 % 07 - 09 : PC will be offered the mission here. Msg7 Msg8 Msg9 % 10 - 12 : Mission will be implied. Msg10 Msg11 Msg12 % 13 - 15 : Combat is starting. Msg13 Msg14 Msg15 % 101 : The item somehow got destroyed... Msg101 % 102 : The PC refused the mission. Msg102 % 103 : The PC needs some time to get ready. Msg103 % 104 : Memo Msg104 <\ELEMENT 4 in \SCENE EScene 4 asked you to search \PPR E4 basement for treasure.> % 105 : PC has come back after getting ready Msg105 % 01 - 02 : PC will accept the mission. Prompt1 Prompt2 % 03 - 04 : PC doesn't want the mission. Prompt3 Prompt4 % 05 - 06 : Start the mission now. Prompt5 Prompt6 % 07 - 08 : PC needs time to prepare. Prompt7 Prompt8 end inv treasure 50 name % instead of investigation you can use Science(29), Mysticism(34), % CodeBreaking(32) or Survival(14) % V1 = Location of next encounter % V2 = Clue number for this item % V3 = Investigation Indicator % V4 = PC Investigation skill when last tried use GoNoSolve Clue37 GoDid Msg1 Msg2 end GearHead/Series/TS_GRD_PumpPusher_PLOTX_Courier.txt0000644000175000017500000004173310106645244021051 0ustar kaolkaolPlot 0 name % [[Ver1.6]] % ********************** % *** ELEMENTS BLOCK *** % ********************** % This plot will likely be called from a faction story. % So, it will grab the identity of the faction as its first % element, and a member of the faction to give the job to % the PC. % E1 is the faction behind the story Element1 % E2 is the NPC who will give the PC the mission. Element2 % ******************** % *** SCRIPT BLOCK *** % ******************** % V1 = Time Limit % V2 = Combat Indicator, if V2=1 combat has been entered % V3 = Email sent indicator. % If P3=-1, PC has been denied the job % S101 = Faction Victory Count % S102 = Enemy Victory Count (if appropriate) % S103 = How many times PC fought for faction % S104 = How many times PC fought against faction % On a cleanup request, delete this plot unless combat has been % entered. cleanup % Time limit. This plot will conclude in one day, or immediately % if NPC E2 is killed. start GoCheckTime GoDelete % Combat check. If combat has been entered, V2=1. % Combat ends in victory if the number of active masters on % team two drops to zero, or ends in defeat is the number of % active masters on team one drops to zero. After combat, V2=3 % if the player was victorious or V2=2 is the player lost. % Finally, if the player won, the calling story's faction victory % count (by default now story variable 101) will be increased. nu1 GoWin % Email check. 5Min % ********************* % *** MESSAGE BLOCK *** % ********************* % 01 : Email Messages. % The NPC is offering the PC a mission via email. Msg1 <\PERSONA E2 @ \SCENE EScene 2 :// Got a job for you here. Come see me about it.> Msg1_2 <\PERSONA E2 @ \SCENE EScene 2 :// How'd you like to help me send down some drug dealers? Come see me about a mission.> Msg1_3 <\PERSONA E2 @ \SCENE EScene 2 :// The "Pump Pushers" are operating in \SCENE ESCene 2 . I could use some backup on a case.> Msg1_4 <\PERSONA E2 @ \SCENE EScene 2 :// I've got a mission for you from the Guardians, if you're in the area.> Msg1_5 <\PERSONA E2 @ \SCENE EScene 2 :// There's a drug dealer in the area who needs to be stopped. Come see me about it.> sub % This next bit is the conversation which will happen when the % PC speaks to E2. Persona 2 rumor % ******************** % *** SCRIPT BLOCK *** % ******************** % Here are the variables used in this conversation: % V1 = Job offer counter, V1=1 is job offered, V1=-1 if job denied % V3 = Threat value of enemy mecha % V4 = Reward offered to PC for the mission Greeting GoCheckLoss GoCheckJob % The PC will be denied the mission if he's helped the enemy. GoCheckFirst GoCheckFaction GoCheckEmail GoCheckFriend GoNoAutomatic GoDenied GoAddComOps % The PC will enter combat here. result1 GoStartCombat .scene % The PC needs some time to get ready. result3 % The PC will be told the enemy's point value. result5 % The PC accepts the job offer. result7 % The PC refuses the job offer. result9 % The PC tries to get the job via "PLAN A"- be forceful and % convincing. This plan uses Intimidation skill in order to % succeed. If you want to change it, some alternate "PLAN A" % types are presented... uncomment the one you like. result11 % PLAN "A", whatever it was, has failed... GoR11Lose % The PC tries to get the job via "PLAN B"- be friendly. % This is done with the Conversation skill. result14 % PLAN "B", whatever it was, has failed... GoR14Lose % The player doesn't want this stinkin' job. result17 % ********************* % *** MESSAGE BLOCK *** % ********************* % 01 : Player has won the battle and is being paid. Msg1 Msg1_1 CMsg1_1 %Sociable Msg1_2 CMsg1_2 %Shy Msg1_3 CMsg1_3 %Easygoing Msg1_4 CMsg1_4 %Passionate Msg1_5 CMsg1_5 %Cheerful Msg1_6 CMsg1_6 %Melancholy Msg1_7 CMsg1_7 %Pragmatic Msg1_8 CMsg1_8 %Spiritual % 06 : Player has lost the battle. Msg6 Msg6_1 CMsg6_1 %Sociable Msg6_2 CMsg6_2 %Shy Msg6_3 CMsg6_3 %Easygoing Msg6_4 CMsg6_4 %Passionate Msg6_5 CMsg6_5 %Cheerful Msg6_6 CMsg6_6 %Melancholy Msg6_8 CMsg6_8 %Spiritual % 11 : Description of mission. % use "$ \VAL V4 " to insert the pay for the mission, % and don't forget to mention that the PC also gets salvage. Msg11 Msg11_1 CMsg11_1 %Sociable Msg11_2 CMsg11_2 %Shy Msg11_3 CMsg11_3 %Easygoing Msg11_4 CMsg11_4 %Passionate Msg11_5 CMsg11_5 %Cheerful Msg11_6 CMsg11_6 %Melancholy % 16 : Player is asked if he is looking for a job. Msg16 Msg16_1 CMsg16_1 %Sociable Msg16_2 CMsg16_2 %Shy Msg16_3 CMsg16_3 %Easygoing Msg16_4 CMsg16_4 %Passionate Msg16_5 CMsg16_5 %Cheerful Msg16_6 CMsg16_6 %Melancholy Msg16_7 CMsg16_7 %Pragmatic % 21 : NPC implies job, PC might have chance to get it. Msg21 Msg21_1 <> CMsg21_1 %Sociable Msg21_2 <> CMsg21_2 %Shy Msg21_3 <> CMsg21_3 %Easygoing Msg21_4 <> CMsg21_4 %Passionate Msg21_5 <> CMsg21_5 %Cheerful Msg21_6 <> CMsg21_6 %Melancholy Msg21_7 <> CMsg21_7 %Pragmatic Msg21_8 <> CMsg21_8 %Spiritual % 26 : PC will be told exact enemy point value. % use "\VAL V3 " to insert the value. Msg26 % 31 : "PLAN A" or "PLAN B" worked... the PC is offered % a job and may choose either prompt7/8 to accept or prompt9/10 % to reject it. Msg31 Msg31_1 CMsg31_1 %Sociable Msg31_2 CMsg31_2 %Shy Msg31_3 CMsg31_3 %Easygoing Msg31_4 CMsg31_4 %Passionate Msg31_5 CMsg31_5 %Cheerful Msg31_6 CMsg31_6 %Melancholy Msg31_7 CMsg31_7 %Pragmatic Msg31_8 CMsg31_8 %Spiritual % 36 : Combat is starting. Msg36 Msg36_1 CMsg36_1 %Sociable Msg36_2 CMsg36_2 %Shy Msg36_3 CMsg36_3 %Easygoing Msg36_4 CMsg36_4 %Passionate Msg36_5 CMsg36_5 %Cheerful Msg36_6 CMsg36_6 %Melancholy Msg36_7 CMsg36_7 %Pragmatic Msg36_8 CMsg36_8 %Spiritual % 101 : Player accepted job, then left to get ready. Msg101 % 102 : Player has refused to take job; answer to prompts 9-10. Msg102 % 103 : Player has asked for some time to get ready. Msg103 % 104 : "PLAN A" has failed, and the PC is not offered a job. Msg104 % 105 : "PLAN B" has failed, and the PC is not offered a job. Msg105 % 106 : Player doesn't want job; answer to prompts 17-19. msg106 % 107 : Memo msg107 <\ELEMENT 2 in \SCENE EScene 2 offered you a drug interception mission.> % 01 : Ready to start the mission Prompt1 Prompt1_1 % 03 : Need time to get ready first. Prompt3 Prompt3_1 % 05 : What is the enemy point value? Prompt5 Prompt5_1 % 07 : After being asked if he wants a job, PC says yes. Prompt7 Prompt7_1 % 09 : After being asked if he wants a job, PC says no. Prompt9 Prompt9_1 % 11 : Player tries to get job using PLAN "A". % By default, PLAN "A" is to sound tough and experienced. Prompt11 Prompt11_1 % 14 : Player tries to get job using PLAN "B". % By default, PLAN "B" is to be friendly and personable. Prompt14 Prompt14_1 % 17 : Player doesn't much care for the job. Prompt17 Prompt17_1 end GearHead/Series/PLOT_LostWallet.txt0000644000175000017500000000575707752054164016127 0ustar kaolkaolPlot 0 name % A poor citizen has lost his wallet. The PC can find it and % return it, or steal the money from it, or do whatever. element1 element2 % V1 = Timer / Initialization Counter % V2 = Have picked up item % This plot will last for 6 hours. start GoInit GoCheckTime % If time has run out, remove this plot if the PC doesn't have % the wallet anymore. GoCheckHas .getitem .useitem GoDelete sub Persona 1 rumor greeting result1 GoR1NoHero GoEndPlot Msg1 Msg2 Msg3 Msg4 Msg5 Msg6 Msg7 Prompt1 end inv Treasure 1500 name % We'll be placing the wallet manually so as to handle % initialization of its variables. % V1 = Reputation of NPC to whom wallet belongs; % determines how much cash is present. % V2 = Opening Indicator % V3 = Codebreaking Skill Roll type use % Using CodeBreaking might open the wallet... Clue32 GoCheckWeld GoNothing GoDone Msg1 Msg2 Msg3 Msg4 Msg5 end GearHead/Series/PLOT_TruckGuardJob1.txt0000644000175000017500000003322310205741230016571 0ustar kaolkaolPlot 0 name % [[Ver1.3]] % ********************** % *** ELEMENTS BLOCK *** % ********************** Element1 Element2 % ******************** % *** SCRIPT BLOCK *** % ******************** % V1 = Time Limit % V2 = Combat Indicator, if V2=1 combat has been entered % V3 = Email sent indicator. % Time limit. This plot will conclude in one day, or immediately % if NPC E2 is killed. start GoCheckTime GoDelete % Combat check. If combat has been entered, V2=1. % Combat ends in victory if the number of active masters on % team two drops to zero, or ends in defeat is the number of % active masters on team one drops to zero. After combat, V2=3 % if the player was victorious or V2=2 is the player lost. % Finally, if the player won, the calling story's faction victory % count (by default now story variable 101) will be increased. nu1 GoPCLost % Email check. If the PC belongs to the same faction as the NPC, % he may receive an email about the mission. Make a check every % 5 minutes. 5Min % ********************* % *** MESSAGE BLOCK *** % ********************* % 01 - 05 : Email Messages. % The NPC is offering the PC a mission via email. Msg1 <\PERSONA E1 @ \SCENE EScene 1 :// Bandits are ruining my business. I could use some mecha backup, if you're in the area.> Msg2 <\PERSONA E1 @ \SCENE EScene 1 :// Looking for work? I need a mecha to run convoy support. See me in \SCENE EScene 1 for details.> Msg3 <\PERSONA E1 @ \SCENE EScene 1 :// Hey Smoker, it's Bandicoot. A trucker friend needs a piggyback. How'd you like to help?> Msg4 <\PERSONA E1 @ \SCENE EScene 1 :// Too many damn bandits in \SCENE EScene 1 . A good pilot could make a killing round here protecting truckers.> Msg5 <\PERSONA E1 @ \SCENE EScene 1 :// Rabid Child got shot up pretty bad coming here from \ELEMENT 2 . The company could use a pilot to guard our trucks.> sub Persona 1 % Fill in something for the rumor string, so the PC will know who % has a job to offer. !2 will add the name of the NPC, while !1 % will add the name of the faction. rumor % ******************** % *** SCRIPT BLOCK *** % ******************** % If you're feeling faint of heart, just skip this % and jump straight to the messages block below. % Here are the variables used in this conversation: % V1 = Job offer counter, V1=1 is job offered, V1=-1 if job denied % V2 = Message Randomizer % V3 = Threat value of enemy mecha % V4 = Reward offered to PC for the mission % At startup, first check to see whether the PC has already % completed the mission or not. Greeting GoCheckLoss GoCheckJob % The first time the PC meets the NPC, the PC will be given the % mission automatically if he's part of the same faction, or if % he is a friend of the NPC, or if he's already been sent email. % The PC will be denied the mission if he's helped the enemy. GoCheckFirst GoCheckEmail GoCheckFriend GoNoAutomatic GoDenied GoAddComOps % The PC will enter combat here. result1 GoStartCombat .scene result2 % The PC needs some time to get ready. result3 result4 % The PC will be told the enemy's point value. result5 result6 % The PC accepts the job offer. result7 result8 % The PC refuses the job offer. result9 result10 % The PC tries to get the job via "PLAN A"- be forceful and % convincing. This plan uses Intimidation skill in order to % succeed. If you want to change it, some alternate "PLAN A" % types are presented... uncomment the one you like. result11 result12 result13 % PLAN "A", whatever it was, has failed... GoR11Lose % The PC tries to get the job via "PLAN B"- be friendly. % This is done with the Conversation skill. result14 result15 result16 % PLAN "B", whatever it was, has failed... GoR14Lose % The player doesn't want this stinkin' job. result17 result18 result19 % ********************* % *** MESSAGE BLOCK *** % ********************* % 01 - 05 : Player has won the battle and is being paid. Msg1 Msg2 Msg3 Msg4 Msg5 % 06 - 10 : Player has lost the battle. Msg6 Msg7 Msg8 Msg9 Msg10 % 11 - 15 : Description of mission. % use "$ \VAL V4 " to insert the pay for the mission, % and don't forget to mention that the PC also gets salvage. Msg11 Msg12 Msg13 Msg14 Msg15 % 16 - 20 : Player is asked if he is looking for a job. Msg16 Msg17 Msg18 Msg19 Msg20 % 21 - 25 : NPC implies job, PC might have chance to get it. Msg21 Msg22 Msg23 Msg24 Msg25 % 26 - 30 : Why are you taking such a dangerous route? Msg26 Msg27 Msg28 Msg29 Msg30 % 31 - 35 : "PLAN A" or "PLAN B" worked... the PC is offered % a job and may choose either prompt7/8 to accept or prompt9/10 % to reject it. Msg31 Msg32 Msg33 Msg34 Msg35 % 36 - 40 : Combat is starting. Msg36 Msg37 Msg38 Msg39 Msg40 % 101 : Player accepted job, then left to get ready. Msg101 % 102 : Player has refused to take job; answer to prompts 9-10. Msg102 % 103 : Player has asked for some time to get ready. Msg103 % 104 : "PLAN A" has failed, and the PC is not offered a job. Msg104 % 105 : "PLAN B" has failed, and the PC is not offered a job. Msg105 % 106 : Player doesn't want job; answer to prompts 17-19. msg106 % 107 : Memo msg107 <\ELEMENT 1 in \SCENE EScene 1 offered you a mission to protect a truck from bandits.> % 01 - 02 : Ready to start the mission Prompt1 Prompt2 % 03 - 04 : Need time to get ready first. Prompt3 Prompt4 % 05 - 06 : What is the enemy point value? Prompt5 Prompt6 % 07 - 08 : After being asked if he wants a job, PC says yes. Prompt7 Prompt8 % 09 - 10 : After being asked if he wants a job, PC says no. Prompt9 Prompt10 % 11 - 13 : Player tries to get job using PLAN "A". % By default, PLAN "A" is to sound tough and experienced. Prompt11 Prompt12 Prompt13 % 14 - 16 : Player tries to get job using PLAN "B". % By default, PLAN "B" is to be friendly and personable. Prompt14 Prompt15 Prompt16 % 17 - 19 : Player doesn't much care for the job. Prompt17 Prompt18 Prompt19 end GearHead/Series/WMONdefault.txt0000644000175000017500000020211510563350000015265 0ustar kaolkaol% ******************************** % *** DEFAULT MONSTER LIST *** % ******************************** % STATS REF BOD SPD PER CFT EGO KNO CHA ARCH Smog Monster roguechar sdl_sprite sdl_colors <122 88 193 70 121 119 208 30 50> type statline 13 13 13 8 7 5 2 2 size 11 skill 6 4 skill 8 6 skill 9 5 skill 10 6 skill 11 8 skill 25 5 mod body armor 2 sub gear 4 0 7 name BeamGun 9 name type Range 4 end mod wing armor 1 sub MLauncher 2 range 8 name type magazine 1 sub rockets 2 end Flight 5 end mod wing armor 1 sub MLauncher 2 range 8 name type magazine 1 sub rockets 2 end Flight 5 end mod tail armor 1 sub BeamGun 3 name type range 7 speed 1 end end Arch Security Guard statline 9 9 9 9 8 8 8 8 size 7 roguechar sdl_sprite sdl_colors <90 90 100 255 212 195 244 216 28> type CHAT_ATTACK1 CHAT_ATTACK2 skill 6 1 skill 7 1 skill 8 1 skill 9 1 skill 10 2 mod head mod body mod arm sub hand inv gear 4 2 12 name mass -4 stat 1 5 stat 2 1 recharge 3 stat 8 16 sub gear 5 2 12 name type end end end mod arm sub hand end inv Shield 4 DefBonus 2 name end mod leg mod leg end Arch Watchman statline 9 9 9 9 8 8 8 8 size 1 roguechar sdl_sprite sdl_colors <90 90 100 255 212 195 150 120 90> type CHAT_ATTACK1 CHAT_ATTACK2 CHAT_ATTACK3 skill 6 1 skill 7 1 skill 8 1 skill 9 1 skill 10 2 mod head mod body mod arm sub hand end mod arm sub hand end mod leg mod leg end ARCH Guard Dog roguechar type sdl_sprite sdl_colors <80 80 85 150 112 89 170 200 50> statline 13 8 10 15 8 6 2 5 size 8 DomTarget 14 skill 8 7 skill 9 5 skill 10 5 skill 11 6 mod head sub gear 4 0 6 name end mod body mod leg name mod leg name mod leg name mod leg name end ARCH Dog roguechar sdl_sprite sdl_colors <123 63 0 135 90 45 150 200 50> type statline 12 7 9 16 8 6 2 5 size 3 DomTarget 14 skill 8 5 skill 9 2 skill 10 2 skill 11 3 mod head sub gear 4 0 6 name end mod body mod leg name mod leg name mod leg name mod leg name end ARCH StormFeather roguechar sdl_sprite sdl_colors <60 30 81 1 75 70 210 35 50> size 15 statline 15 10 19 17 5 6 2 7 type DomTarget 18 skill 6 5 skill 8 5 skill 9 3 skill 10 6 skill 13 3 mod head armor 2 mass -4 sub melee 8 name recharge 5 type end mod body armor 2 mass -4 sub BeamGun 6 mass -6 name Range 8 Recharge 1 BV 5 type Flight 16 name end mod wing armor 2 mass -3 sub BeamGun 5 mass -5 name range 10 type end mod wing armor 2 mass -3 sub BeamGun 5 mass -5 name range 10 type end end ARCH Eagle roguechar sdl_sprite sdl_colors <123 63 0 120 100 13 122 88 193> size 5 statline 15 6 17 16 5 6 2 7 type DomTarget 15 skill 8 5 skill 9 3 skill 10 5 mod head armor 1 sub melee 5 name recharge 5 end mod body armor 1 sub Flight 12 name end mod wing mod wing end ARCH Assassin Lord roguechar size 21 type statline 18 16 17 17 13 16 10 11 SDL_SPRITE SDL_COLORS <36 46 30 200 159 180 70 30 81> skill 6 6 skill 8 9 skill 9 8 skill 10 8 skill 13 2 skill 18 7 Talent 23 mod head armor 3 mod body armor 3 mod arm armor 3 sub hand inv gun 5 name type range 4 mass -3 recharge 6 sub ammo 5 end end end mod arm armor 3 sub hand inv melee 22 name type scale 0 mass -15 end end mod leg armor 3 mod leg armor 3 end ARCH Assassin roguechar size 15 type SDL_SPRITE SDL_COLORS <34 37 30 200 159 180 80 28 28> statline 17 16 15 16 13 15 10 11 skill 6 6 skill 8 9 skill 9 8 skill 10 7 skill 18 4 Talent 23 mod head armor 3 mod body armor 3 mod arm armor 3 sub hand inv gun 5 name mass -1 range 10 acc 1 recharge 3 magazine 30 sub ammo 5 name type end end end mod arm armor 3 sub hand inv Melee 6 name type scale 0 mass -5 recharge 1 end end mod leg armor 3 mod leg armor 3 end ARCH Stone Dragon roguechar genepool size 22 DomTarget 37 type statline 15 20 12 19 12 13 6 9 % Begin SURVIVAL block. clue14 GoPelt GoMeat .heartdesc .fooddesc GoFail GoDone Msg2 Msg3 Msg4 Msg5 % End SURVIVAL block. skill 6 5 skill 8 5 skill 9 4 skill 10 4 skill 11 3 skill 12 3 skill 13 7 mod head armor 6 sub Melee 5 name type Gun 12 name range 7 type recharge 1 % I'm limiting the shots of this breath attack... magazine 3 sub ammo 12 end end mod body armor 6 mod leg armor 5 mod leg armor 5 mod leg armor 5 mod leg armor 5 mod leg armor 5 mod leg armor 5 mod tail armor 5 end ARCH Core Worm statline 13 19 16 2 11 5 2 2 roguechar type sdl_sprite sdl_colors <110 80 85 250 80 0 244 216 0> size 15 DomTarget 30 skill 6 4 skill 8 5 skill 9 3 skill 10 5 skill 12 3 skill 13 7 mod head armor 5 sub Melee 4 name type BeamGun 6 name type range 4 recharge 1 end mod body armor 5 mod tail armor 4 end ARCH World Maggot statline 16 22 21 10 19 20 17 2 roguechar type sdl_sprite sdl_colors <180 155 88 245 213 150 208 0 51> size 35 skill 6 6 skill 8 2 skill 9 3 skill 10 5 skill 12 3 skill 13 8 mod head armor 1 sub Melee 9 name type BeamGun 4 name type range 3 end mod body armor 4 sub BeamGun 3 name range 7 BV 4 type recharge 3 Melee 5 name recharge 3 type end mod tail armor 4 end ARCH Sun Scarab statline 16 13 11 8 1 1 1 1 roguechar sdl_sprite sdl_colors <234 180 88 123 63 0 170 150 230> type size 12 DomTarget 32 % Begin SURVIVAL block. clue14 GoPelt .stcdesc GoFail GoDone Msg1 Msg2 Msg3 % End SURVIVAL block. skill 6 3 skill 8 5 skill 9 4 skill 10 6 mod body armor 5 sub gear 4 0 6 name BeamGun 3 name recharge 1 range 5 type BV 3 end mod wing size 6 armor 5 mod wing size 6 armor 5 mod leg size 3 armor 4 mod leg size 3 armor 4 mod leg size 3 armor 4 mod leg size 3 armor 4 mod leg size 3 armor 4 mod leg size 3 armor 4 end ARCH Black Scarab statline 10 8 9 7 1 1 1 1 roguechar sdl_sprite sdl_colors <70 70 85 56 26 81 244 216 81> type size 4 DomTarget 24 skill 8 4 skill 9 4 skill 10 4 mod body armor 2 sub gear 4 0 6 name end mod leg size 2 armor 2 mod leg size 2 armor 2 mod leg size 2 armor 2 mod leg size 2 armor 2 mod leg size 2 armor 2 mod leg size 2 armor 2 end ARCH Toxic Urchin roguechar SDL_SPRITE SDL_COLORS <152 61 97 122 88 193 122 88 193> statline 14 5 7 5 1 1 1 1 Size 6 type % Begin SURVIVAL block. clue14 GoPelt .stcdesc GoFail GoDone Msg1 Msg2 Msg3 % End SURVIVAL block. skill 6 5 skill 8 3 skill 10 1 skill 13 7 mod body armor 6 sub BeamGun 1 Range 5 name type BV 3 Melee 3 name type Recharge 4 end end ARCH Moon Bear roguechar SDL_SPRITE SDL_COLORS <180 185 200 220 190 150 208 0 230> genepool size 18 DomTarget 19 type statline 17 19 13 14 8 10 2 4 % Begin SURVIVAL block. clue14 GoPelt GoMeat .stcdesc .fooddesc GoFail GoDone Msg1 Msg2 Msg3 Msg4 % End SURVIVAL block. skill 8 8 skill 9 5 skill 10 4 % Bears have the talent HARD AS NAILS NAtt 16 8 1 mod head armor 3 sub melee 7 name type end mod body armor 4 mod arm armor 3 sub melee 5 name recharge 1 type end mod arm armor 3 sub melee 5 name recharge 1 type end mod leg armor 3 mod leg armor 3 end ARCH Dragon Bear roguechar SDL_SPRITE SDL_COLORS <234 190 90 245 220 160 0 200 0> genepool size 20 DomTarget 25 type statline 16 19 11 15 10 16 7 6 % Begin SURVIVAL block. clue14 GoPelt GoGland GoMeat .heartdesc .stcdesc .fooddesc GoFail GoDone Msg1 Msg2 Msg3 Msg4 Msg5 % End SURVIVAL block. skill 6 4 skill 8 10 skill 9 4 skill 10 4 skill 12 11 skill 13 7 % Bears have the talent HARD AS NAILS NAtt 16 8 1 mod head armor 4 sub melee 5 name type BeamGun 4 name type range 6 recharge 1 end mod body armor 4 mod arm armor 4 sub melee 6 name type recharge 3 end mod arm armor 4 sub melee 6 name type recharge 3 end mod leg armor 4 mod leg armor 4 end ARCH Harrow Bear roguechar SDL_SPRITE SDL_COLORS <80 90 90 90 100 100 200 50 0> genepool % Begin SURVIVAL block. clue14 GoPelt .stcdesc GoFail GoDone Msg1 Msg2 Msg3 % End SURVIVAL block. size 15 DomTarget 26 type statline 14 18 10 11 8 10 2 1 skill 8 10 skill 9 4 skill 10 2 % Bears have the talent HARD AS NAILS NAtt 16 8 1 skill 13 5 mod head armor 2 sub melee 9 name recharge 1 end mod body armor 3 mod arm armor 2 sub melee 5 name recharge 1 type end mod arm armor 2 sub melee 5 name recharge 1 type end mod leg armor 2 mod leg armor 2 end ARCH Red Bear roguechar SDL_SPRITE SDL_COLORS <125 60 0 150 120 89 244 210 28> genepool size 9 DomTarget 17 type statline 14 17 9 13 8 10 2 4 % Begin SURVIVAL block. clue14 GoPelt GoMeat .stcdesc .fooddesc GoFail GoDone Msg1 Msg2 Msg3 Msg4 % End SURVIVAL block. skill 8 8 skill 9 2 skill 10 2 % Bears have the talent HARD AS NAILS NAtt 16 8 1 mod head armor 2 sub melee 7 name recharge 1 end mod body armor 3 mod arm armor 2 sub melee 5 name recharge 1 type end mod arm armor 2 sub melee 5 name recharge 1 type end mod leg armor 2 mod leg armor 2 end ARCH Sea Dragon roguechar genepool SDL_SPRITE SDL_COLORS <1 75 67 238 180 88 66 121 119> size 20 DomTarget 25 type statline 17 19 16 15 8 16 7 9 % Begin SURVIVAL block. clue14 GoPelt GoGland GoMeat .heartdesc .stcdesc .fooddesc GoFail GoDone Msg1 Msg2 Msg3 Msg4 Msg5 % End SURVIVAL block. skill 6 4 skill 8 12 skill 9 4 skill 10 5 skill 12 1 skill 13 3 mod head armor 5 sub Melee 12 name recharge 1 BeamGun 7 name range 4 recharge 1 type end mod body armor 5 mod tail name armor 5 sub Melee 4 name type end mod tail name armor 5 sub Melee 4 name type end mod tail name armor 5 sub Melee 4 name type end end ARCH Dune Dragon roguechar sdl_sprite sdl_colors <160 130 90 240 190 100 51 90 161> size 16 DomTarget 21 genepool type statline 16 15 14 17 9 14 5 10 % Begin SURVIVAL block. clue14 GoPelt GoGland GoMeat .heartdesc .stcdesc .fooddesc GoFail GoDone Msg1 Msg2 Msg3 Msg4 Msg5 % End SURVIVAL block. skill 6 4 skill 8 6 skill 9 4 skill 10 4 skill 12 1 skill 13 3 mod head armor 5 sub Melee 5 name recharge 1 type Melee 5 name recharge 1 type BeamGun 4 name range 4 type end mod body armor 5 mod leg armor 3 mod leg armor 3 mod leg armor 3 mod leg armor 3 mod tail armor 3 end ARCH Fire Worm roguechar sdl_sprite sdl_colors <127 45 35 250 50 100 244 244 30> type statline 10 4 8 9 2 2 2 2 size 5 skill 6 3 skill 8 2 skill 9 4 skill 10 3 mod body sub gear 4 0 3 name Recharge 1 BeamGun 1 name type Range 2 end mod wing sub Melee 1 name end mod wing sub Melee 1 name end mod tail end Arch Androbot statline 12 19 12 13 12 12 12 1 size 13 roguechar sdl_sprite sdl_colors <157 172 183 162 153 235 230 0 0> sdl_portrait type CHAT_ATTACK % Begin Science block. clue29 GoPelt GoMeat .stcdesc .fooddesc GoFail GoDone Msg1 Msg2 Msg3 Msg4 % End Science block. Metal skill 6 4 skill 7 4 skill 8 5 skill 9 4 skill 10 3 skill 11 5 skill 33 30 mod head armor 5 inv HeadArmor 7 name end mod body armor 6 inv BodyArmor 9 name end mod arm armor 7 sub Hand inv gun 6 name Range 4 Acc 1 Recharge 1 BV 2 Magazine 40 sub gear 5 2 6 end end end mod arm armor 7 sub Hand end inv Shield 8 DefBonus 3 name end mod leg armor 7 mod leg armor 7 end Arch Iron Monkey statline 7 9 6 7 6 5 5 8 Size 2 DomTarget 14 type roguechar sdl_sprite sdl_colors <103 3 45 245 213 160 244 216 28> skill 9 5 skill 10 1 skill 30 5 mod head armor 1 mod body armor 2 mod arm armor 2 mod arm armor 2 mod leg armor 2 mod leg armor 2 mod tail armor 2 end Arch Toxic Chameleon statline 13 10 6 9 5 3 1 2 sdl_sprite sdl_colors <220 100 170 60 70 60 230 30 50> Size 7 DomTarget 17 type RogueChar skill 8 3 skill 9 4 skill 10 3 skill 11 5 skill 25 15 mod head armor 2 sub Melee 2 name type end mod body armor 2 mod leg armor 2 mod leg armor 2 mod leg armor 2 mod leg armor 2 mod tail armor 2 end Arch Chameleon statline 12 8 6 9 5 3 1 3 Size 1 DomTarget 16 type RogueChar sdl_sprite sdl_colors <125 100 15 70 125 120 230 170 90> % Begin SURVIVAL block. clue14 GoPelt GoFail GoDone Msg1 Msg2 Msg3 % End SURVIVAL block. skill 8 3 skill 9 1 skill 10 1 skill 11 5 skill 25 15 mod head armor 1 sub Melee 1 name type end mod body armor 1 mod leg armor 1 mod leg armor 1 mod leg armor 1 mod leg armor 1 mod tail armor 1 end Arch Cyclops Progenitor statline 15 21 13 12 11 13 9 8 Biotech scale 1 Size 30 type roguechar sdl_sprite sdl_colors <150 112 89 199 188 162 100 200 0> sdl_portrait skill 6 7 skill 7 7 Skill 8 7 skill 9 4 skill 10 6 skill 36 10 skill 12 10 mod head armor 4 mod body armor 4 sub Mount name inv BeamGun 6 name recharge 4 end Mount name inv BeamGun 6 name recharge 4 end end mod arm armor 4 sub hand end mod arm armor 4 sub hand end mod leg armor 4 mod leg armor 4 end Arch Cyclops Guard statline 15 21 13 12 11 13 9 8 Size 19 Biotech type roguechar sdl_sprite sdl_colors <200 160 120 240 220 200 100 200 0> sdl_portrait CHAT_ATTACK1 CHAT_ATTACK2 skill 6 7 skill 7 7 Skill 8 7 skill 9 4 skill 10 6 skill 36 10 skill 12 10 mod head armor 4 mod body armor 4 sub Mount name inv Gun 4 name BV 4 range 7 magazine 120 mass -7 sub ammo 4 end end Mount name inv Gun 4 name BV 4 range 7 magazine 120 mass -7 sub ammo 4 end end end mod arm armor 4 sub hand inv Melee 16 name Mass -10 type end end mod arm armor 4 sub hand inv Melee 16 name Mass -10 type end end mod leg armor 4 mod leg armor 4 end Arch Cyclops statline 14 19 13 10 13 7 9 8 Size 10 Biotech type roguechar sdl_sprite sdl_colors <200 160 120 240 220 200 100 200 0> sdl_portrait skill 6 4 skill 7 4 Skill 8 4 skill 9 4 skill 10 4 mod head armor 4 mod body armor 4 mod arm armor 4 sub hand end mod arm armor 4 sub hand end mod leg armor 4 mod leg armor 4 end Arch Rock Lizard statline 12 15 16 10 2 9 2 2 size 10 DomTarget 18 roguechar SDL_SPRITE SDL_COLORS <150 112 89 170 130 100 210 40 50> type % Begin SURVIVAL block. clue14 GoPelt .stcdesc GoFail GoDone Msg1 Msg2 Msg3 % End SURVIVAL block. skill 8 5 skill 9 4 skill 10 4 skill 13 6 skill 25 7 skill 26 7 mod head armor 4 sub Melee 10 name recharge 3 type end mod body armor 7 mod leg armor 7 mod leg armor 7 mod leg armor 7 mod leg armor 7 mod tail armor 7 end Arch Albino Alligator statline 13 20 10 7 2 9 2 2 size 12 DomTarget 22 roguechar SDL_SPRITE SDL_COLORS <199 188 162 152 61 97 208 35 51> type % Begin SURVIVAL block. clue14 GoPelt GoFail GoDone Msg1 Msg2 Msg3 % End SURVIVAL block. skill 8 5 skill 9 4 skill 10 4 skill 13 6 skill 18 5 skill 25 7 skill 26 7 skill 30 10 skill 36 2 mod head armor 7 sub Melee 15 name recharge 3 end mod body armor 3 mod leg armor 7 mod leg armor 7 mod leg armor 7 mod leg armor 7 mod tail armor 7 end ARCH Ravager statline 12 14 12 13 7 9 6 8 size 5 roguechar type CHAT_ATTACK skill 6 4 skill 7 4 skill 9 6 skill 10 4 skill 13 2 mod head armor 2 inv HeadArmor 3 name end mod body armor 1 mod arm armor 1 sub Hand inv gear 4 2 12 name scale 0 mass -4 stat 1 5 stat 2 1 stat 8 16 sub % Ammunition gear 5 2 12 name type end end end mod arm armor 1 sub Hand end mod leg armor 1 mod leg armor 1 end ARCH Hunter-Destroyer roguechar sdl_sprite sdl_colors <152 70 97 122 88 193 208 228 21> Size 27 Biotech type genepool statline 23 25 12 17 8 12 10 4 skill 6 7 skill 7 7 skill 9 4 skill 10 7 skill 12 3 skill 13 5 mod arm armor 6 sub BeamGun 6 name range 10 BV 3 type end mod arm armor 6 sub BeamGun 6 name range 10 BV 3 type end mod body armor 5 sub BeamGun 4 name range 5 BV 5 Melee 9 name type end mod leg armor 6 mod leg armor 6 mod leg armor 6 mod leg armor 6 end ARCH Hunter-Berserker Size 21 Biotech roguechar sdl_sprite sdl_colors <152 70 97 122 88 193 8 239 51> genepool type statline 19 17 16 15 6 7 5 4 Regen skill 8 7 skill 9 4 skill 6 7 skill 10 8 skill 12 5 skill 13 8 mod head armor 5 sub Melee 10 name type end mod body armor 5 sub BeamGun 7 name range 5 BV 5 end mod leg armor 5 mod leg armor 5 mod leg armor 5 mod leg armor 5 end ARCH Hunter-Slayer roguechar sdl_sprite sdl_colors <152 70 97 122 88 193 208 39 51> Size 19 Biotech genepool type statline 22 17 16 15 5 8 8 4 skill 8 7 skill 9 4 skill 6 7 skill 10 7 skill 12 2 skill 13 4 skill 18 7 mod body armor 4 sub Melee 9 name type BeamGun 7 name range 10 BV 3 type end mod leg armor 5 mod leg armor 5 mod tail armor 4 sub Melee 7 recharge 6 name Type end end ARCH Hunter-Killer Size 15 Biotech genepool roguechar sdl_sprite sdl_colors <152 70 97 122 88 193 208 39 51> EvolveAt 25000 type statline 18 15 15 14 7 5 13 4 skill 8 5 skill 6 7 skill 10 6 skill 12 1 skill 13 2 mod head armor 4 sub Melee 6 name end mod body armor 4 sub BeamGun 5 name range 5 end mod leg armor 4 mod leg armor 4 mod leg armor 4 mod leg armor 4 end ARCH Hunter-Drone Size 13 Biotech roguechar sdl_sprite sdl_colors <105 90 110 150 112 89 166 47 32> genepool EvolveAt 15000 type statline 16 15 16 10 6 5 7 4 skill 8 7 skill 9 4 skill 10 8 mod head armor 3 sub Melee 5 name end mod body armor 3 mod leg armor 3 mod leg armor 3 mod leg armor 3 mod leg armor 3 end ARCH Hunter-Scout Size 9 Biotech roguechar genepool sdl_sprite sdl_colors <60 110 118 150 112 89 166 47 32> EvolveAt 10000 type statline 16 14 18 17 7 5 8 4 skill 8 6 skill 9 4 skill 10 7 skill 11 5 skill 25 7 mod head armor 3 sub Melee 4 name end mod body armor 3 mod leg armor 3 mod leg armor 3 mod leg armor 3 mod leg armor 3 end ARCH Hunter-Larva Size 3 Biotech roguechar type genepool sdl_Sprite sdl_colors <155 70 100 170 160 230 241 210 30> EvolveAt 5000 DomTarget 22 statline 7 13 13 6 1 2 1 2 skill 8 4 skill 9 4 skill 10 5 mod head armor 2 sub Melee 4 name type recharge 4 end mod body armor 2 mod tail armor 2 end ARCH Sentinel Size 40 metal type sdl_sprite sdl_colors <234 180 88 199 188 162 255 107 83> statline 16 35 10 15 10 10 10 1 % Begin Science block. clue29 GoPelt GoMeat .stcdesc .fooddesc GoFail GoDone Msg1 Msg2 Msg3 Msg4 % End Science block. skill 6 5 skill 7 5 skill 10 5 skill 13 10 skill 26 10 skill 30 10 mod turret armor 5 sub mount inv gear 4 3 25 name stat 2 1 end end mod turret armor 5 sub mount inv gear 4 3 15 name scale 0 mass 5 stat 1 10 stat 2 1 stat 3 1 stat 4 8 end end mod turret armor 5 sub mount inv gear 4 3 15 name scale 0 mass 5 stat 1 10 stat 2 1 stat 3 1 stat 4 8 end end mod body armor 5 sub HoverJet 10 end end Arch Dark Dragon statline 22 27 21 23 17 28 12 14 type roguechar sdl_sprite sdl_colors <80 90 80 200 180 100 255 0 0> size 64 skill 6 12 skill 7 12 skill 8 12 skill 9 12 skill 10 12 skill 12 10 skill 13 15 skill 26 15 skill 30 15 skill 36 15 mod head armor 5 sub Melee 17 name BeamGun 5 name BV 7 type end mod body armor 5 mod leg armor 5 mod leg armor 5 mod leg armor 5 mod leg armor 5 mod tail armor 5 end Arch Emperor Fire Penguin statline 14 10 16 15 6 7 2 10 type roguechar

genepool SDL_SPRITE SDL_COLORS <208 34 51 234 180 88 244 216 28> CHAT_ATTACK size 25 DomTarget 25 skill 6 8 skill 7 8 skill 8 8 skill 9 8 skill 10 10 skill 12 8 mod head sub emelee 12 name type end mod body sub BeamGun 8 name type range 4 end mod arm name sub MLauncher 1 name type range 9 magazine 20 sub rockets 1 end end mod arm name sub MLauncher 1 name type range 9 magazine 20 sub rockets 1 end end mod leg mod leg end Arch Fire Penguin statline 13 8 14 14 5 7 2 12 type SDL_SPRITE SDL_COLORS <166 47 32 230 230 230 244 215 28> roguechar

genepool EvolveAt 12500 size 5 DomTarget 15 skill 6 5 skill 7 5 skill 8 5 skill 9 3 skill 10 3 mod head sub emelee 3 name type end mod body mod arm name mod arm name mod leg mod leg end Arch Street Punk statline 9 9 9 9 8 8 8 8 size 6 roguechar

type SDL_SPRITE SDL_COLORS <56 26 81 170 112 90 168 133 230> CHAT_ATTACK1 CHAT_ATTACK2 CHAT_ATTACK3 skill 6 1 skill 7 1 skill 8 1 skill 9 1 skill 10 1 mod head mod body mod arm sub hand inv gear 4 2 12 name mass -4 stat 1 5 stat 2 1 recharge 3 stat 8 16 sub gear 5 2 12 name type end end end mod arm sub hand end mod leg mod leg end Arch Street Punk statline 9 9 9 9 8 8 8 8 size 3 roguechar

type SDL_SPRITE SDL_COLORS <56 26 81 170 112 90 230 107 83> CHAT_ATTACK1 CHAT_ATTACK2 CHAT_ATTACK3 skill 6 1 skill 7 1 skill 8 1 skill 9 1 skill 10 1 mod head mod body mod arm sub hand inv gear 4 2 2 name mass -1 stat 1 2 stat 3 3 stat 8 8 sub gear 5 2 2 end end end mod arm sub hand end mod leg mod leg end Arch Street Punk statline 9 9 9 9 8 8 8 8 size 2 roguechar

SDL_SPRITE SDL_COLORS <56 26 81 170 112 90 66 121 80> type CHAT_ATTACK1 CHAT_ATTACK2 CHAT_ATTACK3 skill 6 1 skill 7 1 skill 8 1 skill 9 1 skill 10 1 mod head mod body mod arm sub hand inv gear 4 0 3 name mass 2 stat 2 -2 stat 3 3 end end mod arm sub hand end mod leg mod leg end Arch Street Punk statline 9 9 9 9 8 8 8 8 size 1 roguechar

type SDL_SPRITE SDL_COLORS <56 26 81 170 112 90 123 63 0> CHAT_ATTACK1 CHAT_ATTACK2 CHAT_ATTACK3 skill 6 1 skill 7 1 skill 8 1 skill 9 1 skill 10 1 mod head mod body mod arm sub hand end mod arm sub hand end mod leg mod leg end Arch Bandit statline 13 13 14 12 8 8 8 8 size 12 roguechar type SDL_SPRITE SDL_COLORS <112 28 28 150 112 89 136 151 50> CHAT_ATTACK1 CHAT_ATTACK2 CHAT_ATTACK3 skill 6 5 skill 7 5 skill 8 6 skill 9 5 skill 10 4 mod head armor 1 mod body armor 1 mod arm armor 1 sub Hand inv gear 4 2 6 name mass -2 stat 1 7 stat 2 -1 Recharge 3 stat 4 3 stat 8 40 sub % Ammunition gear 5 2 6 end end end mod arm armor 1 sub Hand end mod leg armor 1 mod leg armor 1 end Arch Bandit statline 13 13 14 12 8 8 8 8 size 8 roguechar type SDL_SPRITE SDL_COLORS <112 28 28 150 112 89 116 100 13> CHAT_ATTACK1 CHAT_ATTACK2 CHAT_ATTACK3 skill 6 7 skill 7 5 skill 8 6 skill 9 5 skill 10 5 mod head armor 1 mod body armor 1 mod arm armor 1 sub % Hand gear 7 0 0 inv gear 4 2 2 name scale 0 stat 1 5 stat 4 2 stat 8 90 sub % Ammunition gear 5 2 2 end end end mod arm armor 1 sub % Hand gear 7 0 0 inv gear 4 0 6 name scale 0 end end mod leg armor 1 mod leg armor 1 end Arch Bandit statline 13 13 14 12 8 8 8 8 size 4 roguechar type SDL_SPRITE SDL_COLORS <112 28 28 150 112 89 56 26 81> CHAT_ATTACK1 CHAT_ATTACK2 CHAT_ATTACK3 skill 6 4 skill 7 5 skill 8 5 skill 9 5 skill 10 5 mod head armor 1 mod body armor 1 mod arm armor 1 sub % Hand Hand end mod arm armor 1 sub Hand inv gear 4 0 6 name scale 0 end end mod leg armor 1 mod leg armor 1 end ARCH Morlock roguechar type statline 13 15 12 13 10 11 7 10 sdl_sprite sdl_colors <115 95 85 170 160 130 112 50 50> size 8 skill 6 2 skill 7 1 skill 8 5 skill 9 4 skill 10 5 skill 11 7 mod head mod body mod arm name sub hand inv melee 11 mass 3 name type end end mod arm name sub hand end inv Shield 2 name mass 2 end mod leg name mod leg name end ARCH Morlock roguechar type statline 13 15 12 13 10 11 7 10 sdl_sprite sdl_colors <115 95 85 170 160 130 112 50 50> size 6 skill 6 2 skill 7 1 skill 8 5 skill 9 4 skill 10 5 skill 11 7 mod head mod body mod arm name sub hand inv melee 8 mass 2 name type end end mod arm name sub hand end inv Shield 2 name mass 2 end mod leg name mod leg name end ARCH Morlock roguechar type sdl_sprite sdl_colors <115 95 85 170 160 130 112 50 50> statline 13 15 12 13 10 11 7 10 size 5 skill 6 2 skill 7 1 skill 8 5 skill 9 4 skill 10 5 skill 11 7 mod head mod body mod arm name sub hand end mod arm name sub hand end mod leg name mod leg name end ARCH Corpse Eater SDL_SPRITE SDL_COLORS <84 97 85 191 205 229 244 206 48> roguechar type statline 12 15 10 15 4 7 1 1 size 7 skill 8 5 skill 10 2 skill 13 6 skill 11 4 skill 18 3 mod head armor 3 sub EMelee 2 name Melee 4 name end mod body end ARCH Fire Toad SDL_SPRITE SDL_COLORS <172 61 97 228 34 51 50 200 0> roguechar type statline 10 17 9 10 2 2 2 2 % Begin SURVIVAL block. clue14 GoPelt GoCheckMeat .stcdesc .food GoFail GoDone Msg1 Msg2 Msg3 Msg4 % End SURVIVAL block. size 9 DomTarget 19 skill 6 3 skill 8 5 skill 9 3 skill 10 1 skill 18 6 skill 13 5 mod head armor 1 sub gear 4 0 7 name beamgun 6 name type range 6 Recharge 1 end mod body armor 2 mod leg armor 1 name mod leg armor 1 name mod leg armor 1 name mod leg armor 1 name end ARCH Spike Toad SDL_SPRITE SDL_COLORS <101 72 42 245 200 170 34 216 244> roguechar type % Begin SURVIVAL block. clue14 GoPelt .stcdesc GoFail GoDone Msg1 Msg2 Msg3 % End SURVIVAL block. statline 10 16 10 7 2 2 2 2 size 13 DomTarget 23 skill 8 6 skill 9 4 skill 10 2 skill 18 5 skill 13 5 mod head armor 1 sub gear 4 0 6 name end mod body armor 4 mod leg armor 3 name mod leg armor 3 name mod leg armor 4 name mod leg armor 4 name end ARCH Giant Frog SDL_SPRITE SDL_COLORS <45 85 80 112 127 98 244 216 35> roguechar type % Begin SURVIVAL block. clue14 GoPelt .stcdesc GoFail GoDone Msg1 Msg2 Msg3 % End SURVIVAL block. statline 8 11 10 9 2 2 2 2 size 4 DomTarget 14 skill 8 4 skill 10 2 skill 18 1 skill 13 5 mod head sub gear 4 0 6 name end mod body mod leg name mod leg name mod leg name mod leg name end ARCH Giant Leech SDL_SPRITE SDL_COLORS <140 105 81 136 141 101 130 143 114> roguechar type statline 7 8 3 4 1 1 1 1 size 1 skill 8 2 skill 12 15 mod body sub melee 1 name ACC 2 recharge 7 end end ARCH Marsh Lobster roguechar SDL_SPRITE SDL_COLORS <134 141 101 144 161 111 168 153 230> type % Begin SURVIVAL block. clue14 GoPelt .stcdesc GoFail GoDone Msg1 Msg2 Msg3 % End SURVIVAL block. statline 12 14 8 11 5 7 4 6 size 4 DomTarget 15 skill 9 4 skill 10 2 skill 13 3 mod body armor 2 mod arm armor 1 name mod arm armor 1 name end ARCH Rock Lobster roguechar SDL_SPRITE SDL_COLORS <150 112 89 80 80 85 234 180 88> type % Begin SURVIVAL block. clue14 GoPelt .shielddesc GoCheckSushi .stcdesc GoFail GoDone Msg1 Msg2 Msg3 Msg4 % End SURVIVAL block. statline 13 20 9 11 5 7 4 5 size 8 DomTarget 18 skill 9 4 skill 10 1 skill 13 8 mod body armor 4 mod arm armor 4 name mod arm armor 4 name end ARCH Deep Lobster roguechar SDL_SPRITE SDL_COLORS <45 26 91 6 42 120 77 121 119> type % Begin SURVIVAL block. clue14 GoPelt .shielddesc GoCheckSushi .stcdesc GoFail GoDone Msg1 Msg2 Msg3 Msg4 % End SURVIVAL block. statline 17 29 6 13 5 8 8 3 size 17 DomTarget 21 skill 6 4 skill 9 4 skill 10 3 skill 13 12 mod body armor 5 sub BeamGun 3 name Range 5 type end mod arm armor 5 name type mod arm armor 5 name type end ARCH BioSentry SDL_SPRITE SDL_COLORS <225 136 170 242 110 25 220 0 240> roguechar type statline 10 10 10 10 10 10 10 10 size 3 Biotech skill 6 3 skill 10 3 skill 11 3 mod head armor 2 sub BeamGun 5 name acc 1 end mod body armor 2 mod leg armor 2 mod leg armor 2 mod leg armor 2 mod leg armor 2 end ARCH Guardbot roguechar sdl_sprite sdl_colors <199 188 162 157 173 182 200 150 50> type statline 10 15 10 16 10 1 1 1 % Begin SCIENCE block. clue29 GoPelt .stcdesc GoFail GoDone Msg1 Msg2 Msg3 % End SCIENCE block. metal size 9 skill 6 2 skill 8 2 skill 10 2 mod body armor 3 sub Melee 8 name special recharge 1 mount inv gear 4 2 6 name mass -2 stat 1 7 stat 2 -1 stat 4 3 stat 8 40 sub % Ammunition gear 5 2 6 end end end end ARCH Murder Machine roguechar SDL_SPRITE SDL_COLORS <166 47 32 201 205 225 210 0 100> type statline 13 16 11 13 16 1 1 1 % Begin SCIENCE block. clue29 GoPelt .stcdesc GoFail GoDone Msg1 Msg2 Msg3 % End SCIENCE block. metal size 19 skill 8 10 skill 10 5 skill 13 10 skill 33 10 Talent 8 Talent 7 mod body armor 5 sub mount inv melee 16 acc 1 speed 3 name mass 4 type end end end ARCH Workbot roguechar SDL_SPRITE SDL_COLORS <157 172 183 130 143 114 230 60 0> type CHAT_ATTACK CHAT_ATTACK2 statline 10 15 7 8 15 1 1 1 % Begin SCIENCE block. clue29 GoPelt .stcdesc GoFail GoDone Msg1 Msg2 Msg3 % End SCIENCE block. metal size 2 skill 8 1 mod body armor 2 sub mount inv melee 14 acc 1 name mass 4 end end end ARCH Arachnoid Drone SDL_SPRITE SDL_COLORS <72 104 136 150 150 150 220 0 0> roguechar type % Begin SCIENCE block. clue29 GoPelt .stcdesc GoFail GoDone Msg1 Msg2 Msg3 % End SCIENCE block. statline 11 13 13 11 11 1 1 1 metal size 7 skill 6 1 skill 8 1 skill 10 1 mod body armor 2 sub mount inv gear 4 4 1 name stat 1 8 stat 3 5 stat 8 64 sub gear 5 4 1 end end end mod leg armor 2 mod leg armor 2 mod leg armor 2 mod leg armor 2 end ARCH Arachnoid Drone SDL_SPRITE SDL_COLORS <72 104 136 150 150 150 220 0 0> roguechar type % Begin SCIENCE block. clue29 GoPelt .stcdesc GoFail GoDone Msg1 Msg2 Msg3 % End SCIENCE block. statline 11 13 13 11 11 1 1 1 metal size 6 skill 6 1 skill 8 1 skill 10 1 mod body armor 2 sub mount inv gear 4 2 6 name mass -2 stat 1 7 stat 2 -1 stat 4 3 stat 8 40 sub % Ammunition gear 5 2 6 end end end mod leg armor 2 mod leg armor 2 mod leg armor 2 mod leg armor 2 end ARCH Arachnoid Drone roguechar SDL_SPRITE SDL_COLORS <72 104 136 150 150 150 220 0 0> type % Begin SCIENCE block. clue29 GoPelt .stcdesc GoFail GoDone Msg1 Msg2 Msg3 % End SCIENCE block. statline 11 13 13 11 11 1 1 1 metal size 3 skill 6 1 skill 8 1 skill 10 1 mod body armor 2 sub mount inv gear 4 2 2 name stat 1 5 stat 2 1 stat 4 2 stat 8 90 sub % Ammunition gear 5 2 2 end end end mod leg armor 2 mod leg armor 2 mod leg armor 2 mod leg armor 2 end ARCH Gremlin roguechar sdl_sprite sdl_colors <70 121 119 49 91 159 244 215 28> type statline 11 5 13 9 16 8 7 6 size 1 Biotech skill 8 1 skill 9 2 skill 15 1 skill 23 1 DomTarget 17 mod head mod body mod arm sub hand end mod arm sub hand end mod leg mod leg end ARCH Archaeopteryx roguechar type sdl_sprite sdl_colors <170 50 32 70 121 120 0 200 150> statline 10 2 11 7 2 3 2 2 size 1 skill 8 1 skill 9 2 skill 10 1 DomTarget 16 mod head sub gear 4 0 1 name end mod body mod wing mod wing mod leg mod leg mod tail end ARCH Velociraptor roguechar type SDL_SPRITE SDL_COLORS <170 120 89 0 0 0 0 200 100> % Begin SURVIVAL block. clue14 GoPelt .stcdesc GoFail GoDone Msg1 Msg2 Msg3 % End SURVIVAL block. statline 14 13 16 11 8 7 2 5 DomTarget 23 size 8 skill 8 4 skill 9 4 skill 10 2 skill 13 2 mod head armor 1 mod body armor 1 mod arm armor 1 mod arm armor 1 mod leg armor 1 sub gear 4 0 5 name end mod leg armor 1 sub gear 4 0 5 name end end ARCH Oviraptor roguechar type SDL_SPRITE SDL_COLORS <146 161 101 0 0 0 214 216 28> % Begin SURVIVAL block. clue14 GoPelt .stcdesc GoFail GoDone Msg1 Msg2 Msg3 % End SURVIVAL block. statline 10 6 11 13 8 7 2 5 DomTarget 17 size 2 skill 8 2 skill 9 2 skill 12 2 mod head armor 1 mod body armor 1 mod arm armor 1 mod arm armor 1 mod leg armor 1 sub gear 4 0 3 name end mod leg armor 1 sub gear 4 0 3 name end end ARCH Iron Crab SDL_SPRITE SDL_COLORS <136 191 225 170 178 187 179 0 210> roguechar type % Begin SURVIVAL block. clue14 GoPelt .stcdesc GoFail GoDone Msg1 Msg2 Msg3 % End SURVIVAL block. statline 10 15 5 9 1 1 1 1 DomTarget 21 size 6 skill 8 6 skill 10 1 skill 12 7 skill 13 6 skill 18 5 mod body armor 5 mod arm armor 5 sub gear 4 0 5 name end mod arm armor 5 sub gear 4 0 5 name end mod leg armor 5 mod leg armor 5 mod leg armor 5 mod leg armor 5 end ARCH Crab SDL_SPRITE SDL_COLORS <204 51 85 200 144 64 208 93 8> roguechar type % Begin SURVIVAL block. clue14 GoPelt .stcdesc GoFail GoDone Msg1 Msg2 Msg3 % End SURVIVAL block. statline 9 9 6 8 1 1 1 1 DomTarget 13 size 3 skill 8 3 skill 12 4 skill 13 1 skill 18 2 mod body armor 3 mod arm armor 2 sub gear 4 0 3 name end mod arm armor 2 sub gear 4 0 3 name end mod leg armor 2 mod leg armor 2 mod leg armor 2 mod leg armor 2 end ARCH Dragon Viper SDL_SPRITE roguechar type % Begin SURVIVAL block. clue14 GoPelt GoFood .heartdesc .stcdesc GoFail GoDone Msg1 Msg2 Msg3 Msg4 % End SURVIVAL block. statline 15 16 16 11 4 19 2 2 size 17 DomTarget 22 skill 6 6 skill 8 7 skill 9 4 skill 10 7 skill 12 3 skill 36 7 mod head armor 4 sub gear 4 0 7 name type Recharge 5 Acc 2 BeamGun 8 name type BV 1 recharge 3 range 6 end mod body armor 4 mod tail armor 4 end ARCH Swamp Viper SDL_SPRITE SDL_COLORS <84 97 85 191 205 229 244 206 48> roguechar type statline 13 5 12 7 2 3 2 2 size 6 DomTarget 21 skill 8 3 skill 9 4 skill 10 2 mod head armor 2 sub gear 4 0 6 name type Acc 1 end mod body armor 2 mod tail armor 2 end ARCH Dragon Serpent SDL_SPRITE SDL_COLORS <36 46 22 200 50 0 56 28 81> genepool EvolveAt 20000 % Begin SURVIVAL block. clue14 GoPelt GoFood .heartdesc .stcdesc GoFail GoDone Msg1 Msg2 Msg3 Msg4 % End SURVIVAL block. roguechar type statline 12 13 12 5 2 16 2 2 size 4 DomTarget 18 skill 6 1 skill 8 3 skill 9 4 skill 10 1 skill 13 2 skill 36 3 mod head armor 1 sub gear 4 3 4 name stat 1 4 stat 3 1 stat 4 2 gear 4 0 5 name stat 3 5 end mod body armor 1 mod tail armor 1 end ARCH Flying Polyp roguechar SDL_SPRITE SDL_COLORS <235 150 0 208 30 90 0 0 0> statline 13 15 9 10 2 2 1 1 size 15 skill 6 5 skill 8 7 skill 10 5 skill 12 5 skill 13 3 skill 36 4 type mod body sub BeamGun 1 name range 6 type EMelee 7 name Type EMelee 7 name Type end end ARCH Stinger roguechar SDL_SPRITE SDL_COLORS <170 150 235 122 88 199 0 0 0> statline 11 7 10 1 1 1 1 1 size 11 skill 8 6 skill 10 3 skill 13 8 skill 36 4 type mod body sub EMelee 7 name Type EMelee 7 name Type EMelee 7 name Type end end ARCH Green Jelly SDL_SPRITE SDL_COLORS <136 141 80 244 216 28 244 216 28> roguechar type statline 8 14 4 7 1 1 1 1 size 8 skill 8 5 skill 10 1 skill 12 3 skill 13 10 skill 36 29 mod body sub % The tentacles act like EMWs since they go through armor gear 4 1 5 stat 1 2 name type gear 4 1 5 stat 1 2 name type gear 4 1 5 stat 1 2 name type end end ARCH Icky Slime SDL_SPRITE SDL_COLORS <168 153 230 166 47 32 166 47 32> roguechar type statline 5 6 7 5 1 1 1 1 size 2 skill 8 1 skill 36 15 mod body sub % The tentacles act like EMWs since they go through armor gear 4 1 1 name gear 4 1 1 name gear 4 1 1 name end end ARCH Dragon Rat roguechar SDL_SPRITE SDL_COLORS <55 153 93 174 68 42 221 0 132> type % Begin SURVIVAL block. clue14 GoPelt GoFood .heartdesc .stcdesc GoFail GoDone Msg1 Msg2 Msg3 Msg4 % End SURVIVAL block. statline 13 12 15 9 9 7 5 5 size 14 DomTarget 20 skill 8 7 skill 9 3 skill 10 8 skill 12 4 skill 13 10 skill 36 7 mod head armor 3 sub gear 4 0 5 name stat 3 1 gear 4 3 2 name type stat 1 2 stat 3 1 stat 4 4 end mod body armor 3 mod leg armor 3 name sub gear 4 0 4 name end mod leg armor 3 name sub gear 4 0 4 name end mod leg armor 3 name mod leg armor 3 name mod tail armor 3 sub gear 4 0 5 name end end ARCH Death Rat roguechar SDL_SPRITE SDL_COLORS <119 123 178 234 195 0 217 103 126> type % Begin SURVIVAL block. clue14 GoPelt .stcdesc GoFail GoDone Msg1 Msg2 Msg3 % End SURVIVAL block. statline 11 7 14 8 8 6 2 2 size 9 DomTarget 18 skill 8 7 skill 9 4 skill 10 6 skill 12 2 mod head armor 1 sub gear 4 0 6 name end mod body armor 1 mod leg armor 1 name sub gear 4 0 3 name stat 3 1 end mod leg armor 1 name sub gear 4 0 3 name stat 3 1 end mod leg armor 1 name mod leg armor 1 name mod tail armor 1 end ARCH Two Headed Rat roguechar SDL_SPRITE SDL_COLORS <174 68 42 234 195 0 217 123 166> type % Begin SURVIVAL block. clue14 GoPelt .stcdesc GoFail GoDone Msg1 Msg2 Msg3 % End SURVIVAL block. statline 10 4 10 8 8 6 2 2 size 5 DomTarget 15 skill 8 4 skill 9 2 skill 10 2 skill 12 6 skill 13 5 mod head sub gear 4 0 6 name end mod head sub gear 4 0 6 name end mod body mod leg name mod leg name mod leg name mod leg name mod tail end ARCH Plague Rat roguechar SDL_SPRITE SDL_COLORS <167 144 59 110 133 62 217 132 217> type % Begin SURVIVAL block. clue14 GoPelt .stcdesc GoFail GoDone Msg1 Msg2 Msg3 % End SURVIVAL block. statline 10 3 10 8 8 6 2 2 size 7 skill 8 6 skill 9 2 skill 10 2 skill 12 1 skill 13 5 mod head sub gear 4 0 6 name type recharge 1 end mod body mod leg name type mod leg name type mod leg name type mod leg name type mod tail end ARCH Radioactive Rat roguechar SDL_SPRITE SDL_COLORS <65 174 42 65 174 42 220 250 26> type statline 8 1 9 8 6 5 2 2 size 2 skill 8 3 mod head sub gear 4 0 9 name Acc 1 recharge 5 mass -15 type end mod body mod leg name mod leg name mod leg name mod leg name mod tail end ARCH Thunder Rat roguechar SDL_SPRITE SDL_COLORS <234 195 0 125 120 110 217 123 166> CHAT_SAFE CHAT_SAFE2 genepool statline 14 10 16 10 10 9 7 13 size 12 DomTarget 30 skill 6 4 skill 8 3 skill 9 3 skill 10 6 skill 12 5 skill 13 3 mod head armor 1 sub gear 4 0 5 name end mod body armor 1 sub gear 4 3 9 name Range 8 Recharge 1 BV 5 type end mod leg armor 1 name mod leg armor 1 name mod leg armor 1 name mod leg armor 1 name mod tail armor 1 sub gear 4 3 7 name Range 6 Recharge 3 type end end ARCH Electric Rat roguechar genepool EvolveAt 3000 SDL_SPRITE SDL_COLORS <234 195 0 125 120 110 217 123 166> CHAT_SAFE CHAT_SAFE2 type % Begin SURVIVAL block. clue14 GoPelt GoFail GoDone Msg1 Msg2 Msg3 % End SURVIVAL block. statline 8 4 14 8 8 6 3 9 size 4 DomTarget 10 skill 6 1 skill 8 3 skill 9 1 skill 10 2 skill 13 1 skill 27 3 mod head sub gear 4 0 1 name stat 3 1 end mod body mod leg name mod leg name mod leg name mod leg name mod tail sub gear 4 3 2 name Range 2 Recharge 3 type end end ARCH Rat roguechar SDL_SPRITE SDL_COLORS <174 68 42 174 68 42 217 123 166> % Begin SURVIVAL block. clue14 GoPelt .stcdesc GoFail GoDone Msg1 Msg2 Msg3 % End SURVIVAL block. type statline 8 1 10 8 8 6 2 2 size 1 DomTarget 12 skill 8 3 skill 9 2 skill 10 1 skill 12 1 mod head sub gear 4 0 2 name stat 3 1 end mod body mod leg name mod leg name mod leg name mod leg name mod tail end GearHead/Series/TS_GSP_Rats_PLOT_Catcher.txt0000644000175000017500000003123210205741230017461 0ustar kaolkaolPlot 0 name % A basement has been infested with rats. The PC will be hired to % go get rid of them. element1 element2 % P1 = Time Limit % P2 = Combat Indicator % P3 = Have accepted mission/Received email cleanup start GoCheckTime GoDelete % Combat check. If combat has been entered, V2=1. % After combat, V2=3 % if the player was victorious or V2=2 is the player lost. nu1 nu2 5min % Email message Msg1 <\ELEMENT 2 @ \ELEMENT 1 :// I've got a serious problem with rats in the basement. Can you help me?> Msg1_1 <\ELEMENT 2 @ \ELEMENT 1 :// Things are going bad as usual... giant killer rats have moved into my basement. Think you can help?> CMsg1_1 Msg1_2 <\ELEMENT 2 @ \ELEMENT 1 :// Rats in the basement. Come help.> CMsg1_2 Msg1_3 <\ELEMENT 2 @ \ELEMENT 1 :// This is serious! I have deadly rats in the basement. Come quickly.> CMsg1_3 Msg1_4 <\ELEMENT 2 @ \ELEMENT 1 :// Is this email working? I need help in \ELEMENT 1 . Please come if you're able.> CMsg1_4 Msg1_5 <\ELEMENT 2 @ \ELEMENT 1 :// This isn't a social call, I'm afraid. I've got dangerous vermin living in my basement. Please come and help me.> CMsg1_5 sub Persona 2 rumor % V4 = Reward to be offered greeting GoCheckLoss GoCheckMission % At the GoCheckFirst label, see if everything has been initialized. % If so just jump to GoCheckEmail. GoCheckFirst GoCheckEmail GoFirstTime GoNoFriend GoNoChance result1 GoStartCombat .scene .wmon result2 result3 result4 % 1 : The PC won the battle. Msg1 Msg1_1 CMsg1_1 Msg1_2 CMsg1_2 Msg1_3 CMsg1_3 Msg1_4 CMsg1_4 Msg1_5 CMsg1_5 % 2 : The PC lost the battle. Msg2 Msg2_1 CMsg2_1 Msg2_2 CMsg2_2 Msg2_3 CMsg2_3 Msg2_4 CMsg2_4 Msg2_5 CMsg2_5 % 3 : The PC has returned after getting ready. Msg3 Msg3_2 CMsg3_2 Msg3_3 CMsg3_3 % 4 : Did you get my email? Will you help? Msg4 Msg4_1 CMsg4_1 Msg4_2 CMsg4_2 Msg4_3 CMsg4_3 Msg4_4 CMsg4_4 Msg4_5 CMsg4_5 % 5 : NPC will ask PC to help with rat problem. Msg5 Msg5_1 CMsg5_1 Msg5_2 CMsg5_2 Msg5_3 <\ELEMENT 1 has a serious vermin problem. My own house has the biggest death rats you've ever seen... A few nights ago, they ate a neighbor's rottweiler. I need someone to destroy them and I can afford to pay $ \VAL V4 .> CMsg5_3 Msg5_4 CMsg5_4 Msg5_5 CMsg5_5 % 6 : NPC will mention rat problem dispassionately... Msg6 Msg6_1 CMsg6_1 Msg6_2 CMsg6_2 Msg6_3 CMsg6_3 Msg6_4 CMsg6_4 Msg6_5 CMsg6_5 % 7 : NPC will ask famous adventurer PC for help. Msg7 Msg7_1 CMsg7_1 Msg7_2 CMsg7_2 Msg7_3 CMsg7_3 Msg7_4 CMsg7_4 Msg7_5 CMsg7_5 % 8 : PC needs some time to get ready. Msg8 Msg8_2 CMsg8_2 Msg8_5 CMsg8_5 % 9 : PC has agreed to the mission; describe it it detail. Msg9 Msg9_1 CMsg9_1 Msg9_2 CMsg9_2 Msg9_3 CMsg9_3 Msg9_4 CMsg9_4 Msg9_5 CMsg9_5 % 10 : PC has refused the mission. Msg10 Msg10_1 CMsg10_1 Msg10_2 CMsg10_2 Msg10_3 CMsg10_3 Msg10_4 CMsg10_4 % 11 : Combat is starting. Msg11 Msg11_1 CMsg11_1 Msg11_2 CMsg11_2 Msg11_3 CMsg11_3 Msg11_4 CMsg11_4 Msg11_5 CMsg11_5 % 12 : Memo Msg12 <\ELEMENT 2 in \ELEMENT 1 asked you to clear the rats from \PPR E2 basement.> % 1 : PC will enter combat now. Prompt1 Prompt1_1 Prompt1_2 % 2 : PC needs more time to prepare. Prompt2 Prompt2_1 Prompt2_2 % 3 : PC agrees to help. Prompt3 Prompt3_1 Prompt3_2 % 4 : PC won't help. Prompt4 Prompt4_1 Prompt4_2 end GearHead/Series/TS_GSP_URB_Kidnapped_PLOT2_default.txt0000644000175000017500000000714410522266450021331 0ustar kaolkaolPlot 0 name % VARIABLES USED IN PLOT % V2 = Combat Indicator % The kidnapped victim has been traced to this town. % They're being held in a hotel in the industrial district, % and are about to become a live organ donor. The PC has to % find the one person in town who knows where N3 is, then % travel to the hotel and do some rescuing action-hero style. % % Element 1 is the town this takes place in % Element 2 is the character who knows about N3 % Element 3 is the girl being searched for % Element 4 is the prop used for E3 Element1 Element2 Element3 Element4 % If the NPC with the clue gets killed, we're gonna need % a different conclusion. start GoDelete .usekey % A cleanup trigger means that the story has been deleted; % just get rid of this plot, then. CLEANUP % Combat check. If combat has been entered, V2=1. NU1 sub Persona 2 rumor greeting GoBeenBefore result1 .hotelscene .enemydesc Msg1 Msg2 Msg3 <\ELEMENT 3 ? Yes, I think I may have seen this girl... She was with two men, one big muscular guy and a smaller one. I didn't get a good look at him. They were going to the "Golden Hotel".> Msg6 Prompt1 Plot 1 start GoCheckTime Msg1 sub Persona 3 greeting Msg1 Msg2 Msg3 end Plot 2 start GoCheckTime Msg1 <\PERSONA E3 , a relative of noted politician \NARRATIVE 2 , has been found murdered in \ELEMENT 1 . Evidence suggests that this is the work of organ thieves.> end inv STC VICTIM-1 use Clue16 Clue20 GoBanditsDead Msg1 Msg2 end GearHead/Series/TS_XRAN_TEXT_MarsNeedsClones.txt0000644000175000017500000000252410156037004020275 0ustar kaolkaol% Data found in the clone lab ******************** *TRIUMVIRATE PROGRAM ******************** :- BIOFAC LAB ALPHA Though disappoingly not connected to the Triumvirate, arcotec lab site Alpha has provided us with remarkable technology. Activation of the Triumvirate will require the living sacrifice of one of our greatest pilots; subsequently, it has been reccomended that the BioFac technology be used to create "backup copies". Creation of additional industrial BioFacs will be needed once the Triumvirate Genome is isolated. Acquisition of sufficient protomass to replicate the lost members of the Triumvirate may be problematic. :- TRJ-0 :- DESIG "LADON" :- STATUS DESTROYED Our attempts to locate the wreckage of TRJ-0 have so far proved unsuccessful. Historical records indicate that this unit's final battle took place over Zeta territory. Repeated searches around the area of Nara have all failed. Presumably, nothing remains of TRJ-0. :- TRJ-1 :- DESIG "CETUS" :- STATUS INCOMPLETE TRJ-1 has been located in Last Hope. Zeta did not complete work upon this unit, so it is thought to be nonviable. Our recon team will perform further research shortly. Even if activation proves impossible, samples of TRJ-1 may be instrumental in the replication of new units. :- TRJ-2 :- DESIG "TYPHON" :- STATUS UNKNOWN GearHead/Series/temp_newrelay_site.txt0000644000175000017500000001033210046222514017041 0ustar kaolkaolPlot 0 name <> % An item will be found. This item will lead to the next % clue; the PC can discover the next clue himself by examining % the item. element1 element2 element3 % E4 is the persona to control this plot. Element4 % V1 = Initialization Counter % V2 = Clue number for this plot % V3 = Have recovered clue from item % V4 = Combat Indicator % At startup, initialize the item. start GoCheckClue GoDelete .usekey % At cleanup just get rid of this plot. cleanup % Combat check. If combat has been entered, V4=1. % Combat ends in victory if the number of active masters on % team two drops to zero, or ends in defeat is the number of % active masters on team one drops to zero. After combat, V2=3 % if the player was victorious or V2=2 is the player lost. % Finally, if the player won, the calling story's faction victory % count (by default now story variable 101) will be increased. nu1 nu2 sub Persona 4 rumor <> % V1 = Mission Accepted Counter greeting GoJustEnd GoCheckLoss GoCheckMission GoDelete % Right now the PC has only one chance to get the mission- % be reasonably well liked. This can be altered so the PC % can get the mission if his traits are right, if he's been % given the mission by N1, or whatever else. GoCheckFirst GoNoChance GoAddComOps result1 % If the PC doesn't want this mission, the entire story will % be blocked. No point continuing if the player doesn't want... result2 % For the purposes of this template, I'll use a combat encounter with % the prop included. result3 GoStartCombat .mon .nu1 .nu2 result4 % 01 : PC has won the mission. Msg1 <> % 02 : PC has lost the mission. Msg2 <> % 03 : The item somehow got destroyed... Msg3 % 04 : Mission description. Msg4 <> % 05 : PC has come back after getting ready Msg5 <> % 06 : PC will not be offered the mission Msg6 <> % 07 : PC will be offered the mission here. Msg7 <> % 08 : The PC refused the mission. Msg8 <> % 09 : Memo Msg9 <\ELEMENT 4 in \SCENE EScene 4 asked you to retrieve an item.> % 10 : Combat is starting. Msg10 <> % 11 : The PC needs some time to get ready. Msg11 <> % 01 : PC will accept the mission. Prompt1 <> % 02 : PC doesn't want the mission. Prompt2 <> % 03 : Start the mission now. Prompt3 <> % 04 : PC needs time to prepare. Prompt4 end inv Prop 20 name % instead of investigation you can use Science(29), Mysticism(34), % CodeBreaking(32) or Survival(14) % V1 = Location of next encounter % V2 = Clue number for this item % V3 = Investigation Indicator % V4 = PC Investigation skill when last tried use GoNoSolve Clue37 GoDid Msg1 Msg2 end GearHead/Series/TS_TEXT_Entry_1.txt0000644000175000017500000000103707673354144015760 0ustar kaolkaol% ENTRY STORY 1 INTRODUCTORY TEXT August 21, NT157 The first thing you can remember is waking up in a hospital bed three months ago. \NARRATIVE 5 , a trapper, found you in the wilds just outside of Hogye. You were seriously wounded, confused and nearly dead. He brought you back to town where the townsfolk took you in and nursed you back to health. Since then, this village has become your home. You remember almost nothing of your previous life- your name, a vague recollection of your parents, but that is all. GearHead/Series/TS_GRD_PumpPusher_PLOT1_Evidence.txt0000644000175000017500000002537510105411644021112 0ustar kaolkaolPlot 0 name % An item will be found. This item will lead to the next % clue; the PC can discover the next clue himself by examining % the item. element1 element2 element3 % E4 is the persona to control this plot. Element4 % V1 = Initialization Counter % V2 = Clue number for this plot % V3 = Have recovered clue from item % V4 = Combat Indicator % At startup, initialize the item. start GoCheckClue GoDelete .usekey % At cleanup just get rid of this plot. cleanup nu1 GoLose sub Persona 4 rumor % V1 = Mission Accepted Counter % V2 = Randomizer greeting GoJustEnd GoCheckLoss GoCheckMission GoDelete GoCheckFirst GoNoChance GoAddComOps result1 % If the PC doesn't want this mission, the entire story will % be blocked. No point continuing if the player doesn't want... result2 result3 GoStartCombat .scene result4 % 01 : PC has won the mission. Msg1 Msg1_1 CMSg1_1 Msg1_2 CMSg1_2 Msg1_3 CMSg1_3 Msg1_4 CMSg1_4 Msg1_5 CMSg1_5 Msg1_6 CMSg1_6 % 02 : PC has lost the mission. Msg2 Msg2_1 CMSg2_1 Msg2_2 CMSg2_2 Msg2_3 CMSg2_3 Msg2_4 CMSg2_4 Msg2_5 CMSg2_5 Msg2_6 CMSg2_6 % 03 : The item somehow got destroyed... Msg3 % 04 : Mission description. Msg4 Msg4_1 CMSg4_1 Msg4_2 CMSg4_2 Msg4_3 CMSg4_3 Msg4_4 CMSg4_4 Msg4_5 CMSg4_5 Msg4_6 CMSg4_6 % 05 : PC has come back after getting ready Msg5 Msg5_1 % 06 : PC will not be offered the mission Msg6 Msg6_1 CMSg6_1 Msg6_2 CMSg6_2 Msg6_3 CMSg6_3 Msg6_4 CMSg6_4 Msg6_5 CMSg6_5 Msg6_6 CMSg6_6 % 07 : PC will be offered the mission here. Msg7 Msg7_1 CMSg7_1 Msg7_2 CMSg7_2 Msg7_3 CMSg7_3 Msg7_4 CMSg7_4 Msg7_5 CMSg7_5 Msg7_6 <\PC , I need your help to investigate the "Pump Pushers". We must act quickly before more people die.> CMSg7_6 % 08 : The PC refused the mission. Msg8 % 09 : Memo Msg9 <\ELEMENT 4 in \SCENE EScene 4 asked you to search for clues related to the "Pump Pushers".> % 10 : Combat is starting. Msg10 Msg10_1 CMSg10_1 Msg10_2 CMSg10_2 Msg10_3 CMSg10_3 Msg10_4 CMSg10_4 Msg10_5 CMSg10_5 Msg10_6 CMSg10_6 % 11 : The PC needs some time to get ready. Msg11 Msg11_1 % 01 : PC will accept the mission. Prompt1 Prompt1_1 % 02 : PC doesn't want the mission. Prompt2 Prompt2_1 % 03 : Start the mission now. Prompt3 Prompt3_1 % 04 : PC needs time to prepare. Prompt4 Prompt4_1 end inv STC FILINGCABINET % instead of investigation you can use Science(29), Mysticism(34), % CodeBreaking(32) or Survival(14) % V1 = Location of next encounter % V2 = Clue number for this item % V3 = Investigation Indicator % V4 = PC Investigation skill when last tried use GoNoSolve Clue37 GoDid Msg1 Msg2 end GearHead/Series/TS_Scene_Convoy1.txt0000644000175000017500000001375410111131710016224 0ustar kaolkaolScene 0 2 % V1 = Chat Status with Transport Driver % if 1 then driver has already spoken. % if 2 then driver ready to surrender. % V2 = Amount PC can steal % V3 = Amount PC will be offered to leave truck alone WildMap Start NU1 NU2 sub Team 1 Team 2 SetEnemy 1 SetAlly 3 Team 3 Stat 1 4 Persona -1 % V1 = Message Randomizer % V2 = Chatted before greeting GoNoSurrender GoAlreadySaid result1 result2 result3 result4 result5 result6 result7 result8 result9 result10 result11 GoR11Maybe GoR11Fight GoR11Bargain result12 result13 result14 result15 result16 result17 Msg1 Msg2 Msg3 Msg4 Msg5 Msg6 Msg7 Msg8 Msg9 Msg10 Msg11 Msg12 Msg13 Msg14 Msg15 Msg16 Msg17 Msg18 Msg19 Msg20 Msg21 Msg22 Msg23 Msg24 Msg25 Msg26 Msg27 Msg28 Msg29 Msg30 Msg31 Msg32 Msg33 Msg34 Msg35 Msg36 Msg37 Msg38 Msg39 Msg40 Prompt1 Prompt2 Prompt3 Prompt4 Prompt5 Prompt6 Prompt7 Prompt8 Prompt9 Prompt10 Prompt11 Prompt12 Prompt13 Prompt14 Prompt15 Prompt16 Prompt17 end inv GroundHugger 8 name MidX MidY update SetTeam 3 sub mod Body armor 8 mass 81 sub Sensor 1 CPIT sub NPC Trucker SetPersona -1 end hoverjet 6 end end end GearHead/Series/TS_MIL_Default_STORY.txt0000644000175000017500000000277010476274036016661 0ustar kaolkaolStory name % Nothing much exciting going on, except that more mecha combat % missions than usual will be offered. % Element 1 is the calling faction. Always. Forever. Element2 Element3 rumor % V1 = Time Limit % V101 = Faction Victory Count % V102 = Enemy Victory Count (if appropriate) % V103 = How many times PC fought for faction % V104 = How many times PC fought against faction % This story will last for 2 - 5 days. start GoCheckTime % Every hour, it will attempt to load a plot. hour .plotname % Every quarter, print a new news story. quarter Msg1 <\NARRATIVE 3 under fire as \NARRATIVE 1 skirmishes with \NARRATIVE 2 invaders.> Msg2 Msg3 Msg4 Msg5 GearHead/Series/TS_XRAN_SCENE_MarsNeedsClones.txt0000644000175000017500000000256510155723140020355 0ustar kaolkaolScene 0 0 % The complex where the PC will meet the mad scientist, % find out about the faction hunting him, and maybe even % free the "original" from which the clones of his enemy % were made. % L1 = Player enemy % L2 = Scientist % L3 = Chat counter start map nu1 TM1 Msg1 <\PERSONA L2 strikes up a conversation with you.> Msg10 sub Team 1 SetEnemy 2 Team 2 SetEnemy 1 Set Ally 3 Team 3 home rect MFX 39 MFY 20 Width 8 Height 8 name end inv StairsUp XPos 5 YPos 26 USe Destination -1 STC BIOTANK name home use GoNoHero GoUsed Msg1 Msg2 Msg3 Msg4 Msg5 STC COMPUTER-1 use .text end GearHead/Series/PLOT_F2Hooch.txt0000644000175000017500000000765010034017744015245 0ustar kaolkaolPlot 0 name % No, it's not a ripoff... call it a "homage". element1 element2 element3 element4 start GoCheckE3 GoCheckTime GoDelete GoE3Died sub Persona 1 rumor greeting GoRealStart GoNoRescue GoFalseStart GoE3Died % The PC will be offered the mission only if he _isn't_ renowned. result1 GoR1NoRep result2 result3 .dname Msg1 Msg2 Msg3 Msg4 Msg5 Msg6 Msg7 Msg8 Prompt1 Prompt2 Prompt3 Persona 3 % V2 = Get heroism point. greeting GoRealStart GoFirstTime result1 result2 result3 result4 GoRescue Msg1 Msg3 Msg4 Msg5 Msg6 Msg7 Msg8 Prompt1 Prompt2 Prompt3 Prompt4 Plot 1 % Rescue has proceeded successfully. start GoCheckTime sub Persona 1 greeting GoBeenBefore Msg1 Persona 3 greeting Msg1 end end inv NPC Citizen chardesc Male end GearHead/Series/temp_leader.txt0000644000175000017500000001377507762474764015474 0ustar kaolkaolPlot 0 name % A leader will offer a combat mission. Yay! So what's different % between this one and the regular combat template? Well, first of % all this one isn't linked to a story, so it's good for making % independant PLOT_*.txt missions. Secondly, some of the things have % been rebalanced so a deserving PC will get the mission more easily % while an undeserving one won't. Leaders generally like Heroic, Lawful % types. % Element1 is just the leader of some town. element1 % ******************** % *** SCRIPT BLOCK *** % ******************** % V1 = Time Limit % V2 = Combat Indicator, if V2=1 combat has been entered % V3 = Email sent indicator. % Time limit. This plot will conclude in one day, or immediately % if NPC E2 is killed. start GoCheckTime GoDelete % Combat check. If combat has been entered, V2=1. % Combat ends in victory if the number of active masters on % team two drops to zero, or ends in defeat is the number of % active masters on team one drops to zero. After combat, V2=3 % if the player was victorious or V2=2 is the player lost. nu1 nu2 % Email check. The NPC might send the PC email about this mission. 5Min % ********************* % *** MESSAGE BLOCK *** % ********************* % 01 - 05 : Email Messages. % The NPC is offering the PC a mission via email. Msg1 <\PERSONA E1 @ \SCENE EScene 1 :// > Msg2 <\PERSONA E1 @ \SCENE EScene 1 :// > Msg3 <\PERSONA E1 @ \SCENE EScene 1 :// > Msg4 <\PERSONA E1 @ \SCENE EScene 1 :// > Msg5 <\PERSONA E1 @ \SCENE EScene 1 :// > sub % This next bit is the conversation which will happen when the % PC speaks to E1. Persona 1 % Fill in something for the rumor string, so the PC will know who % has a job to offer. !1 will add the name of the NPC. rumor <> % eg., rumor % ******************** % *** SCRIPT BLOCK *** % ******************** % V1 = Job offer counter, V1=1 is job offered, V1=-1 if job denied % V2 = Message Randomizer % V3 = Threat value of enemy mecha % V4 = Reward offered to PC for the mission greeting GoCheckLoss GoCheckMission % The first time the PC speaks to the NPC, initialize everything. GoCheckFirst GoCheckOffer % If the PC has "the right stuff", an offer will be made immediately. % If not, no offer will be made at all. In the example provided % below, "the right stuff" is a Lawful reputation + being liked. GoMakeOffer GoAddAcceptOps GoAddComOps GoNoOffer % If the mission was denied but not previously cleaned up, do % that now. GoDenied % PC will accept the job. Descibe the mission. result1 result2 result3 % PC refuses the job. result4 result5 result6 % PC will enter combat now. result7 GoStartCombat .nu1 .nu2 result8 % PC will ask how many points the enemy has. result9 result10 % PC needs some time to get ready. result11 result12 % ********************* % *** MESSAGE BLOCK *** % ********************* % 01 - 05 : Player has won the battle and is being paid. Msg1 <> Msg2 <> Msg3 <> Msg4 <> Msg5 <> % 06 - 10 : Player has lost the battle. Msg6 <> Msg7 <> Msg8 <> Msg9 <> Msg10 <> % 11 - 15 : PC got email about mission; asked to accept Msg11 <> Msg12 <> Msg13 <> Msg14 <> Msg15 <> % 16 - 20 : Player has "the right stuff"; will be offered mission. Msg16 <> Msg17 <> Msg18 <> Msg19 <> Msg20 <> % 21 - 25 : PC has accepted; describe the mission. Msg21 <> Msg22 <> Msg23 <> Msg24 <> Msg25 <> % 26 - 30 : Combat is starting Msg26 <> Msg27 <> Msg28 <> Msg29 <> Msg30 <> % 31 - 35 : Describe enemy point value Msg31 <> Msg32 <> Msg33 <> Msg34 <> Msg35 <> % 101 : Player is back from repairs, time to start mission. Msg101 % 102 : Player doesn't have "the right stuff" for this mission. Msg102 % 103 : Memo Msg103 <\ELEMENT 1 in \SCENE EScene 1 offered you a mission.> % 104 : PC didn't want the job. Msg104 % 105 : PC needs time to get ready. Msg105 % 01 - 03 : PC will accept the mission. Prompt1 <> Prompt2 <> Prompt3 <> % 04 - 06 : PC doesn't want this mission. Prompt4 <> Prompt5 <> Prompt6 <> % 07 - 08 : Combat is starting. prompt7 <> prompt8 <> % 09 - 10 : How many points? prompt9 <> prompt10 <> % 11 - 12 : Just a minute... prompt11 <> prompt12 <> end GearHead/Series/SCENE_DestroyTarget.txt0000644000175000017500000000212210107107404016653 0ustar kaolkaolscene 0 2 % There's a target hidden in a fortress filled with enemy mecha. % % V1 = Target UID % V2 = Victory Indicator; if V2=1 then the PC has won % V3 = Reinforcements value ForestMap % At startup, choose which mecha will be the target. start Nu1 5Min .targetdown Msg1 Msg2 sub Team 1 SetEnemy 2 3 4 home Team 2 SetEnemy 1 SetAlly 3 4 home Team 3 SetEnemy 1 SetAlly 2 4 home Team 4 SetEnemy 1 SetAlly 2 3 home rect width 5 height 5 name rect width 5 height 5 name rect width 20 height 20 sub Fortress name Height 12 Width 12 end end inv Prop 50 SetTeam 3 Scale 2 name roguechar <&> end GearHead/Series/TS_Text_SLMM1.txt0000644000175000017500000000164210334000500015376 0ustar kaolkaol% Snake Lake Mecha Museum Display 1 The most common type of mecha in use today is the Multi-Purpose Battlesuit, or Battroid for short. ITM-01 CLAYMORE (circa 24PZC) This was the first Multi-Purpose Battlesuit put into general production. The flexibility offered by its hands and humanoid form offered great advantages over the Escher and Nighthawk mecha which were popular at the time. SAN-X2 BURU-BURU (circa 21PZC) One year after the release of the ITM-01, it was made obsolete by the introduction of the vastly superior SAN-X1 BuruBuru. AD26 VADEL (NT96) The fifty years following the Night of Fire saw very little technological innovation. The Vadel was one of the first original GPBs produced in the NewType age. Z-42k ZEROSAIKO (NT112) Emphasizing speed and maneuverability over raw firepower, the Zerosaiko marks a turning point in mecha design. GearHead/Series/TS_Text_SLMM2.txt0000644000175000017500000000372210334000652015410 0ustar kaolkaol% ARGOSEYER MODEL The most powerful mecha during the Age of Superpowers was most likely the Argoseyer. It was the first, and to date only, biotechnological mecha ever mass produced. Though no surviving examples of the design exist, we know a great deal about it from military test reports and the two battles in which it took part. As few as five Argoseyers may have been produced during the two years previous to the Night of Fire. All were lost defending the Siberian industrial megafortress from an eventually victorious Oceanic assault. HISTORY OF BIOCOMBATANTS As manpower dwindled late in the war of superpowers, biotech androids were created to replace human soldiers. "Cyclops"-class biocombatants all but replaced human beings on the front line. Following the war, biocombatants were added to the Sunrise Pact list of banned weapon technologies. This ban was more symbolic than practical, since the advanced facilities needed to produce biocombatants no longer existed. Many surviving biocombatants escaped and integrated themselves into the post-nuclear ecology. Scientists believe that animals such as the gremlin, the haitai, and the platypus may have originally been created for use as biological weapons. ARGOSEYER SPECIFICATIONS Test reports list the Argoseyer as having had a length of 28.4m, a mass of 38.5 tons, and a maximum flight speed of 540dpr. Its exact body form is unknown, but it is thought to have been a hybrid aerofighter. Not the entire mecha was biotechnological. Most researchers now believe that the musculature and nervous systems were biological, while the chassis and primary weapons were standard mechanical composition. Although it was a biocombatant with an advanced AI nervous system, the Argoseyer was not designed for autonomous deployment. A human pilot was required to direct the mecha, the AI functioning as a sophisticated battle computer. GearHead/Series/temp_relay_story.txt0000644000175000017500000000427207716234270016565 0ustar kaolkaolStory name