Deleted800173User Posted April 14, 2012 Share Posted April 14, 2012 (edited) Okay so I have 2 problems: 1. I'm trying to make my own poison gas effect for a room. (EDIT: Solved!) I can write the script to deal the damage appropriately but I really want to include poison resist. I also want to vary the damage based on the player. And the damage needs to be slow so I can't just use the gas trap already in the game. I could just fake the poison damage using the script but I can't figure out how to tell what the player's poison resist is using scripts. So i need help. I can use either A (an explanation on how to deal "poison" damage using papyrus) or B (the syntax needed to get the player's, and any other actor reference's, current poison resistance.)(PS I currently have no script for this. But you can look at the poison gas trap script below, hidden in the spoiler tag) 2. I'm trying to cover a vary large area with oil but i can't use multiple oil spills or the game will crash when igniting them. I tried scaling up the oil spill but the fire is the same size as normal meaning a player can easily dodge it plus it just looks stupid. After that I tried to place multiple oil spills next to each other but the game crashed when i ignited them. Help? On a third note does anyone know approximately how many items I can have in a room before I need to worry about someone's computer crashing? (I have a very nice computer and it seems to handle it well, but I'm not sure about the many users of the mod I'm designing.) scriptName TrapPoisonGas extends objectReference ; ; ;=================================================================== ;;Properties from MQShoutTrigger ;=================================================================== Spell property voicelv01 auto ; level 1 shout Spell property voicelv02 auto ; and 2 Spell property voicelv03 auto ; and 3, the most powerful float property timeToClear auto hidden ; this variable is set according to what power of shout hit the fog float property ClearTimeWeak = 5.0 auto {tweak setting for how long fog stays cleared by weakest shout default = 5.0} float property ClearTimeMed = 10.0 auto {tweak setting for how long fog stays cleared by medium shout default = 10.0} float property ClearTimeStrong = 15.0 auto {tweak setting for how long fog stays cleared by strongest shout default = 15.0} bool property allowEnableFlag = true auto {when true, trigger will enable after clear time is up when false, trigger will stay disabled} ; return value for IsFogOn function ; hidden property for use in child scripts bool property bIsFogOn = false auto hidden explosion property PoisonGasExplosion auto hidden bool property weaponResolved = false auto hidden int Property TrapLevel = 1 auto {Used to determine the difficulty of the trap, currently only tied to damage 0 = Easy 1 = Medium (DEFAULT) 2 = Hard 3 = VeryHard} ;=================================================================== ;;Gas Properties ;=================================================================== keyword property gasKeyword auto magicEffect property gasMagicEffect01 Auto float property fDuration = 15.0 auto bool property isInitiallyActive = True auto {Set whether the poison gas is initially active default == TRUE} bool property init = FALSE auto hidden bool property TemporarilyCleared auto hidden bool property loop = False auto hidden ;=================================================================== ;;EVENT BLOCK ;=================================================================== event onCellLoad() if !init && isInitiallyActive goToState("On") ;onAnim bIsFogOn = true loop = true init = TRUE else init = TRUE endif if !weaponResolved ResolveLeveledExplosion () endif endEvent ;=================================================================== ;;STATE BLOCK ;=================================================================== ;/ STATE WaitingForTrigger event onBeginState() if !weaponResolved ResolveLeveledExplosion () endif endEvent event onTrigger(objectReference triggerRef) ; Debug.Trace("Triggered: " + triggerRef + " " + !(triggerRef as actor).HasMagicEffectWithKeyword(gasKeyword)) if triggerRef as actor if !(triggerRef as actor).HasMagicEffectWithKeyword(gasKeyword) ; debug.Trace(self + " has applied gas to " + triggerRef) ;(triggerRef as actor).addSpell(gasSpell01) triggerRef.placeAtMe(PoisonGasExplosion) endif endif endEvent ; event OnTriggerEnter (objectReference TriggerRef) ; resolveTriggerLogic(triggerRef) ; endEvent Event OnHit(ObjectReference Aggressor, Form akSource, Projectile akProjectile, bool abPowerAttack, bool abSneakAttack, bool abBashAttack, bool abHitBlocked) if Aggressor == Game.GetPlayer() resolveTriggerLogic(None, (akSource as spell)) endif endEvent event onActivate(objectReference activateRef) ResolveGasActivation(activateRef) endEvent endState STATE HasBeenTriggered ; Nothing happens - this is a holding state EVENT OnHit(ObjectReference akAggressor, Form akWeapon, Projectile akProjectile, bool abPowerAttack, bool abSneakAttack, bool abBashAttack, bool abHitBlocked) ; debug.Trace("Hit but inactive: "+self) endEVENT endSTATE STATE Inactive event onActivate(objectReference activateRef) ResolveGasActivation(activateRef) endEvent endSTATE /; ;;;;;;;;;;;;;;;;;;;;New stuff;;;;;;;;;;;;;;;;;;;;;;;;; State On event onBeginState() bIsFogOn = True playAnimation("playAnim02") ;onAnim endEvent ;Currently has an actor inside event onTrigger(objectReference triggerRef) if triggerRef as actor && !(triggerRef as actor).isDead() ;If the actor does not already have a poison effect on them if !(triggerRef as actor).HasMagicEffectWithKeyword(gasKeyword) ; debug.Trace(self + " has applied gas to " + triggerRef) ;(triggerRef as actor).addSpell(gasSpell01) triggerRef.placeAtMe(PoisonGasExplosion) endif endif endEvent ;Activated by a trap trigger object event onActivate(objectReference activateRef) ResolveGasActivation(activateRef) endEvent ;This occurs when hit by a shout Event OnHit(ObjectReference Aggressor, Form akSource, Projectile akProjectile, bool abPowerAttack, bool abSneakAttack, bool abBashAttack, bool abHitBlocked) if Aggressor == Game.GetPlayer() && (akSource as spell) resolveShoutLogic(akSource as spell) endif endEvent endState auto State Off event onBeginState() bIsFogOn = False playAnimation("playAnim01") ;offAnim endEvent event onActivate(objectReference activateRef) ResolveGasActivation(activateRef) endEvent endState State TempCleared event onBeginState() bIsFogOn = False playAnimation("playAnim01") ;offAnim utility.wait(timeToClear) if TemporarilyCleared TemporarilyCleared = False goToState("On") else goToState("Off") endif endEvent event onActivate(objectReference activateRef) ResolveGasActivation(activateRef) endEvent endState ;=================================================================== ;;FUNCTION BLOCK ;=================================================================== Function ResolveShoutLogic(Spell akSpell) ; debug.Trace(self + "MQShoutTrigger: fireTriggerEvent from " + akSpell) TemporarilyCleared = True ; set the time that this fog portion will stay cleared based on strength of the shout if akSpell == voicelv01 timeToClear = clearTimeWeak elseif akSpell == voicelv02 timeToClear = clearTimeMed elseif akSpell == voicelv03 timeToClear = clearTimeStrong endif goToState("TempCleared") ;setFogState(false) ; ;debug.Trace(self + "Waiting " + timeToClear) ;utility.wait(timeToClear) ; if allowEnableFlag ;self.enable() ; setFogState(true) ; endif ; goToState("WaitingForTrigger") endFunction ; Function resolveTriggerLogic(ObjectReference TriggerRef = None, Spell SpellRef = None) ;respond if struck by one of the shout projectiles ; ; debug.Trace( self + "MQShoutTrigger: resolveTriggerLogic ObjectRef=" + TriggerRef + ", SpellRef=" + spellRef) ; if spellRef;&& (spellRef == voicelv01 || spellRef == voicelv02 || spellRef == voicelv03) ; goToState("HasBeenTriggered") ; fireTriggerEvent(spellRef) ; endif ; endFunction ;Handle turning on or off function ResolveGasActivation(objectReference activateRef) TrapTriggerBase TriggerRef ;TriggerRef will always be a TrapTriggerBase TriggerRef = activateRef as TrapTriggerBase ;Set TriggerRef to our activateRef if TriggerRef if TriggerRef.TriggerType == 0 ;single loop = False if bIsFogOn ;do nothing Else ;turn on unregisterForUpdate() registerForSingleUpdate(fDuration) goToState("On") ;onAnim endif elseif TriggerRef.TriggerType == 1 ;hold if loop loop = False else loop = True endif if bIsFogOn ;turn off if TemporarilyCleared TemporarilyCleared = False else goToState("Off") ;offAnim endif Else ;turn on goToState("On") ;onAnim endif elseif TriggerRef.TriggerType == 2 ;toggle if bIsFogOn loop = False ;turn off if TemporarilyCleared TemporarilyCleared = False else goToState("Off") ;offAnim endif Else loop = True ;turn on goToState("On") ;onAnim endif elseif TriggerRef.TriggerType == 3 ;turn on loop = True if bIsFogOn ;do nothing else ;turn on goToState("On") ;onAnim endif elseif TriggerRef.TriggerType == 4 ;turn off loop = False if bIsFogOn ;turn off if TemporarilyCleared TemporarilyCleared = False else goToState("Off") ;offAnim endif Else ;do nothing endif endif Else endif endFunction event onUpdate() unregisterForUpdate() if getState() == "On" if !loop goToState("Off") endif elseif getState() == "TempCleared" TemporarilyCleared = False else endif endEvent ; Function setFogState(bool bTurnOnFog) ; bIsFogOn = bTurnOnFog ; if bTurnOnFog ; ; debug.Trace("Re-fogging: "+self) ; self.enable() ; else ; ; debug.Trace("unfogging: "+self) ; self.disable() ; endif ; endFunction ;================================================================ int property LvlThreshold1 auto int property LvlThreshold2 auto int property LvlThreshold3 auto int property LvlThreshold4 auto int property LvlThreshold5 auto Explosion property TrapPoisonGasExplosion01 auto Explosion property TrapPoisonGasExplosion02 auto Explosion property TrapPoisonGasExplosion03 auto Explosion property TrapPoisonGasExplosion04 auto Explosion property TrapPoisonGasExplosion05 auto Explosion property TrapPoisonGasExplosion06 auto Function ResolveLeveledExplosion () ;Trace("ResolveLeveledWeapon") int damageLevel damageLevel = CalculateEncounterLevel(TrapLevel) ; weapon lvlWeaponM = LvlWeaponM1 ; weapon lvlWeaponL = LvlWeaponL1 ; weapon lvlWeaponR = LvlWeaponR1 explosion LvlExplosion = TrapPoisonGasExplosion01 if (damageLevel > LvlThreshold1 && damageLevel <= LvlThreshold2) ; lvlWeaponM = LvlWeaponM2 ; lvlWeaponL = LvlWeaponL2 ; lvlWeaponR = LvlWeaponR2 LvlExplosion = TrapPoisonGasExplosion02 ;Trace("damage threshold =") ;Trace("2") endif if (damageLevel > LvlThreshold2 && damageLevel <= LvlThreshold3) ;lvlWeaponM = LvlWeapon3 LvlExplosion = TrapPoisonGasExplosion03 ;Trace("damage threshold =") ;Trace("3") endif if (damageLevel > LvlThreshold3 && damageLevel <= LvlThreshold4) ;lvlWeaponM = LvlWeapon4 LvlExplosion = TrapPoisonGasExplosion04 ;Trace("damage threshold =") ;Trace("4") endif if (damageLevel > LvlThreshold4 && damageLevel <= LvlThreshold5) ;lvlWeaponM = LvlWeapon5 LvlExplosion = TrapPoisonGasExplosion05 ;Trace("damage threshold =") ;Trace("5") endif if (damageLevel > LvlThreshold5) ;lvlWeaponM = LvlWeapon6 LvlExplosion = TrapPoisonGasExplosion06 ;Trace("damage threshold =") ;Trace("6") endif ; ballistaWeaponM = lvlWeaponM ; ballistaWeaponL = lvlWeaponL ; ballistaWeaponR = lvlWeaponR PoisonGasExplosion = LvlExplosion weaponResolved = True EndFunction P.S. I was also wondering if there was a way to code an item so that a player cannot pick up the item(as in into his inventory) but can still move the item around using the "E" button Edited April 15, 2012 by Guest Link to comment Share on other sites More sharing options...
RandomlyAwesome Posted April 14, 2012 Share Posted April 14, 2012 (edited) I'm not sure but it might be worthwhile to look into creating a hazard that appilies poison damage,Letting the game make resistence calculations and bypassing the need to learn the player/actors poison resistence entirely. Edited April 14, 2012 by RandomlyAwesome Link to comment Share on other sites More sharing options...
Deleted800173User Posted April 14, 2012 Author Share Posted April 14, 2012 I'm not sure but it might be worthwhile to look into creating a hazard that appilies poison damage,Letting the game make resistence calculations and bypassing the need to learn the player/actors poison resistence entirely. How would I make a hazard that applies poison damage? Link to comment Share on other sites More sharing options...
RandomlyAwesome Posted April 14, 2012 Share Posted April 14, 2012 While I don't know how to create a hazard(stupid me :wallbash: )Messing around in the CK for a bit reveled that poisons use the AlchDamageHealth Magic effect wich also has poison resitence built into it,there is also a duration one named AlchDamageHealthDuration (these are IDs by the way not the ingame names).The AlchDamageHealthRavage is an instantenius version and wouldn't suit your needs.So...A hazard that appilies one of those magic effects Link to comment Share on other sites More sharing options...
Deleted800173User Posted April 14, 2012 Author Share Posted April 14, 2012 Okay yeah! this could work! My next question is how do you script in the amount of damage you want to deal using this effect? Link to comment Share on other sites More sharing options...
Deleted800173User Posted April 14, 2012 Author Share Posted April 14, 2012 (edited) I found it! apparently the poison gas has an explosion effect that deals the damage! yes!EDIT: oil also uses an explosion object which i may be able to resize or make a new one that simply IS larger! oh man I've been at this road block all week! Now if i can just figure out how to do that item trick. Edited April 14, 2012 by Guest Link to comment Share on other sites More sharing options...
RandomlyAwesome Posted April 14, 2012 Share Posted April 14, 2012 Glad to helpAbout the item trick:-Are the items supposed to never be lootableOR-Are they supposed to only be unlootable for a quest stage or something Link to comment Share on other sites More sharing options...
Deleted800173User Posted April 14, 2012 Author Share Posted April 14, 2012 (edited) i have an item that fits each of those descriptions.EDIT: that I need to make I mean Edited April 14, 2012 by Guest Link to comment Share on other sites More sharing options...
Deleted800173User Posted April 14, 2012 Author Share Posted April 14, 2012 (edited) Okay so I have copied the original poison gas and made copies of the explosion and ench(enchantment?) Anyways you can see my new script below. () Scriptname TTTGTrapPoisonGasScript extends ObjectReference ; ; ;=================================================================== ;;Properties from MQShoutTrigger ;=================================================================== Spell property voicelv01 auto ; level 1 shout Spell property voicelv02 auto ; and 2 Spell property voicelv03 auto ; and 3, the most powerful float property timeToClear auto hidden ; this variable is set according to what power of shout hit the fog float property ClearTimeWeak = 5.0 auto {tweak setting for how long fog stays cleared by weakest shout default = 5.0} float property ClearTimeMed = 10.0 auto {tweak setting for how long fog stays cleared by medium shout default = 10.0} float property ClearTimeStrong = 15.0 auto {tweak setting for how long fog stays cleared by strongest shout default = 15.0} bool property allowEnableFlag = true auto {when true, trigger will enable after clear time is up when false, trigger will stay disabled} ; return value for IsFogOn function ; hidden property for use in child scripts bool property bIsFogOn = false auto hidden explosion property PoisonGasExplosion auto hidden bool property weaponResolved = false auto hidden int Property TrapLevel = 1 auto {Used to determine the difficulty of the trap, currently only tied to damage 0 = Easy 1 = Medium (DEFAULT) 2 = Hard 3 = VeryHard} ;=================================================================== ;;Gas Properties ;=================================================================== keyword property gasKeyword auto magicEffect property gasMagicEffect01 Auto float property fDuration = 15.0 auto bool property isInitiallyActive = True auto {Set whether the poison gas is initially active default == TRUE} bool property init = FALSE auto hidden bool property TemporarilyCleared auto hidden bool property loop = False auto hidden ;=================================================================== ;;EVENT BLOCK ;=================================================================== event onCellLoad() if !init && isInitiallyActive goToState("On") ;onAnim bIsFogOn = true loop = true init = TRUE else init = TRUE endif if !weaponResolved ResolveLeveledExplosion () endif endEvent ;=================================================================== ;;STATE BLOCK ;=================================================================== ;/ STATE WaitingForTrigger event onBeginState() if !weaponResolved ResolveLeveledExplosion () endif endEvent event onTrigger(objectReference triggerRef) ; Debug.Trace("Triggered: " + triggerRef + " " + !(triggerRef as actor).HasMagicEffectWithKeyword(gasKeyword)) if triggerRef as actor if !(triggerRef as actor).HasMagicEffectWithKeyword(gasKeyword) ; debug.Trace(self + " has applied gas to " + triggerRef) ;(triggerRef as actor).addSpell(gasSpell01) triggerRef.placeAtMe(PoisonGasExplosion) endif endif endEvent ; event OnTriggerEnter (objectReference TriggerRef) ; resolveTriggerLogic(triggerRef) ; endEvent Event OnHit(ObjectReference Aggressor, Form akSource, Projectile akProjectile, bool abPowerAttack, bool abSneakAttack, bool abBashAttack, bool abHitBlocked) if Aggressor == Game.GetPlayer() resolveTriggerLogic(None, (akSource as spell)) endif endEvent event onActivate(objectReference activateRef) ResolveGasActivation(activateRef) endEvent endState STATE HasBeenTriggered ; Nothing happens - this is a holding state EVENT OnHit(ObjectReference akAggressor, Form akWeapon, Projectile akProjectile, bool abPowerAttack, bool abSneakAttack, bool abBashAttack, bool abHitBlocked) ; debug.Trace("Hit but inactive: "+self) endEVENT endSTATE STATE Inactive event onActivate(objectReference activateRef) ResolveGasActivation(activateRef) endEvent endSTATE /; float totalDamage = 0.0 float damagePerSec bool unactivated = TRUE State On event onBeginState() bIsFogOn = True playAnimation("playAnim02") ;onAnim endEvent ;===================================================================== ;CATWHEEL'S ADDITION ;====================================================================== ;Currently has an actor inside event onTrigger(objectReference triggerRef) if(triggerRef == game.getPlayer() && unactivated) unactivated = FALSE debug.Notification(" has player inside") while(!self.isDisabled()) debug.Notification(" beginning loop") Utility.wait(0.5) if (triggerRef as actor && !(triggerRef as actor).isDead()) damagePerSec = ((((triggerRef as actor).GetBaseActorValue("Health"))/100) + 1) totalDamage = totalDamage + damagePerSec ;If the actor does not already have a poison effect on them if (totalDamage >= 8) debug.Notification("has applied gas") Utility.wait(0.5) ;(triggerRef as actor).addSpell(gasSpell01) triggerRef.placeAtMe(PoisonGasExplosion) totalDamage = totalDamage - 8 endif endif Utility.wait(0.5) endwhile endif endEvent ;===================================================================== ; END OF CATWHEEL'S ADDITION (MORE AT THE BOTTOM) ;====================================================================== ;Activated by a trap trigger object event onActivate(objectReference activateRef) ResolveGasActivation(activateRef) endEvent ;This occurs when hit by a shout Event OnHit(ObjectReference Aggressor, Form akSource, Projectile akProjectile, bool abPowerAttack, bool abSneakAttack, bool abBashAttack, bool abHitBlocked) if Aggressor == Game.GetPlayer() && (akSource as spell) resolveShoutLogic(akSource as spell) endif endEvent endState auto State Off event onBeginState() bIsFogOn = False playAnimation("playAnim01") ;offAnim endEvent event onActivate(objectReference activateRef) ResolveGasActivation(activateRef) endEvent endState State TempCleared event onBeginState() bIsFogOn = False playAnimation("playAnim01") ;offAnim utility.wait(timeToClear) if TemporarilyCleared TemporarilyCleared = False goToState("On") else goToState("Off") endif endEvent event onActivate(objectReference activateRef) ResolveGasActivation(activateRef) endEvent endState ;=================================================================== ;;FUNCTION BLOCK ;=================================================================== Function ResolveShoutLogic(Spell akSpell) ; debug.Trace(self + "MQShoutTrigger: fireTriggerEvent from " + akSpell) TemporarilyCleared = True ; set the time that this fog portion will stay cleared based on strength of the shout if akSpell == voicelv01 timeToClear = clearTimeWeak elseif akSpell == voicelv02 timeToClear = clearTimeMed elseif akSpell == voicelv03 timeToClear = clearTimeStrong endif goToState("TempCleared") ;setFogState(false) ; ;debug.Trace(self + "Waiting " + timeToClear) ;utility.wait(timeToClear) ; if allowEnableFlag ;self.enable() ; setFogState(true) ; endif ; goToState("WaitingForTrigger") endFunction ; Function resolveTriggerLogic(ObjectReference TriggerRef = None, Spell SpellRef = None) ;respond if struck by one of the shout projectiles ; ; debug.Trace( self + "MQShoutTrigger: resolveTriggerLogic ObjectRef=" + TriggerRef + ", SpellRef=" + spellRef) ; if spellRef;&& (spellRef == voicelv01 || spellRef == voicelv02 || spellRef == voicelv03) ; goToState("HasBeenTriggered") ; fireTriggerEvent(spellRef) ; endif ; endFunction ;Handle turning on or off function ResolveGasActivation(objectReference activateRef) TrapTriggerBase TriggerRef ;TriggerRef will always be a TrapTriggerBase TriggerRef = activateRef as TrapTriggerBase ;Set TriggerRef to our activateRef if TriggerRef if TriggerRef.TriggerType == 0 ;single loop = False if bIsFogOn ;do nothing Else ;turn on unregisterForUpdate() registerForSingleUpdate(fDuration) goToState("On") ;onAnim endif elseif TriggerRef.TriggerType == 1 ;hold if loop loop = False else loop = True endif if bIsFogOn ;turn off if TemporarilyCleared TemporarilyCleared = False else goToState("Off") ;offAnim endif Else ;turn on goToState("On") ;onAnim endif elseif TriggerRef.TriggerType == 2 ;toggle if bIsFogOn loop = False ;turn off if TemporarilyCleared TemporarilyCleared = False else goToState("Off") ;offAnim endif Else loop = True ;turn on goToState("On") ;onAnim endif elseif TriggerRef.TriggerType == 3 ;turn on loop = True if bIsFogOn ;do nothing else ;turn on goToState("On") ;onAnim endif elseif TriggerRef.TriggerType == 4 ;turn off loop = False if bIsFogOn ;turn off if TemporarilyCleared TemporarilyCleared = False else goToState("Off") ;offAnim endif Else ;do nothing endif endif Else endif endFunction event onUpdate() unregisterForUpdate() if getState() == "On" if !loop goToState("Off") endif elseif getState() == "TempCleared" TemporarilyCleared = False else endif endEvent ; Function setFogState(bool bTurnOnFog) ; bIsFogOn = bTurnOnFog ; if bTurnOnFog ; ; debug.Trace("Re-fogging: "+self) ; self.enable() ; else ; ; debug.Trace("unfogging: "+self) ; self.disable() ; endif ; endFunction ;===================================================================== ;CATWHEEL'S ADDITION ;====================================================================== int property LvlThreshold1 auto int property LvlThreshold2 auto int property LvlThreshold3 auto int property LvlThreshold4 auto int property LvlThreshold5 auto Explosion property ttgTrapPoisonGasExplosion01 auto ;Explosion property TrapPoisonGasExplosion01 auto ;Explosion property TrapPoisonGasExplosion02 auto ;Explosion property TrapPoisonGasExplosion03 auto ;Explosion property TrapPoisonGasExplosion04 auto ;Explosion property TrapPoisonGasExplosion05 auto ;Explosion property TrapPoisonGasExplosion06 auto Function ResolveLeveledExplosion () ;Trace("ResolveLeveledWeapon") int damageLevel damageLevel = CalculateEncounterLevel(TrapLevel) ; weapon lvlWeaponM = LvlWeaponM1 ; weapon lvlWeaponL = LvlWeaponL1 ; weapon lvlWeaponR = LvlWeaponR1 explosion LvlExplosion = ttgTrapPoisonGasExplosion01 ; ballistaWeaponM = lvlWeaponM ; ballistaWeaponL = lvlWeaponL ; ballistaWeaponR = lvlWeaponR PoisonGasExplosion = LvlExplosion weaponResolved = True EndFunction In short the new code starts it says all the notifications but no damage is received when it says "has applied gas" Any ideas how to get the poison damage to properly apply!? Edited April 14, 2012 by Guest Link to comment Share on other sites More sharing options...
Deleted800173User Posted April 15, 2012 Author Share Posted April 15, 2012 (edited) I Solved the gas problem. Apparently on trigger has a lot of issues because it repeats itself while the actor is in the box. Edited April 15, 2012 by Guest Link to comment Share on other sites More sharing options...
Recommended Posts