Initial commit (r9)
[18plus-7leafadventure.git] / src / org / sevenchan / dongs / Creature.as
blob4569da5da8d3b5c0edaf2bf4628f2e75a77383fb
1 package org.sevenchan.dongs
3 import flash.net.*;
4 import org.sevenchan.dongs.bodyparts.*;
5 import org.sevenchan.dongs.creature.*;
6 import org.sevenchan.dongs.enchantment.*;
7 import org.sevenchan.dongs.enchantment.events.*;
8 import org.sevenchan.dongs.screens.*;
9 /**
10 * It's alive!
11 * @author N3X15
13 public class Creature
15 registerClassAlias("ECreature", Creature);
17 // Characteristics
18 public var customized:Boolean = false;
19 public var ownName:String = "Blah Blah"; // Who am I?
20 public var height:Number = 0.0; // How tall am I?
21 public var build:Build = Build.AVG; // How fat am I?
22 public var material:Material = Material.NO_MATERIAL_MODIFIER; // What am I made of?
23 public var hair:Hair = Hair.BALD; // His/her/hir hair is...
24 public var skin:Skin = new Skin("human"); // His/her/hir hair is...
25 public var _gender:Gender = Gender.ASEXUAL; // Boy, Girl, Neither, Both?
26 public var sexualPreference:SexualPreference = SexualPreference.ASEXUAL; // Straight, Gay, ASexual, Bi?
28 // Stats (CACHED VALUES)
29 public var _level:uint = 0; // In comparison to standard human being. No attacking rats for 20 levels.
30 private var d_level:uint = 0; // Delta
31 public var _strength:int = 1; // Damage caused in case of a successful attack.
32 public var _speed:uint = 1; // Chance of dodging. defending.speed-attacking.speed = relative chance of dodging.
33 public var _intellect:uint = 1; // Smartness. Opens dialog trees and gives hints.
34 public var _lust:uint = 1; // Slowly increases over time, eliminated by masturbation or smecks. Some battles are nonsexual and will not affect lust, others will slightly increase it based on ((number of balls x ball hormone output)+(number of vaginas * vagina hormone output)* sensitivity).
35 public var sensitivity:Number = 0; // 0-1, 0 being not sensitive
36 public var _HP:int = 100; //100*(level*0.02)
37 public var _XP:int = 0; // 50*(level*0.5)
38 public var mana:uint = 0; // Magic shit, increases over time, especially near relaxing places.
39 public var gold:uint = 0; // Currency
41 // Collections
42 public var _abilities:Object = new Object(); // What magic/techniques can I use?
43 public var assholes:Array = new Array(); // How many, and what type of assholes do I possess?
44 public var _arms:Array = new Array(); // Needed to attack. Tentacles are ok.
45 public var _balls:Array = new Array(); // Testes (Cum and pregnancy options)
46 public var breasts:Array = new Array(); // Boobs (fuckable)
47 public var _dicks:Array = new Array(); // Penises (Pleasure options, testes required for preggo/cum stuff)
48 public var enchantments:Object = new Object(); // What kinds of effects am I suffering/benefiting from?
49 public var eyes:Array = new Array(); // How many/what kinds of eyes do I have?
50 public var inventory:Array = new Array(); // What stuff am I carrying?
51 public var _legs:Array = new Array(); // Legs or locomotive tentacles or some other propulsion. (NONE = CAN'T MOVE OR DODGE)
52 public var _vaginas:Array = new Array(); // Places to put babies if the "father" has a penis and doesn't know the FALCON PUNCH. Anal pregnancy is okay but only with dicks with that flag.
53 public var _wings:Array = new Array(); // For flight.
54 public var explored:Array = new Array();
56 private var main:Main = null;
57 public function Creature()
59 trace("Creature.init()");
60 gold = MathUtils.rand(0, 50);
61 genName();
64 public function addEnchantment(ench:Enchantment):String {
65 var story:String = ench.onInit(this);
66 if(!ench.cancelAddition)
67 this.enchantments[ench.getID()] = ench;
68 return story;
71 public function initialGenderSetup():void { }
73 public function yourMove(cs:CombatScreen, ply:Creature):void {
74 if (notifyEnchantments(new CombatTurnEvent(ply))) {
75 InfoScreen.push("<p>The " + getTypeName() + " cannot attack!</p>");
76 return;
78 if (MathUtils.lengthOf(abilities) > 0 && MathUtils.rand(0,1) == 0) {
79 var ab:Ability = Ability(MathUtils.getRandomObjectEntry(abilities));
80 if(ab.activate(this, ply))
81 return;
83 cs.tryAttack(this, ply);
84 return;
87 public function addLust(amt:Number=1):void {
88 lust += (amt * getLustMult());
91 private function getLustMult():Number {
92 var numballs:Number = balls.length;
93 var loadMultSum:Number = 0;
94 for (var i:int = 0; i < balls.length; i++) {
95 loadMultSum += (balls[i] as Testicle).loadMult;
97 return (numballs * (loadMultSum / numballs))*0.5;
100 public function addToInventory(item:Item):void {
101 for (var i:int = 0; i < inventory.length; i++) {
102 if ((inventory[i] as Item).id == item.id) {
103 (inventory[i] as Item).amount += item.amount;
104 return;
107 if(inventory.length<11) {
108 inventory.push(item);
109 } else {
110 if (main != null)
111 main.showInventory(item);
115 public function combatDescr(subj:Creature):String {
116 if (getInterested(subj)) {
117 this.lust = 100;
119 var o:String = "<p>" + Utils.A(getTypeName(),true) + " "+getTypeName()+" leaps from the bushes and attacks!</p><p>Your attacker is ";
120 o += getDescription();
122 return o;
125 public function onEncounter(ply:Creature):Boolean { return false; }
127 public function onWin(ply:Creature):Boolean { return false; }
128 public function onLose(ply:Creature):Boolean { return false; }
130 protected function genName():void {
131 var firstNames:Array = [
132 "Andrew",
133 "Alex",
134 "Boris",
135 "Charles",
136 "Alexei",
137 "Drew",
138 "Scruffy",
139 "Gonnadi",
140 "Adolf",
141 "Albert",
142 "Bruno",
143 "Frederick",
144 "Ray"
147 var lastNames:Array = [
148 "Lenin",
149 "Hitler",
150 "Jenkins",
151 "Balboa",
152 "Nelson",
153 "O'Reilly",
154 "McDonald",
155 "Charles",
156 "Rubin",
157 "Schwarzeneggar"
159 ownName = MathUtils.getRandomEntry(firstNames) + " " + MathUtils.getRandomEntry(lastNames);
160 //trace(ownName);
164 * What am I?
165 * @return String Whatever it's called
167 public function getTypeName():String {
168 return "NOT FUCKING NAMED YET";
171 public function getDescription():String {
172 var descr:String = "";
173 // a gay human male of average height and build. He also possesses a long, flowing mane of golden hair,
174 // which contrasts nicely with your blue eyes and light skin.
176 // In the equipment department, you're not too odd. You have two human testicles swinging between your legs, paired with
177 // a single, 5.5" human schlong. Your breasts are flat, but well-sculpted human pecs, and you have a standard-issue male
178 // ass with a standard-issue virgin male asshole between its buns. You've got two human arms, two human legs.
180 // In other words, you're an average human, which probably won't last long down here.
182 descr = Utils.A(sexualPreference.label)+" "+sexualPreference.label+ " " + gender.label + " " + getTypeName() + ", who " + build.getDescription()
183 +" %CSUB% also possesses " + hair.getDescription();
185 if (hair == Hair.BALD)
186 descr += ", %POS% glistening scalp distracting from %POS% ";
187 else
188 descr += ", which constrasts nicely with %POS% ";
189 if(eyes.length == 0)
190 descr += " complete lack of eyes (<b>and resulting blindness</b>)";
191 else
192 descr += getEyesDescr();
194 descr += " and " + skin.getDescr(0, this);
195 descr += "</p>";
197 descr += "<p>In the equipment department, ";
198 var haveBalls:Boolean = (balls.length > 0);
199 var haveDicks:Boolean = (dicks.length > 0);
200 var haveVags:Boolean = (vaginas.length > 0);
201 if (haveBalls && haveDicks)
202 descr += "%SUB% has " + getTesticleDescr() + " swinging between %POS% legs, paired with " + getDickDescr() + ".";
203 if (!haveBalls && haveDicks)
204 descr += "no testicles rub between %POS% thighs when %SUB% walks, but %SUB% does have " + getDickDescr() + ".";
205 if (haveBalls && !haveDicks)
206 descr += "%SUB% doesn't have a dick, but %SUB% does have " + getTesticleDescr() + ". %SUB% seems to get more horny as time passes.";
208 if (haveVags)
209 descr += " %CPOS% body possesses " + getVagDescr() + ".";
211 if (!haveBalls && !haveDicks && !haveVags)
212 descr += " %CSUB% doesn't have any sexual organs. At least you won't get raped.";
215 if (breasts.length > 0)
216 descr += " %CSUB% has " + getBreastDescr() + ", and wears ";
217 else
218 descr += " %CSUB% doesn't have any breasts, but does have ";
219 descr += getAssDescr() + ".";
221 if (arms.length > 0)
222 descr += " %CSUB% has "+getArmsDescr()+", ";
223 else
224 descr += " %CSUB% doesn't have any arms (<b>and therefore can't attack</b>), ";
226 if (legs.length > 0) {
227 if (arms.length == 0)
228 descr += "but %SUB% DOES have ";
229 else
230 descr += "and ";
231 descr += getLegsDescr()+".";
232 } else
233 descr += "and no legs (<b>so %SUB% can't dodge attacks</b>).";
235 if (wings.length > 0) {
236 descr += " %CSUB% also has " + getWingsDescr() + ".";
238 descr += "</p>";
240 return gender.doReplace(descr);
243 public function hasEnchantment(name:String):Boolean {
244 return Utils.objHas(enchantments,name);
247 public function levelUp(firstOne:Boolean = false):void {
248 _level++;
249 if(!firstOne)
250 InfoScreen.push("<h2>Levelled up!</h2><p>You are now level " + level + "!</p>");
251 recalcStrength();
252 //recalcSpeed();
255 public function onCombatInit():void {
256 HP = this.maxHP;
259 public function get maxHP():int {
260 return 100 + ((level-1) * 5);
263 public function get maxXP():int {
264 trace("_level", _level);
265 trace("_strength", _strength);
266 return Math.max(1,50*(_level * 0.5));
269 public function getExplored(loc:String):Boolean {
270 for (var i:int = 0; i < explored.length; i++) {
271 if (explored[i] == loc)
272 return true;
274 return false;
277 public function setExplored(loc:String):void {
278 if (getExplored(loc)) return;
279 explored.push(loc);
282 public function recalcStrength():void {
283 //trace("height:", height);
284 var weight:Number = build.calculateWeight(height, 0.5)
285 //trace("weight:",weight);
286 var A:Number = Math.ceil((Math.pow(level, 2) * 0.01) - (Math.abs(17.5 - (weight * 0.1))) + 8);
287 if (level <= 1)
288 _strength = A;
289 var B:Number = Math.ceil((Math.pow(level-1,2) * 0.01) - (Math.abs(17.5 - (weight * 0.1))) + 8);
290 _strength = _strength + (A - B);
293 public function get strength():int { return _strength; }
294 public function set strength(str:int):void {
295 _strength = str;
296 doStatsUpdate();
299 public function get speed():uint { return _speed; }
300 public function set speed(spd:uint):void {
301 _speed = spd;
302 doStatsUpdate();
305 public function get lust():uint { return _lust; }
306 public function set lust(lst:uint):void
308 _lust = lst;
309 if (_lust > 100)
310 _lust = 100;
311 doStatsUpdate();
313 public function get intellect():uint { return _intellect; }
314 public function set intellect(i:uint):void
316 _intellect = i;
317 doStatsUpdate();
320 public function get arms():Array { return _arms; }
321 public function set arms(arr:Array):void {
322 _arms = arr;
323 customized = true;
326 public function get legs():Array { return _legs; }
327 public function set legs(arr:Array):void { _legs = arr;
328 customized = true; }
330 public function get wings():Array { return _wings; }
331 public function set wings(arr:Array):void { _wings = arr;
332 customized = true; }
334 public function get balls():Array { return _balls; }
335 public function set balls(balls:Array):void { _balls=balls;
336 customized = true; }
338 public function get vaginas():Array { return _vaginas; }
339 public function set vaginas(balls:Array):void { _vaginas=balls;
340 customized = true; }
342 public function get dicks():Array { return _dicks; }
343 public function set dicks(balls:Array):void { _dicks=balls;
344 customized = true; }
346 public function get abilities():Object { return _abilities; }
347 public function set abilities(arr:Object):void{ _abilities=arr; }
349 public function get gender():Gender { return _gender; }
350 public function set gender(value:Gender):void { _gender=value;
351 customized = true; }
353 public function get HP():int { return _HP; }
354 public function set HP(value:int):void {
355 _HP=value;
356 doStatsUpdate();
358 public function get XP():int { return _XP; }
359 public function set XP(value:int):void {
360 trace("XP", value);
361 _XP = value;
362 if (_XP >= maxXP) {
363 _XP = 0;
364 levelUp();
366 doStatsUpdate();
370 public function setMain(main:Main):void {
371 this.main = main;
374 private function doStatsUpdate():void {
375 if (main != null) {
376 main.refreshStats();
380 public function get level():int {
381 return _level;
384 private function getBodyPartDesc(collection:Array, singular:String):String {
386 if (collection.length== 0) {
387 return "no "+singular+"s";
389 var out:String = "";
390 var varying:Boolean = false;
391 var types:Object = new Object();
392 var lname:String = "";
393 var numtypes:Number = 0;
394 for each (var i:* in collection) {
395 var t:IBodyPart = i as IBodyPart;
396 if (t == null)
397 continue;
398 //trace(t);
399 lname = t.name;
400 if(!(lname in types)) {
401 types[lname] = 0;
402 numtypes++;
404 types[lname]++;
406 for (var k:String in types) {
407 trace(k + " = " + types[k]);
409 if(numtypes==1) {
410 for each (t in collection) {
411 if (t.name == lname)
412 return t.getDescr(types[lname], this);
414 } else {
415 var n:Number = 0;
416 for (var ot:* in types) {
417 var gotdescr:Boolean = false;
418 for each (t in collection) {
419 if (t.name == ot) {
420 if(!gotdescr) {
421 out += ", " + t.getDescr(types[ot] as Number, this);
422 gotdescr = true;
424 n += types[ot];
428 return collection.length + " "+singular+"s of varying types ("+out.substr(2)+")";
430 return "";
433 public function notifyEnchantments(e:*):Boolean {
434 var collection:Array = [];
435 for (var eID:String in enchantments) {
436 var ench:Enchantment = enchantments[eID];
437 if (e is CombatStartEvent) {
438 ench.onCombatInit(e.other);
440 if (e is CombatEndEvent) {
441 ench.onCombatComplete(e.won, e.other);
443 if (e is CombatTurnEvent) {
444 return ench.onMyCombatTurn(e.other);
447 return false;
450 public function getTesticleDescr():String {
451 return getBodyPartDesc(balls,"ball");
454 public function getDickDescr():String {
455 return getBodyPartDesc(dicks,"dick");
458 public function getVagDescr():String {
459 return getBodyPartDesc(vaginas,"vag");
462 public function getBreastDescr():String {
463 return getBodyPartDesc(breasts, "boob");
466 public function getAssDescr():String {
467 return getBodyPartDesc(assholes,"asshole");
470 public function getArmsDescr():String {
471 return getBodyPartDesc(arms, "arm");
474 public function getEyesDescr():String {
475 return getBodyPartDesc(eyes, "eye");
478 public function getLegsDescr():String {
479 return getBodyPartDesc(legs, "leg");
482 public function getWingsDescr():String {
483 return getBodyPartDesc(wings, "wing");
487 * Wants your body
489 * I = Interested
490 * H = Hostile
491 * +---------------+---+---+
492 * | Type | I | H |
493 * +---------------+---+---+
494 * | Rape | T | T |
495 * | Fight | F | T |
496 * | Horny | T | F |
497 * | - | F | F |
498 * +---------------+---+---+
500 public function getInterested(subj:Creature):Boolean {
501 return sexualPreference.isOppositeGender(gender, subj.gender);
504 public function getHostile(subj:Creature):Boolean {
505 return false;
508 public function performConversion(oldMe:Creature):void {
512 public function changeFrom(f:Creature):void {
513 this._speed = f._speed;
514 this._strength = f._strength;
515 this.abilities = f.abilities;
516 this.enchantments = f.enchantments;
517 this.explored = f.explored;
518 this.gender = f.gender;
519 this.gold = f.gold;
520 this.height = f.height;
521 this.HP = f.maxHP;
522 this.ownName = f.ownName;
523 this.sensitivity = f.sensitivity;
524 this.sexualPreference = f.sexualPreference;
525 this.inventory = f.inventory;
527 this.performConversion(f);