JNR
rpgSheet_PlayableChar.cpp
1 /*
2 
3 Jump'n'Run Engine
4 http://www.atanaslaskov.com/jnr/
5 
6 BSD LICENSE
7 Copyright (c) 2007-2013, Atanas Laskov
8 All rights reserved.
9 
10 Redistribution and use in source and binary forms, with or without
11 modification, are permitted provided that the following conditions are met:
12 1. Redistributions of source code must retain the above copyright notice,
13 this list of conditions and the following disclaimer.
14 2. Redistributions in binary form must reproduce the above copyright notice,
15 this list of conditions and the following disclaimer in the documentation
16 and/or other materials provided with the distribution.
17 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
18 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20 DISCLAIMED. IN NO EVENT SHALL ATANAS LASKOV BE LIABLE FOR ANY
21 DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 
28 */
29 
30 //
31 // FILE: rpgSheet_PlayableChar.cpp
32 //
33 // This class stores the RPG properites for the player
34 //
35 // Copyright (C) 2007-2013 Atanas Laskov, <latanas@gmail.com>
36 //
37 #include "stdafx.h"
38 #include "RPG.h"
39 #include "Core-Level-JR.h"
40 
41 void rpgSheet_PlayableChar_Props::load(class laPropertyList* pElement)
42 {
43  rpgSheet_Fighter_Props::load(pElement);
44 
45  nLevel = pElement->getInt( "Level" );
46  nXP = pElement->getInt( "XP" );
47  nXP_Next = pElement->getInt( "XP-Next" );
48 
49  skills.load( pElement->getChild("skills-inventory") );
50 }
51 
52 void rpgSheet_PlayableChar_Props::load(class laFileParser *fp)
53 {
54  rpgSheet_Fighter_Props::load(fp);
55 
56  fp->readUnsigned(&nLevel);
57  fp->readUnsigned(&nXP);
58  fp->readUnsigned(&nXP_Next);
59 }
60 
61 void rpgSheet_PlayableChar_Props::save(FILE* f)
62 {
63  fprintf(f, "[rpg-sheet]\n");
64  fprintf(f, "[include] skills-include: 'tileset\\skills.ts'\n");
65 
66  fprintf(f, "[int] Level: %d\n", nLevel);
67  fprintf(f, "[int] XP: %d\n", nXP);
68  fprintf(f, "[int] XP-Next: %d\n", nXP_Next);
69 
70  fprintf(f, "[double] Speed: %.5lf\n", dSpeed / M_UNIT);
71  fprintf(f, "[double] JPower: %.5lf\n", dJPower / M_UNIT);
72  fprintf(f, "[double] SPower: %.5lf\n", dSPower / M_UNIT);
73 
74  fprintf(f, "[int] HP: %d\n", nHP_Max);
75  fprintf(f, "[int] AP: %d\n", nAP);
76 
77  fprintf(f, "[comment] 'These two attacks are used only when unarmed'\n");
78  fprintf(f, "[comment] 'if unarmed combat is enabled'\n");
79  fprintf(f, "[attack-0] \n");
80  fprintf(f, " [int] Element: 0 \n");
81  fprintf(f, " [int] AP: 1\n");
82  fprintf(f, " [double] charge-time: 0.1\n");
83  fprintf(f, "[/attack-0]\n");
84  fprintf(f, "[attack-1] \n");
85  fprintf(f, " [int] Element: 0 \n");
86  fprintf(f, " [int] AP: 2\n");
87  fprintf(f, " [double] charge-time: 0.1\n");
88  fprintf(f, "[/attack-1]\n");
89 
90  for(unsigned i=0; i<M_ELEMENTS; i++)
91  fprintf(f, "[double] DP-%d: %.3lf\n", i, arDP[i]);
92 
93  fprintf(f, "[/rpg-sheet]\n");
94 }
95 
96 rpgAttack rpgSheet_PlayableChar::modAttack( unsigned n )
97 {
98  rpgAttack a;
99  std::string strItemClass = properties()->items.activePtr()->name();
100 
101  if( !strcmp(strItemClass.c_str(), "rpgWeapon") )
102  {
103  rpgWeapon *pw = (rpgWeapon *)properties()->items.activePtr();
104 
105  ASSERT(n<2, "Attack %d out of bounds for active Weapon.", n);
106  a = pw->attack[ n ];
107  a.nAP += properties()->nAP;
108  a.nAP *= modifiers()->dMod_AP;
109 
110  }
111  else a = rpgSheet_Fighter::modAttack( n );
112 
113  // Potion mod
114 
115  return a;
116 }
117 
118 double rpgSheet_PlayableChar::modDP(unsigned nElement)
119 {
120  double dp = rpgSheet_Fighter::modDP( nElement );
121 
122  // Item mod
123  // Potion mod
124 
125  return dp;
126 }
127 
128 void rpgSheet_PlayableChar::collect(unsigned nXP)
129 {
130  properties()->nXP += nXP * modifiers()->dMod_XP;
131 
132  if( properties()->nXP >= properties()->nXP_Next ) _level_up();
133 }
134 
135 unsigned rpgSheet_PlayableChar::_XP_for_next_level()
136 {
137  return properties()->nXP_Next * M_XP_INCREMENT;
138 }
139 
140 void rpgSheet_PlayableChar::_level_up()
141 {
142  // Change level and XP requirement
143  //
144  properties()->nXP = 0;
145  properties()->nXP_Next = _XP_for_next_level();
146  properties()->nLevel++;
147  properties()->nTrainingPoints ++;
148 
149  // Replenish HP and upgrade limit
150  //
151  properties()->nHP_Max += M_HP_INCREMENT;
152  properties()->nHP = properties()->nHP_Max;
153 
154  // Upgrade attacks
155  //
156  std::vector<rpgAttack>::iterator i;
157 
158  for(i=properties()->vAttacks.begin(); i!=properties()->vAttacks.end(); i++)
159  i->upgrade();
160 
161  // Updgrade element defenses
162  //
163  for(unsigned i=0; i<M_ELEMENTS; i++)
164  properties()->arDP[i] += M_DP_INCREMENT;
165 }
#define M_UNIT
Unit of 1 meter.
Attack RPG Properties.
Definition: rpgAttack.h:55
File Parser.
Definition: laFileParser.h:41