Halp This Newb

AtomExplorer
12 Jul 2016, 00:36

I was Just wondering how do i make myself lose health from a Enemy/Object and then lose the game


hegemonkhan
12 Jul 2016, 02:13

here's XanMag's "tutorial 2" game, which he probably has lessons within it on doing damage in combat:

http://textadventures.co.uk/forum/games/topic/5940/quest-tutorials-and-templates-published


here's a link of my extensive guide on this type of stuff:

http://textadventures.co.uk/forum/samples/topic/5559/attributes-and-if-script-guide-by-hk (see also the 'statusattributes' link in my 2nd-3rd post a ways scrolled down)

to end the game:

in Code: http://docs.textadventures.co.uk/quest/scripts/finish.html

in GUI~Editor: find/use the Script option that does so


here's a sample game of an example of it:

<asl version="550">

  <include ref="English.aslx" />
  <include ref="Core.aslx" />

  <game name="example">
    <gameid>f63f45df-3dba-4dfe-b427-6a76381afd2a</gameid>
    <version>1.0</version>
    <firstpublished>2016</firstpublished>
  </game>

  <object name="room">
  </object>

  <object name="player">
    <attr name="parent" type="object">room</attr>
    <attr name="current_life_integer_attribute" type="int">999</attr>
    <attr name="damage_integer_attribute" type="int">100</attr>
  </object>

  <object name="monster">
    <attr name="parent" type="object">room</attr>
    <attr name="alias" type="string">orc</attr>
    <attr name="current_life_integer_attribute" type="int">500</attr>
    <attr name="damage_integer_attribute" type="int">50</attr>
    <attr name="dead_boolean_attribute" type="boolean">false</attr>
    <attr name="displayverbs" type="simplestringlist">fight</attr>
    <attr name="fight" type="script"><![CDATA[
      if (this.dead_boolean_attribute) {
        msg ("The " + this.alias + " is already dead, silly.")
      } else {
        this.current_life_integer_attribute = this.current_life_integer_attribute - game.pov.damage_integer_attribute
        msg (game.pov.alias + " attacks the " + this.alias + ", doing " + game.pov.damage_integer_attribute + " damage to the " + this.alias + ", leaving it with only " + this.current_life_integer_attribute + " life left.")
        if (this.current_life_integer_attribute <= 0) {
          this.dead_boolean_attribute = true
          msg (game.pov.alias + " has inflicted so much damage, that the " + this.alias + " is dead.")
        } else {
          game.pov.current_life_integer_attribute = game.pov.current_life_integer_attribute - this.damage_integer_attribute
          msg ("The " + this.alias + " attacks " + game.pov.alias + ", doing " + this.damage_integer_attribute + " damage, leaving " + game.pov.alias + " with only " + game.pov.current_life_integer_attribute + " life left.")
          if (game.pov.current_life_integer_attribute <= 0) {
            msg (game.pov.alias + " was killed by the " + this.alias + ".")
            msg ("GAME OVER")
            finish
          }
        }
      }
    ]]></attr>
  </object>

  <verb>
    <property>fight</property>
    <pattern>fight</pattern>
    <defaultexpression>You can't fight that!</defaultexpression>
  </verb>

</asl>

AtomExplorer
13 Jul 2016, 19:21

Thanks man


hegemonkhan
14 Jul 2016, 19:04

Pixie has some combat libraries that you can look at too, and there's also my old combat code too (it's based off of a part of Pertex' Combat Library).

Pixie's:
http://textadventures.co.uk/forum/samples/topic/5976/rpg-style-combat-library-2-0
http://textadventures.co.uk/forum/samples/topic/4886/rpg-style-combat-library

Pertex' Combat Libray:
http://textadventures.co.uk/forum/samples/topic/2660/library-rpg-elements

Guides (some of them are on/for combat):
http://docs.textadventures.co.uk/quest/guides/

HK's old combat code (based upon a part of Pertex' Combat Library):
(err, new forum code is limiting my ability, so just going to paste the code below)

<asl version="530">
  <include ref="English.aslx" />
  <include ref="Core.aslx" />
  <game name="Testing Game Stuff">
    <gameid>d83ba5bb-2e3c-4f31-80c9-3e88a2dc082c</gameid>
    <version>1.0</version>
    <pov type="object">player</pov>
    <start type="script">
      cc
    </start>
    <turns type="int">0</turns>
    <statusattributes type="stringdictionary">turns = </statusattributes>
  </game>
  <object name="room">
    <inherit name="editor_room" />
    <object name="player">
      <inherit name="defaultplayer" />
      <inherit name="pc" />
      <cur_hp type="int">999</cur_hp>
      <max_hp type="int">999</max_hp>
      <str type="int">100</str>
      <end type="int">100</end>
      <dex type="int">100</dex>
      <agi type="int">100</agi>
      <spd type="int">100</spd>
      <hc type="int">100</hc>
      <pd type="int">100</pd>
      <pr type="int">100</pr>
    </object>
    <object name="orc1">
      <inherit name="editor_object" />
      <inherit name="npc" />
      <hostile type="boolean">true</hostile>
      <dead type="boolean">false</dead>
      <alias>orc</alias>
      <cur_hp type="int">999</cur_hp>
      <max_hp type="int">999</max_hp>
      <str type="int">25</str>
      <end type="int">25</end>
      <dex type="int">25</dex>
      <agi type="int">25</agi>
      <spd type="int">25</spd>
      <hc type="int">25</hc>
      <pd type="int">25</pd>
      <pr type="int">25</pr>
    </object>
  </object>
  <turnscript name="game_turns">
    <enabled />
    <script>
      sa
      game.turns = game.turns + 1
    </script>
  </turnscript>
  <command name="fight">
    <pattern>fight #text#</pattern>
    <script>
      battle_system (game.pov,text)
    </script>
  </command>
  <type name="char">
    <cur_hp type="int">0</cur_hp>
    <drop type="boolean">false</drop>
    <defending type="boolean">false</defending>
    <max_hp type="int">0</max_hp>
    <str type="int">0</str>
    <end type="int">0</end>
    <dex type="int">0</dex>
    <agi type="int">0</agi>
    <spd type="int">0</spd>
    <hp type="int">0</hp>
    <hc type="int">0</hc>
    <pd type="int">0</pd>
    <pr type="int">0</pr>
  </type>
  <type name="pc">
    <inherit name="char" />
    <statusattributes type="stringdictionary">hp = ;str = ;end = ;dex = ;agi = ;spd = ;hc = ;pd = ;pr = </statusattributes>
  </type>
  <type name="npc">
    <inherit name="char" />
    <dead type="boolean">false</dead>
    <hostile type="boolean">false</hostile>
    <displayverbs type="list">Look at; Talk; Fight</displayverbs>
  </type>
  <function name="cc">
    msg ("What is your name?")
    get input {
      game.pov.alias = result
      msg (" - " + game.pov.alias)
      show menu ("What is your gender?", split ("male;female" , ";"), false) {
        game.pov.gender = result
        show menu ("What is your race?", split ("human;dwarf;elf" , ";"), false) {
          game.pov.race = result
          show menu ("What is your class?", split ("warrior;cleric;mage;thief" , ";"), false) {
            game.pov.class = result
            msg (game.pov.alias + " is a " + game.pov.gender + " " + game.pov.race + " " + game.pov.class + ".")
            wait {
              ClearScreen
            }
          }
        }
      }
    }
  </function>
  <function name="sa">
    game.pov.hp = game.pov.cur_hp + " / " + game.pov.max_hp
  </function>
  <function name="battle_system" parameters="self,text" type="boolean">
    first_value = false
    enemy = GetObject (text)
    if (enemy = null) {
      foreach (obj,AllObjects()) {
        if (obj.alias=text) {
          enemy = obj
        }
      }
    }
    if (enemy = null) {
      msg ("There is no " + text + " here.")
      first_value = false
    }
    else if (not Doesinherit (enemy,"npc")) {
      msg ("You can not battle that!")
      first_value = false
    }
    else if (not npc_reachable (enemy)) {
      msg ("There is no " + enemy.alias + " in your vicinity.")
      first_value = false
    }
    else if (GetBoolean (enemy,"dead") = true) {
      msg (enemy.alias + " is already dead.")
      first_value = false
    }
    else if (GetBoolean (enemy,"hostile") = false) {
      msg (enemy.alias + " is not hostile.")
      first_value = false
    }
    else if (battle_sequence (self,enemy) = true) {
      msg ("The battle is over.")
      first_value = true
    }
    return (first_value)
  </function>
  <function name="battle_sequence" parameters="self,enemy" type="boolean"><![CDATA[
    second_value = false
    if (enemy.dead = false) {
      if (GetInt (self,"spd") > GetInt (enemy,"spd")) {
        on ready {
          msg ("You get to go first for this round")
          if (self_battle_turn (self,enemy) = true) {
            battle_sequence (self,enemy)
          }
        }
        on ready {
          if (enemy.dead = false) {
            if (enemy_battle_turn (self,enemy) = true) {
              msg ("The round has ended.")
            }
          }
        }
        on ready {
          battle_sequence (self,enemy)
        }
      }
      else if (GetInt (self,"spd") < GetInt (enemy,"spd")) {
        on ready {
          msg (enemy.alias + " gets to go first for this round.")
          if (enemy_battle_turn (self,enemy) = true) {
            msg ("It is now your turn.")
          }
        }
        on ready {
          if (self_battle_turn (self,enemy) = true) {
            battle_sequence (self,enemy)
          }
          else {
            msg ("The round has ended.")
          }
        }
        on ready {
          battle_sequence (self,enemy)
        }
      }
      else if (GetInt (self,"spd") = GetInt (enemy,"spd")) {
        if (RandomChance (50) = true) {
          on ready {
            msg ("You get to go first for this round")
            if (self_battle_turn (self,enemy) = true) {
              battle_sequence (self,enemy)
            }
          }
          on ready {
            if (enemy_battle_turn (self,enemy) = true) {
              msg ("The round has ended.")
            }
          }
          on ready {
            battle_sequence (self,enemy)
          }
        }
        else {
          on ready {
            msg (enemy.alias + " gets to go first for this round.")
            if (enemy_battle_turn (self,enemy) = true) {
              msg ("It is now your turn.")
            }
          }
          on ready {
            if (self_battle_turn (self,enemy) = true) {
              battle_sequence (self,enemy)
            }
            else {
              msg ("The round has ended.")
            }
          }
          on ready {
            battle_sequence (self,enemy)
          }
        }
      }
    }
    else {
      second_value = true
    }
    return (second_value)
  ]]></function>
  <function name="self_battle_turn" parameters="self,enemy" type="boolean"><![CDATA[
    third_value = false
    msg (self.alias + " has " + self.cur_hp + " HP left.")
    msg (enemy.alias + " has " + enemy.cur_hp + " HP left.")
    wait {
      show menu ("What is your battle choice?", split ("Attack;Defend;Cast;Item;Run", ";"), false) {
        switch (result) {
          case ("Attack") {
            fourth_value = false
            if (RandomChance (GetInt (enemy,"agi") - GetInt (self,"spd")) = true) {
              msg (enemy.alias + "evaded your attack!")
              fourth_value = true
            }
            else if (RandomChance (GetInt (enemy,"Dex") - GetInt (self,"agi")) = true) {
              msg (enemy.alias + "parried your attack!")
              fourth_value = true
            }
            else if (RandomChance (GetInt (enemy,"agi") - GetInt (self,"dex")) = true) {
              msg (enemy.alias + "blocked your attack!")
              fourth_value = true
            }
            else if (RandomChance (GetInt (self,"dex") - GetInt (enemy,"spd")) = false) {
              msg ("Your attack missed " + enemy.alias +"!")
              fourth_value = true
            }
            else if (RandomChance (GetInt (enemy,"pr") - GetInt (self,"hc")) = true) {
              msg ("Your attack got resisted by " + enemy.alias +"!")
              fourth_value = true
            }
            else if (fourth_value = false) {
              if (self.defending = true and enemy.defending = true) {
                enemy.cur_hp = enemy.cur_hp - (crit_hit (self) * 2 * GetInt (self,"pd") / 2 + GetInt (self,"pd") * (GetInt (self,"str") - GetInt (enemy,"end")) / 100)
                msg (enemy.alias + " has " + enemy.cur_hp + " HP left.")
                self.defending = false
              }
              else if (self.defending = true and enemy.defending = false) {
                enemy.cur_hp = enemy.cur_hp - (crit_hit (self) * 2 * GetInt (self,"pd") + GetInt (self,"pd") * (GetInt (self,"str") - GetInt (enemy,"end")) / 100)
                msg (enemy.alias + " has " + enemy.cur_hp + " HP left.")
                self.defending = false
              }
              else if (self.defending = false and enemy.defending = true) {
                enemy.cur_hp = enemy.cur_hp - (crit_hit (self) * GetInt (self,"pd") / 2 + GetInt (self,"pd") * (GetInt (self,"str") - GetInt (enemy,"end")) / 100)
                msg (enemy.alias + " has " + enemy.cur_hp + " HP left.")
              }
              else if (self.defending = false and enemy.defending = false) {
                enemy.cur_hp = enemy.cur_hp - (crit_hit (self) * GetInt (self,"pd") + GetInt (self,"pd") * (GetInt (self,"str") - GetInt (enemy,"end")) / 100)
                msg (enemy.alias + " has " + enemy.cur_hp + " HP left.")
              }
            }
          }
          case ("Defend") {
            if (self.defending = false) {
              self.defending = true
            }
          }
          case ("Cast") {
            self.defending = false
          }
          case ("Item") {
            self.defending = false
          }
          case ("Run") {
            self.defending = false
          }
        }
        if (GetInt (enemy,"cur_hp") > 0) {
          if (RandomChance (GetInt (self,"spd") - GetInt (enemy,"spd")) = true) {
            msg ("You get an extra battle turn!")
            self_battle_turn (self,enemy)
          }
          else {
            msg ("Your battle turn is over.")
            third_value = false
          }
        }
        else if (GetInt (enemy,"cur_hp") <= 0) {
          msg (enemy.alias + " is dead.")
          msg ("You have won the battle!")
          enemy.defending = false
          enemy.dead = true
          third_value = true
          wait {
            ClearScreen
          }
        }
      }
    }
    return (third_value)
  ]]></function>
  <function name="enemy_battle_turn" parameters="self,enemy" type="boolean"><![CDATA[
    fifth_value = false
    msg (self.alias + " has " + self.cur_hp + " HP left.")
    msg (enemy.alias + " has " + enemy.cur_hp + " HP left.")
    result = GetRandomInt (1,3)
    switch (result) {
      case (1) {
        sixth_value = false
        if (RandomChance (GetInt (self,"agi") - GetInt (enemy,"spd")) = true) {
          msg ("You have evaded the attack!")
          sixth_value = true
        }
        else if (RandomChance (GetInt (self,"dex") - GetInt (enemy,"agi")) = true) {
          msg ("You have parried the attack!")
          sixth_value = true
        }
        else if (RandomChance (GetInt (self,"agi") - GetInt (enemy,"dex")) = true) {
          msg ("You have blocked the attack!")
          sixth_value = true
        }
        else if (RandomChance (GetInt (enemy,"dex") - GetInt (self,"spd")) = false) {
          msg (enemy.alias +"'s attack missed!")
          sixth_value = true
        }
        else if (RandomChance (GetInt (self,"pr") - GetInt (enemy,"hc")) = true) {
          msg ("You resisted the attack!")
          sixth_value = true
        }
        else if (sixth_value = false) { 
          if (enemy.defending = true and self.defending = true) {
            self.cur_hp = self.cur_hp - (crit_hit (enemy) * 2 * GetInt (enemy,"pd") / 2 + GetInt (enemy,"pd") * (GetInt (enemy,"str") - GetInt (self,"end")) / 100)
            msg (self.alias + " has " + self.cur_hp + " HP left.")
            enemy.defending = false
          }
          else if (enemy.defending = true and self.defending = false) {
            self.cur_hp = self.cur_hp - (crit_hit (enemy) * 2 * GetInt (enemy,"pd") + GetInt (enemy,"pd") * (GetInt (enemy,"str") - GetInt (self,"end")) / 100)
            msg (self.alias + " has " + self.cur_hp + " HP left.")
            enemy.defending = false
          }
          else if (enemy.defending = false and self.defending = true) {
            self.cur_hp = self.cur_hp - (crit_hit (enemy) * GetInt (enemy,"pd") / 2 + GetInt (enemy,"pd") * (GetInt (enemy,"str") - GetInt (self,"end")) / 100)
            msg (self.alias + " has " + self.cur_hp + " HP left.")
          }
          else if (enemy.defending = false and self.defending = false) {
            self.cur_hp = self.cur_hp - (crit_hit (enemy) * GetInt (enemy,"pd") + GetInt (enemy,"pd") * (GetInt (enemy,"str") - GetInt (self,"end")) / 100)
            msg (self.alias + " has " + self.cur_hp + " HP left.")
          }
        }
      }
      case (2) {
        if (enemy.defending = false) {
          msg (enemy.alias + " has choosen to defend itself.")
          enemy.defending = true
        }
      }
      case (3) {
        enemy.defending = false
        msg ("Cast")
      }
    }
    if (GetInt (self,"cur_hp") > 0) {
      if (RandomChance (GetInt (enemy,"spd") - GetInt (self,"spd")) = true) {
        msg (enemy.alias + " gets an extra battle turn!")
        wait {
          enemy_battle_turn (self,enemy)
        }
      }
      else {
        msg (enemy.alias + " 's battle turn is over.")
        fifth_value = true
      }
    }
    else if (GetInt (self,"cur_hp") <= 0) {
      msg (self.alias + " has died.")
      msg ("GAME OVER")
      finish
    }
    return (fifth_value)
  ]]></function>
  <function name="npc_reachable" parameters="object" type="boolean">
    value = false
    foreach (x,ScopeReachableNotHeld ()) {
      if (x=object) {
        value = true
      }
    }
    return (value)
  </function>
  <function name="crit_hit" parameters="object" type="int">
    if (RandomChance (GetInt (object,"luck")) = true) {
      value = 2
    }
    else {
      value = 1
    }
    return (value)
  </function>
</asl>

and my key/legend for it (I've learned since to never use abrevs ever again, lol. It's bad when you yourself don't even know what your abrevs mean, laughs):

01. cc = character creation function
02. sa = status attributes (mainly for implementing/displaying of ' cur / max ' stats) function
03. char = character object type ("pcs", "npcs", "monsters", etc., so, not a room, item, equipment, spell, etc)
04. pc = playable character object type ("player" characters / game.povs)
05. npc = non-playable character ("people", "monsters", and etc, so not a "player" character / not a game.pov, I'm going to have a hostility system, so any npc can be friendly or hostile, instead of having an actual "monster/enemy" type set aside)
06. hp = hit points (life) stat attribute
07. mp = mana points (magic) stat attribute
08. str = strength (physical damage, carry weight / equipment requirement, etc) stat attribute
09. end = endurance (physical defense, and etc) stat attribute
10. dex = dexterity (weapon~attack skill, think of this as "if your attack connects or not, do you 'whiff' or not", so not to gete confused with hc, and etc) stat attribute
11. agi = agility (dodging/evading, and etc) stat attribute
12. spd = speed (who goes first in battle, extra battle turns, escaping from battle, and etc) stat attribute
13. hc = hit chance (think of this more as piercing their armor or not, so not to get confused with dex, and etc) stat attribute
14. pd = physical damage stat attribute
15. fp = fire damage stat attribute
16. wp = water damage stat attribute
17. ap = air damage stat attribute
18. ed = earth damage stat attribute
19. ld = light damage stat attribute
20. dd = dark damage stat attribute
21. pr = physical resistance stat attribute
22. fr = fire resistance stat attribute
23. wr = water resistance stat attribute
24. ar = air resistance stat attribute
25. er = earth resistance stat attribute
26. lr = light resistance stat attribute
27. dr = dark resistance stat attribute
28. defending = boolean (reduces damage done for that character and increases the damage done by that character, if they chosoe to attack on the next turn)
29. escaped = boolean, run from battle (not completed/implemented yet)
30. hostile = boolean, any npc can be friendly or a(n) "monster/enemy", based upon a hostility scale (0-100), but not completed
31. dead = boolean
32. crit_hit = critical hit (bonus damage based upon luck)
33. luck = luck stat attribute
34. lvl = level stat attribute
35. exp = experience stat attribute
36. cash = cash stat attribute (currency)
37. lvlup = level up function