From 77d22749f15d419e4b4e064a379691fb9a1a7b7a Mon Sep 17 00:00:00 2001 From: GauHelldragon Date: Sun, 13 Jan 2013 17:30:27 -0800 Subject: [PATCH 01/19] Hydroponics trays will update icons after being weeded now. --- code/game/machinery/hydroponics.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/machinery/hydroponics.dm b/code/game/machinery/hydroponics.dm index b611b974a3..9373768ecf 100644 --- a/code/game/machinery/hydroponics.dm +++ b/code/game/machinery/hydroponics.dm @@ -723,6 +723,7 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob) if(src.weedlevel > 0) user.visible_message("\red [user] starts uprooting the weeds.", "\red You remove the weeds from the [src].") src.weedlevel = 0 + src.updateicon() else user << "\red This plot is completely devoid of weeds. It doesn't need uprooting." From 558fad6428fed23b542431a14a5ac305834061d3 Mon Sep 17 00:00:00 2001 From: RavingManiac Date: Wed, 16 Jan 2013 04:10:59 +0800 Subject: [PATCH 02/19] required_players_secret added, which is the number of players needed for a game mode to start when that mode has been chosen at random. required_players for most modes reduced to the number of antagonists + 1, as the variable is only used when the game mode is explicitly voted for. --- code/game/gamemodes/changeling/changeling.dm | 3 ++- code/game/gamemodes/changeling/traitor_chan.dm | 3 ++- code/game/gamemodes/cult/cult.dm | 3 ++- code/game/gamemodes/epidemic/epidemic.dm | 3 ++- code/game/gamemodes/game_mode.dm | 10 ++++++++-- code/game/gamemodes/malfunction/malfunction.dm | 3 ++- code/game/gamemodes/meme/meme.dm | 3 ++- code/game/gamemodes/nuclear/nuclear.dm | 3 ++- code/game/gamemodes/revolution/revolution.dm | 3 ++- code/game/gamemodes/revolution/rp_revolution.dm | 3 ++- code/game/gamemodes/wizard/wizard.dm | 3 ++- 11 files changed, 28 insertions(+), 12 deletions(-) diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index b988cf2447..da377f2513 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -9,7 +9,8 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" config_tag = "changeling" restricted_jobs = list("AI", "Cyborg") protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain") - required_players = 15 + required_players = 2 + required_players_secret = 5 required_enemies = 1 recommended_enemies = 4 diff --git a/code/game/gamemodes/changeling/traitor_chan.dm b/code/game/gamemodes/changeling/traitor_chan.dm index d8afb69ed0..12a5525428 100644 --- a/code/game/gamemodes/changeling/traitor_chan.dm +++ b/code/game/gamemodes/changeling/traitor_chan.dm @@ -3,7 +3,8 @@ config_tag = "traitorchan" traitors_possible = 3 //hard limit on traitors if scaling is turned off restricted_jobs = list("AI", "Cyborg") - required_players = 20 + required_players = 3 + required_players_secret = 10 required_enemies = 2 recommended_enemies = 3 diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index f973540303..56e8e20a31 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -22,7 +22,8 @@ config_tag = "cult" restricted_jobs = list("Chaplain","AI", "Cyborg", "Security Officer", "Warden", "Detective", "Head of Security", "Captain") protected_jobs = list() - required_players = 15 + required_players = 5 + required_players_secret = 15 required_enemies = 3 recommended_enemies = 4 diff --git a/code/game/gamemodes/epidemic/epidemic.dm b/code/game/gamemodes/epidemic/epidemic.dm index 03cc1104e2..0d4a20ff2f 100644 --- a/code/game/gamemodes/epidemic/epidemic.dm +++ b/code/game/gamemodes/epidemic/epidemic.dm @@ -1,7 +1,8 @@ /datum/game_mode/epidemic name = "epidemic" config_tag = "epidemic" - required_players = 6 + required_players = 1 + required_players_secret = 15 var/const/waittime_l = 300 //lower bound on time before intercept arrives (in tenths of seconds) var/const/waittime_h = 600 //upper bound on time before intercept arrives (in tenths of seconds) diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 0f33bddb99..6825efd74b 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -24,6 +24,7 @@ var/list/restricted_jobs = list() // Jobs it doesn't make sense to be. I.E chaplain or AI cultist var/list/protected_jobs = list() // Jobs that can't be tratiors because var/required_players = 0 + var/required_players_secret = 0 //Minimum number of players for that game mode to be chose in Secret var/required_enemies = 0 var/recommended_enemies = 0 var/uplink_welcome = "Syndicate Uplink Console:" @@ -83,8 +84,13 @@ Whitespace:Seperator; for(var/mob/new_player/player in player_list) if((player.client)&&(player.ready)) playerC++ - if(playerC >= required_players) - return 1 + + if(master_mode=="secret") + if(playerC >= required_players_secret) + return 1 + else + if(playerC >= required_players) + return 1 return 0 diff --git a/code/game/gamemodes/malfunction/malfunction.dm b/code/game/gamemodes/malfunction/malfunction.dm index 34545842cc..77130f5ac1 100644 --- a/code/game/gamemodes/malfunction/malfunction.dm +++ b/code/game/gamemodes/malfunction/malfunction.dm @@ -4,7 +4,8 @@ /datum/game_mode/malfunction name = "AI malfunction" config_tag = "malfunction" - required_players = 20 + required_players = 2 + required_players_secret = 15 required_enemies = 1 recommended_enemies = 1 diff --git a/code/game/gamemodes/meme/meme.dm b/code/game/gamemodes/meme/meme.dm index 30bb4e1d43..0f9bb44bab 100644 --- a/code/game/gamemodes/meme/meme.dm +++ b/code/game/gamemodes/meme/meme.dm @@ -5,7 +5,8 @@ /datum/game_mode/meme name = "Memetic Anomaly" config_tag = "meme" - required_players = 6 + required_players = 3 + required_players_secret = 10 restricted_jobs = list("AI", "Cyborg") recommended_enemies = 2 // need at least a meme and a host votable = 0 // temporarily disable this mode for voting diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index 60b683d441..ebc4bfd5b2 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -5,7 +5,8 @@ /datum/game_mode/nuclear name = "nuclear emergency" config_tag = "nuclear" - required_players = 20 // 20 players - 5 players to be the nuke ops = 15 players remaining + required_players = 6 + required_players_secret = 15 // 15 players - 5 players to be the nuke ops = 10 players remaining required_enemies = 5 recommended_enemies = 5 diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index a210d856cd..e45ebfec87 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -15,7 +15,8 @@ name = "revolution" config_tag = "revolution" restricted_jobs = list("Security Officer", "Warden", "Detective", "AI", "Cyborg","Captain", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer") - required_players = 20 + required_players = 4 + required_players_secret = 15 required_enemies = 3 recommended_enemies = 3 diff --git a/code/game/gamemodes/revolution/rp_revolution.dm b/code/game/gamemodes/revolution/rp_revolution.dm index e26c0acc4d..1532a1b927 100644 --- a/code/game/gamemodes/revolution/rp_revolution.dm +++ b/code/game/gamemodes/revolution/rp_revolution.dm @@ -3,7 +3,8 @@ /datum/game_mode/revolution/rp_revolution name = "rp-revolution" config_tag = "rp-revolution" - required_players = 12 + required_players = 4 + required_players_secret = 12 required_enemies = 3 recommended_enemies = 3 diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index dec9e7496c..36f630ff26 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -5,7 +5,8 @@ /datum/game_mode/wizard name = "wizard" config_tag = "wizard" - required_players = 20 + required_players = 2 + required_players_secret = 10 required_enemies = 1 recommended_enemies = 1 From e8a4dd33c5d05a2c0b832f9eb2ae8c55cf589c0d Mon Sep 17 00:00:00 2001 From: cib Date: Tue, 15 Jan 2013 23:03:06 +0100 Subject: [PATCH 03/19] Updated changelog. --- html/changelog.html | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/html/changelog.html b/html/changelog.html index 1de473de9f..e28d64ebfa 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,39 @@ Stuff which is in development and not yet visible to players or just code relate should be listed in the changelog upon commit though. Thanks. --> +
+

November 2012 - January 2013

+

chinsky updated:

+
    +
  • Several cargo crates from pre-merge were ported.
  • +
  • Contraband crate is no longer labeled as such.
  • +
  • In space, no one can hear you scream now.
  • +
+

CIB updated:

+
    +
  • Airflow produces subtle sound effects now.
  • +
  • Events are now adjusted based on department activity.
  • +
  • The virus event will spawn BS12 vira.
  • +
  • Two new traitor objectives: Brig and Harm
  • +
  • Space no longer makes rooms cold.
  • +
  • Gibbing creates actual limbs you can pick up, if you're lucky a complete head with brain.
  • +
  • It's now possible to miss in combat(melee and guns), instead of just hitting the torso rather than the head. This makes targetting the head much riskier than before.
  • +
  • Chemicals now last 10x as long in the blood, but their effect is also reduced equally.
  • +
  • IV drips now have a right-click option to take blood rather than give it.
  • +
  • Everyone gets a crew manifest.
  • +
+

CaelAislinn updated:

+
    +
  • There now is a client-toggle for whether to become a space-ninja.
  • +
  • Reduced startup lag by removing a vermin-related proc.
  • +
  • Several alien balance fixes.
  • +
+

Ravensdale updated:

+
    +
  • Ported station-wide explosion sounds.
  • +
+
+

December 3rd

Cael_Aislinn updated:

From e181b90ca2ca50de1277aa5cdab2bb0c68071ff6 Mon Sep 17 00:00:00 2001 From: cib Date: Wed, 16 Jan 2013 02:55:23 +0100 Subject: [PATCH 04/19] Bugfix: Fix metabolism rates for foods, drinks and sleep toxins. --- code/modules/reagents/Chemistry-Reagents.dm | 132 ++++++++++++-------- 1 file changed, 82 insertions(+), 50 deletions(-) diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 0a9ff96ef4..6c76764b8b 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -2,6 +2,7 @@ #define LIQUID 2 #define GAS 3 #define REAGENTS_OVERDOSE 30 +#define FOOD_METABOLISM 0.4 //The reaction procs must ALWAYS set src = null, this detaches the proc from the object (the reagent) //so that it can continue working when the reagent is deleted while the proc is still active. @@ -310,25 +311,25 @@ datum if(!M) M = holder.my_atom M.drowsyness = max(M.drowsyness-2*REAGENTS_EFFECT_MULTIPLIER, 0) if(holder.has_reagent("toxin")) - holder.remove_reagent("toxin", 2*REAGENTS_EFFECT_MULTIPLIER) + holder.remove_reagent("toxin", 10*REAGENTS_METABOLISM) if(holder.has_reagent("stoxin")) - holder.remove_reagent("stoxin", 2*REAGENTS_EFFECT_MULTIPLIER) + holder.remove_reagent("stoxin", 10*REAGENTS_METABOLISM) if(holder.has_reagent("plasma")) - holder.remove_reagent("plasma", 1*REAGENTS_EFFECT_MULTIPLIER) + holder.remove_reagent("plasma", 10*REAGENTS_METABOLISM) if(holder.has_reagent("sacid")) - holder.remove_reagent("sacid", 1*REAGENTS_EFFECT_MULTIPLIER) + holder.remove_reagent("sacid", 10*REAGENTS_METABOLISM) if(holder.has_reagent("cyanide")) - holder.remove_reagent("cyanide", 1*REAGENTS_EFFECT_MULTIPLIER) + holder.remove_reagent("cyanide", 10*REAGENTS_METABOLISM) if(holder.has_reagent("amatoxin")) - holder.remove_reagent("amatoxin", 2*REAGENTS_EFFECT_MULTIPLIER) + holder.remove_reagent("amatoxin", 10*REAGENTS_METABOLISM) if(holder.has_reagent("chloralhydrate")) - holder.remove_reagent("chloralhydrate", 5*REAGENTS_EFFECT_MULTIPLIER) + holder.remove_reagent("chloralhydrate", 10*REAGENTS_METABOLISM) if(holder.has_reagent("carpotoxin")) - holder.remove_reagent("carpotoxin", 1*REAGENTS_EFFECT_MULTIPLIER) + holder.remove_reagent("carpotoxin", 10*REAGENTS_METABOLISM) if(holder.has_reagent("zombiepowder")) - holder.remove_reagent("zombiepowder", 0.5*REAGENTS_EFFECT_MULTIPLIER) + holder.remove_reagent("zombiepowder", 10*REAGENTS_METABOLISM) if(holder.has_reagent("mindbreaker")) - holder.remove_reagent("mindbreaker", 2*REAGENTS_EFFECT_MULTIPLIER) + holder.remove_reagent("mindbreaker", 10*REAGENTS_METABOLISM) M.hallucination = max(0, M.hallucination - 5*REAGENTS_EFFECT_MULTIPLIER) M.adjustToxLoss(-2*REAGENTS_EFFECT_MULTIPLIER) ..() @@ -359,6 +360,8 @@ datum M.adjustToxLoss(3*REAGENTS_EFFECT_MULTIPLIER) M.adjustOxyLoss(3*REAGENTS_EFFECT_MULTIPLIER) M.sleeping += 1 + // Sleep toxins should always be consumed pretty fast + holder.remove_reagent(src.id, 0.1) ..() return @@ -428,6 +431,8 @@ datum M.stuttering = 0 M.confused = 0 M.jitteriness = 0 + // Sleep toxins should always be consumed pretty fast + holder.remove_reagent(src.id, 0.1) ..() return @@ -933,12 +938,13 @@ datum id = "virusfood" description = "A mixture of water, milk, and oxygen. Virus cells can use this mixture to reproduce." reagent_state = LIQUID - nutriment_factor = 2 * REAGENTS_METABOLISM + nutriment_factor = 2 * FOOD_METABOLISM color = "#899613" // rgb: 137, 150, 19 on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M.nutrition += nutriment_factor*REAGENTS_EFFECT_MULTIPLIER + holder.remove_reagent(src.id, FOOD_METABOLISM) ..() return @@ -1160,7 +1166,7 @@ datum on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom if(holder.has_reagent("inaprovaline")) - holder.remove_reagent("inaprovaline", 2*REAGENTS_EFFECT_MULTIPLIER) + holder.remove_reagent("inaprovaline", 10*REAGENTS_METABOLISM) M.adjustToxLoss(1*REAGENTS_EFFECT_MULTIPLIER) ..() return @@ -1279,7 +1285,7 @@ datum if(!M) M = holder.my_atom M.adjustOxyLoss(-2*REAGENTS_EFFECT_MULTIPLIER) if(holder.has_reagent("lexorin")) - holder.remove_reagent("lexorin", 2*REAGENTS_EFFECT_MULTIPLIER) + holder.remove_reagent("lexorin", 10*REAGENTS_METABOLISM) ..() return @@ -1296,7 +1302,7 @@ datum if(!M) M = holder.my_atom M.adjustOxyLoss(-M.getOxyLoss()) if(holder.has_reagent("lexorin")) - holder.remove_reagent("lexorin", 2*REAGENTS_EFFECT_MULTIPLIER) + holder.remove_reagent("lexorin", 10*REAGENTS_METABOLISM) ..() return @@ -1396,7 +1402,7 @@ datum M.AdjustStunned(-1) M.AdjustWeakened(-1) if(holder.has_reagent("mindbreaker")) - holder.remove_reagent("mindbreaker", 5) + holder.remove_reagent("mindbreaker", 10*REAGENTS_METABOLISM) M.hallucination = max(0, M.hallucination - 10*REAGENTS_EFFECT_MULTIPLIER) if(prob(60)) M.adjustToxLoss(1) ..() @@ -1713,6 +1719,9 @@ datum if(61 to INFINITY) M.sleeping += 1 M.adjustToxLoss((data - 50) * REAGENTS_EFFECT_MULTIPLIER) + + // Sleep toxins should always be consumed pretty fast + holder.remove_reagent(src.id, 0.1) ..() return @@ -1736,6 +1745,8 @@ datum M.sleeping += 1 M.adjustToxLoss(data - 50) data++ + // Sleep toxins should always be consumed pretty fast + holder.remove_reagent(src.id, 0.1) ..() return @@ -1748,12 +1759,13 @@ datum id = "nutriment" description = "All the vitamins, minerals, and carbohydrates the body needs in pure form." reagent_state = SOLID - nutriment_factor = 15 * REAGENTS_METABOLISM + nutriment_factor = 15 * FOOD_METABOLISM color = "#664330" // rgb: 102, 67, 48 on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M.nutrition += nutriment_factor // For hunger and fatness + holder.remove_reagent(src.id, FOOD_METABOLISM) ..() return @@ -1761,21 +1773,21 @@ datum name = "Coco Powder" id = "coco" description = "A fatty, bitter paste made from coco beans." - nutriment_factor = 5 * REAGENTS_METABOLISM + nutriment_factor = 5 * FOOD_METABOLISM color = "#302000" // rgb: 48, 32, 0 sprinkles name = "Sprinkles" id = "sprinkles" description = "Multi-colored little bits of sugar, commonly found on donuts. Loved by cops." - nutriment_factor = 1 * REAGENTS_METABOLISM + nutriment_factor = 1 * FOOD_METABOLISM color = "#302000" // rgb: 48, 32, 0 syndicream name = "Cream filling" id = "syndicream" description = "Delicious cream filling of a mysterious origin. Tastes criminally good." - nutriment_factor = 1 * REAGENTS_METABOLISM + nutriment_factor = 1 * FOOD_METABOLISM color = "#AB7878" // rgb: 171, 120, 120 cornoil @@ -1783,7 +1795,7 @@ datum id = "cornoil" description = "An oil derived from various types of corn." reagent_state = LIQUID - nutriment_factor = 20 * REAGENTS_METABOLISM + nutriment_factor = 20 * FOOD_METABOLISM color = "#302000" // rgb: 48, 32, 0 reaction_turf(var/turf/simulated/T, var/volume) @@ -1817,7 +1829,7 @@ datum name = "Dry Ramen" id = "dry_ramen" description = "Space age food, since August 25, 1958. Contains dried noodles, vegetables, and chemicals that boil in contact with water." - nutriment_factor = 1 * REAGENTS_METABOLISM + nutriment_factor = 1 * FOOD_METABOLISM color = "#302000" // rgb: 48, 32, 0 hot_ramen @@ -1825,7 +1837,7 @@ datum id = "hot_ramen" description = "The noodles are boiled, the flavors are artificial, just like being back in school." reagent_state = LIQUID - nutriment_factor = 5 * REAGENTS_METABOLISM + nutriment_factor = 5 * FOOD_METABOLISM color = "#302000" // rgb: 48, 32, 0 on_mob_life(var/mob/living/M as mob) @@ -1839,7 +1851,7 @@ datum id = "hell_ramen" description = "The noodles are boiled, the flavors are artificial, just like being back in school." reagent_state = LIQUID - nutriment_factor = 5 * REAGENTS_METABOLISM + nutriment_factor = 5 * FOOD_METABOLISM color = "#302000" // rgb: 48, 32, 0 on_mob_life(var/mob/living/M as mob) @@ -1851,7 +1863,7 @@ datum name = "flour" id = "flour" description = "This is what you rub all over yourself to pretend to be a ghost." - nutriment_factor = 1 * REAGENTS_METABOLISM + nutriment_factor = 1 * FOOD_METABOLISM color = "#FFFFFF" // rgb: 0, 0, 0 reaction_turf(var/turf/T, var/volume) @@ -1864,7 +1876,7 @@ datum id = "cherryjelly" description = "Totally the best. Only to be spread on foods with excellent lateral symmetry." reagent_state = LIQUID - nutriment_factor = 1 * REAGENTS_METABOLISM + nutriment_factor = 1 * FOOD_METABOLISM color = "#801E28" // rgb: 128, 30, 40 //Drugs @@ -1917,7 +1929,7 @@ datum id = "lipozine" description = "A chemical compound that causes a powerful fat-burning reaction." reagent_state = LIQUID - nutriment_factor = 10 * REAGENTS_METABOLISM + nutriment_factor = 10 * FOOD_METABOLISM color = "#BBEDA4" // rgb: 187, 237, 164 on_mob_life(var/mob/living/M as mob) @@ -1934,7 +1946,7 @@ datum id = "soysauce" description = "A salty sauce made from the soy plant." reagent_state = LIQUID - nutriment_factor = 2 * REAGENTS_METABOLISM + nutriment_factor = 2 * FOOD_METABOLISM color = "#792300" // rgb: 121, 35, 0 ketchup @@ -1942,7 +1954,7 @@ datum id = "ketchup" description = "Ketchup, catsup, whatever. It's tomato paste." reagent_state = LIQUID - nutriment_factor = 5 * REAGENTS_METABOLISM + nutriment_factor = 5 * FOOD_METABOLISM color = "#731008" // rgb: 115, 16, 8 sodiumchloride @@ -1981,7 +1993,7 @@ datum if(1 to 15) M.bodytemperature += 5 * TEMPERATURE_DAMAGE_COEFFICIENT if(holder.has_reagent("frostoil")) - holder.remove_reagent("frostoil", 5) + holder.remove_reagent("frostoil", 10*REAGENTS_METABOLISM) if(istype(M, /mob/living/carbon/metroid)) M.bodytemperature += rand(5,20) if(15 to 25) @@ -2067,7 +2079,7 @@ datum if(1 to 15) M.bodytemperature -= 5 * TEMPERATURE_DAMAGE_COEFFICIENT if(holder.has_reagent("capsaicin")) - holder.remove_reagent("capsaicin", 5) + holder.remove_reagent("capsaicin", 10*REAGENTS_METABOLISM) if(istype(M, /mob/living/carbon/metroid)) M.bodytemperature -= rand(5,20) if(15 to 25) @@ -2101,11 +2113,12 @@ datum id = "coco" description = "A fatty, bitter paste made from coco beans." reagent_state = SOLID - nutriment_factor = 5 * REAGENTS_METABOLISM + nutriment_factor = 5 * FOOD_METABOLISM color = "#302000" // rgb: 48, 32, 0 on_mob_life(var/mob/living/M as mob) M.nutrition += nutriment_factor + holder.remove_reagent(src.id, FOOD_METABOLISM) ..() return @@ -2114,13 +2127,14 @@ datum id = "hot_coco" description = "Made with love! And coco beans." reagent_state = LIQUID - nutriment_factor = 2 * REAGENTS_METABOLISM + nutriment_factor = 2 * FOOD_METABOLISM color = "#403010" // rgb: 64, 48, 16 on_mob_life(var/mob/living/M as mob) if (M.bodytemperature < 310)//310 is the normal bodytemp. 310.055 M.bodytemperature = min(310, M.bodytemperature + (5 * TEMPERATURE_DAMAGE_COEFFICIENT)) M.nutrition += nutriment_factor + holder.remove_reagent(src.id, FOOD_METABOLISM) ..() return @@ -2173,15 +2187,17 @@ datum name = "Sprinkles" id = "sprinkles" description = "Multi-colored little bits of sugar, commonly found on donuts. Loved by cops." - nutriment_factor = 1 * REAGENTS_METABOLISM + nutriment_factor = 1 * FOOD_METABOLISM color = "#302000" // rgb: 48, 32, 0 on_mob_life(var/mob/living/M as mob) M.nutrition += nutriment_factor + holder.remove_reagent(src.id, FOOD_METABOLISM) if(istype(M, /mob/living/carbon/human) && M.job in list("Security Officer", "Head of Security", "Detective", "Warden")) if(!M) M = holder.my_atom M.heal_organ_damage(1,1) M.nutrition += nutriment_factor + holder.remove_reagent(src.id, FOOD_METABOLISM) ..() return ..() @@ -2190,16 +2206,18 @@ datum name = "Cream filling" id = "syndicream" description = "Delicious cream filling of a mysterious origin. Tastes criminally good." - nutriment_factor = 1 * REAGENTS_METABOLISM + nutriment_factor = 1 * FOOD_METABOLISM color = "#AB7878" // rgb: 171, 120, 120 on_mob_life(var/mob/living/M as mob) M.nutrition += nutriment_factor + holder.remove_reagent(src.id, FOOD_METABOLISM) if(istype(M, /mob/living/carbon/human) && M.mind) if(M.mind.special_role) if(!M) M = holder.my_atom M.heal_organ_damage(1,1) M.nutrition += nutriment_factor + holder.remove_reagent(src.id, FOOD_METABOLISM) ..() return ..() @@ -2209,11 +2227,12 @@ datum id = "cornoil" description = "An oil derived from various types of corn." reagent_state = LIQUID - nutriment_factor = 20 * REAGENTS_METABOLISM + nutriment_factor = 20 * FOOD_METABOLISM color = "#302000" // rgb: 48, 32, 0 on_mob_life(var/mob/living/M as mob) M.nutrition += nutriment_factor + holder.remove_reagent(src.id, FOOD_METABOLISM) ..() return reaction_turf(var/turf/simulated/T, var/volume) @@ -2255,11 +2274,12 @@ datum id = "dry_ramen" description = "Space age food, since August 25, 1958. Contains dried noodles, vegetables, and chemicals that boil in contact with water." reagent_state = SOLID - nutriment_factor = 1 * REAGENTS_METABOLISM + nutriment_factor = 1 * FOOD_METABOLISM color = "#302000" // rgb: 48, 32, 0 on_mob_life(var/mob/living/M as mob) M.nutrition += nutriment_factor + holder.remove_reagent(src.id, FOOD_METABOLISM) ..() return @@ -2268,11 +2288,12 @@ datum id = "hot_ramen" description = "The noodles are boiled, the flavors are artificial, just like being back in school." reagent_state = LIQUID - nutriment_factor = 5 * REAGENTS_METABOLISM + nutriment_factor = 5 * FOOD_METABOLISM color = "#302000" // rgb: 48, 32, 0 on_mob_life(var/mob/living/M as mob) M.nutrition += nutriment_factor + holder.remove_reagent(src.id, FOOD_METABOLISM) if (M.bodytemperature < 310)//310 is the normal bodytemp. 310.055 M.bodytemperature = min(310, M.bodytemperature + (10 * TEMPERATURE_DAMAGE_COEFFICIENT)) ..() @@ -2283,11 +2304,12 @@ datum id = "hell_ramen" description = "The noodles are boiled, the flavors are artificial, just like being back in school." reagent_state = LIQUID - nutriment_factor = 5 * REAGENTS_METABOLISM + nutriment_factor = 5 * FOOD_METABOLISM color = "#302000" // rgb: 48, 32, 0 on_mob_life(var/mob/living/M as mob) M.nutrition += nutriment_factor + holder.remove_reagent(src.id, FOOD_METABOLISM) M.bodytemperature += 10 * TEMPERATURE_DAMAGE_COEFFICIENT ..() return @@ -2297,11 +2319,12 @@ datum id = "flour" description = "This is what you rub all over yourself to pretend to be a ghost." reagent_state = SOLID - nutriment_factor = 1 * REAGENTS_METABOLISM + nutriment_factor = 1 * FOOD_METABOLISM color = "#FFFFFF" // rgb: 0, 0, 0 on_mob_life(var/mob/living/M as mob) M.nutrition += nutriment_factor + holder.remove_reagent(src.id, FOOD_METABOLISM) ..() return @@ -2315,11 +2338,12 @@ datum id = "cherryjelly" description = "Totally the best. Only to be spread on foods with excellent lateral symmetry." reagent_state = LIQUID - nutriment_factor = 1 * REAGENTS_METABOLISM + nutriment_factor = 1 * FOOD_METABOLISM color = "#801E28" // rgb: 128, 30, 40 on_mob_life(var/mob/living/M as mob) M.nutrition += nutriment_factor + holder.remove_reagent(src.id, FOOD_METABOLISM) ..() return @@ -2332,7 +2356,7 @@ datum id = "drink" description = "Uh, some kind of drink." reagent_state = LIQUID - nutriment_factor = 1 * REAGENTS_METABOLISM + nutriment_factor = 1 * FOOD_METABOLISM color = "#E78108" // rgb: 231, 129, 8 var/adj_dizzy = 0 var/adj_drowsy = 0 @@ -2342,12 +2366,15 @@ datum on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M.nutrition += nutriment_factor + holder.remove_reagent(src.id, FOOD_METABOLISM) if (adj_dizzy) M.dizziness = max(0,M.dizziness + adj_dizzy) if (adj_drowsy) M.drowsyness = max(0,M.drowsyness + adj_drowsy) if (adj_sleepy) M.sleeping = max(0,M.sleeping + adj_sleepy) if (adj_temp) if (M.bodytemperature < 310)//310 is the normal bodytemp. 310.055 M.bodytemperature = min(310, M.bodytemperature + (25 * TEMPERATURE_DAMAGE_COEFFICIENT)) + // Drinks should be used up faster than other reagents. + holder.remove_reagent(src.id, FOOD_METABOLISM) ..() return @@ -2448,7 +2475,7 @@ datum name = "Potato Juice" id = "potato" description = "Juice of the potato. Bleh." - nutriment_factor = 2 * REAGENTS_METABOLISM + nutriment_factor = 2 * FOOD_METABOLISM color = "#302000" // rgb: 48, 32, 0 milk @@ -2460,7 +2487,7 @@ datum on_mob_life(var/mob/living/M as mob) if(M.getBruteLoss() && prob(20)) M.heal_organ_damage(1,0) if(holder.has_reagent("capsaicin")) - holder.remove_reagent("capsaicin", 2) + holder.remove_reagent("capsaicin", 10*REAGENTS_METABOLISM) ..() return @@ -2480,7 +2507,7 @@ datum name = "Hot Chocolate" id = "hot_coco" description = "Made with love! And coco beans." - nutriment_factor = 2 * REAGENTS_METABOLISM + nutriment_factor = 2 * FOOD_METABOLISM color = "#403010" // rgb: 64, 48, 16 adj_temp = 5 @@ -2498,7 +2525,9 @@ datum ..() M.make_jittery(5) if(adj_temp > 0 && holder.has_reagent("frostoil")) - holder.remove_reagent("frostoil", 5) + holder.remove_reagent("frostoil", 10*REAGENTS_METABOLISM) + + holder.remove_reagent(src.id, 0.1) return icecoffee @@ -2704,6 +2733,7 @@ datum on_mob_life(var/mob/living/M as mob) M:nutrition += nutriment_factor + holder.remove_reagent(src.id, FOOD_METABOLISM) if(!src.data) data = 1 src.data++ @@ -2749,7 +2779,7 @@ datum name = "Beer" id = "beer" description = "An alcoholic beverage made from malted grains, hops, yeast, and water." - nutriment_factor = 2 * REAGENTS_METABOLISM + nutriment_factor = 2 * FOOD_METABOLISM color = "#664300" // rgb: 102, 67, 0 on_mob_life(var/mob/living/M as mob) ..() @@ -2877,6 +2907,7 @@ datum on_mob_life(var/mob/living/M as mob) ..() M:nutrition += nutriment_factor + holder.remove_reagent(src.id, FOOD_METABOLISM) M:drowsyness = max(0,M:drowsyness-7) //if(!M:sleeping_willingly) // M:sleeping = max(0,M.sleeping-2) @@ -3026,11 +3057,12 @@ datum id = "doctorsdelight" description = "A gulp a day keeps the MediBot away. That's probably for the best." reagent_state = LIQUID - nutriment_factor = 1 * REAGENTS_METABOLISM + nutriment_factor = 1 * FOOD_METABOLISM color = "#664300" // rgb: 102, 67, 0 on_mob_life(var/mob/living/M as mob) M:nutrition += nutriment_factor + holder.remove_reagent(src.id, FOOD_METABOLISM) if(!M) M = holder.my_atom if(M:getOxyLoss() && prob(50)) M:adjustOxyLoss(-2) if(M:getBruteLoss() && prob(60)) M:heal_organ_damage(2,0) @@ -3296,14 +3328,14 @@ datum name = "Banana Mama" id = "bananahonk" description = "A drink from Clown Heaven." - nutriment_factor = 1 * REAGENTS_METABOLISM + nutriment_factor = 1 * FOOD_METABOLISM color = "#664300" // rgb: 102, 67, 0 silencer name = "Silencer" id = "silencer" description = "A drink from Mime Heaven." - nutriment_factor = 1 * REAGENTS_METABOLISM + nutriment_factor = 1 * FOOD_METABOLISM color = "#664300" // rgb: 102, 67, 0 changelingsting @@ -3348,5 +3380,5 @@ datum name = "Driest Martini" id = "driestmartini" description = "Only for the experienced. You think you see sand floating in the glass." - nutriment_factor = 1 * REAGENTS_METABOLISM + nutriment_factor = 1 * FOOD_METABOLISM color = "#2E6671" // rgb: 46, 102, 113 From d321a3aaf22ccc81a6cac2c826644a0bbd6a3c55 Mon Sep 17 00:00:00 2001 From: Cael_Aislinn Date: Thu, 17 Jan 2013 18:19:50 +1000 Subject: [PATCH 05/19] removed two more unused files Signed-off-by: Cael_Aislinn --- code/WorkInProgress/mapload/dmm_suite.dm | 246 ----------------------- code/WorkInProgress/mapload/reader.dm | 181 ----------------- 2 files changed, 427 deletions(-) delete mode 100644 code/WorkInProgress/mapload/dmm_suite.dm delete mode 100644 code/WorkInProgress/mapload/reader.dm diff --git a/code/WorkInProgress/mapload/dmm_suite.dm b/code/WorkInProgress/mapload/dmm_suite.dm deleted file mode 100644 index f096d55564..0000000000 --- a/code/WorkInProgress/mapload/dmm_suite.dm +++ /dev/null @@ -1,246 +0,0 @@ -dmm_suite - /* - - dmm_suite version 1.0 - Released January 30th, 2011. - - defines the object /dmm_suite - - Provides the proc load_map() - - Loads the specified map file onto the specified z-level. - - provides the proc write_map() - - Returns a text string of the map in dmm format - ready for output to a file. - - provides the proc save_map() - - Returns a .dmm file if map is saved - - Returns FALSE if map fails to save - - The dmm_suite provides saving and loading of map files in BYOND's native DMM map - format. It approximates the map saving and loading processes of the Dream Maker - and Dream Seeker programs so as to allow editing, saving, and loading of maps at - runtime. - - ------------------------ - - To save a map at runtime, create an instance of /dmm_suite, and then call - write_map(), which accepts three arguments: - - A turf representing one corner of a three dimensional grid (Required). - - Another turf representing the other corner of the same grid (Required). - - Any, or a combination, of several bit flags (Optional, see documentation). - - The order in which the turfs are supplied does not matter, the /dmm_writer will - determine the grid containing both, in much the same way as DM's block() function. - write_map() will then return a string representing the saved map in dmm format; - this string can then be saved to a file, or used for any other purose. - - ------------------------ - - To load a map at runtime, create an instance of /dmm_suite, and then call load_map(), - which accepts two arguments: - - A .dmm file to load (Required). - - A number representing the z-level on which to start loading the map (Optional). - - The /dmm_suite will load the map file starting on the specified z-level. If no - z-level was specified, world.maxz will be increased so as to fit the map. Note - that if you wish to load a map onto a z-level that already has objects on it, - you will have to handle the removal of those objects. Otherwise the new map will - simply load the new objects on top of the old ones. - - Also note that all type paths specified in the .dmm file must exist in the world's - code, and that the /dmm_reader trusts that files to be loaded are in fact valid - .dmm files. Errors in the .dmm format will cause runtime errors. - - */ - - - verb/load_map(var/dmm_file as file, var/z_offset as num) - // dmm_file: A .dmm file to load (Required). - // z_offset: A number representing the z-level on which to start loading the map (Optional). - - - verb/write_map(var/turf/t1 as turf, var/turf/t2 as turf, var/flags as num) - // t1: A turf representing one corner of a three dimensional grid (Required). - // t2: Another turf representing the other corner of the same grid (Required). - // flags: Any, or a combination, of several bit flags (Optional, see documentation). - - // save_map is included as a legacy proc. Use write_map instead. - verb/save_map(var/turf/t1 as turf, var/turf/t2 as turf, var/map_name as text, var/flags as num) - // t1: A turf representing one corner of a three dimensional grid (Required). - // t2: Another turf representing the other corner of the same grid (Required). - // map_name: A valid name for the map to be saved, such as "castle" (Required). - // flags: Any, or a combination, of several bit flags (Optional, see documentation). - - -#define DMM_IGNORE_AREAS 1 -#define DMM_IGNORE_TURFS 2 -#define DMM_IGNORE_OBJS 4 -#define DMM_IGNORE_NPCS 8 -#define DMM_IGNORE_PLAYERS 16 -#define DMM_IGNORE_MOBS 24 -dmm_suite{ - var{ - quote = "\"" - list/letter_digits = list( - "a","b","c","d","e", - "f","g","h","i","j", - "k","l","m","n","o", - "p","q","r","s","t", - "u","v","w","x","y", - "z", - "A","B","C","D","E", - "F","G","H","I","J", - "K","L","M","N","O", - "P","Q","R","S","T", - "U","V","W","X","Y", - "Z" - ) - } - save_map(var/turf/t1 as turf, var/turf/t2 as turf, var/map_name as text, var/flags as num){ - //Check for illegal characters in file name... in a cheap way. - if(!((ckeyEx(map_name)==map_name) && ckeyEx(map_name))){ - CRASH("Invalid text supplied to proc save_map, invalid characters or empty string.") - } - //Check for valid turfs. - if(!isturf(t1) || !isturf(t2)){ - CRASH("Invalid arguments supplied to proc save_map, arguments were not turfs.") - } - var/file_text = write_map(t1,t2,flags) - if(fexists("[map_name].dmm")){ - fdel("[map_name].dmm") - } - var/saved_map = file("[map_name].dmm") - saved_map << file_text - return saved_map - } - write_map(var/turf/t1 as turf, var/turf/t2 as turf, var/flags as num){ - //Check for valid turfs. - if(!isturf(t1) || !isturf(t2)){ - CRASH("Invalid arguments supplied to proc write_map, arguments were not turfs.") - } - var/turf/nw = locate(min(t1.x,t2.x),max(t1.y,t2.y),min(t1.z,t2.z)) - var/turf/se = locate(max(t1.x,t2.x),min(t1.y,t2.y),max(t1.z,t2.z)) - var/list/templates[0] - var/template_buffer = {""} - var/dmm_text = {""} - for(var/pos_z=nw.z;pos_z<=se.z;pos_z++){ - for(var/pos_y=nw.y;pos_y>=se.y;pos_y--){ - for(var/pos_x=nw.x;pos_x<=se.x;pos_x++){ - var/turf/test_turf = locate(pos_x,pos_y,pos_z) - var/test_template = make_template(test_turf, flags) - var/template_number = templates.Find(test_template) - if(!template_number){ - templates.Add(test_template) - template_number = templates.len - } - template_buffer += "[template_number]," - } - template_buffer += ";" - } - template_buffer += "." - } - var/key_length = round/*floor*/(log(letter_digits.len,templates.len-1)+1) - var/list/keys[templates.len] - for(var/key_pos=1;key_pos<=templates.len;key_pos++){ - keys[key_pos] = get_model_key(key_pos,key_length) - dmm_text += {""[keys[key_pos]]" = ([templates[key_pos]])\n"} - } - var/z_level = 0 - for(var/z_pos=1;TRUE;z_pos=findtext(template_buffer,".",z_pos)+1){ - if(z_pos>=length(template_buffer)){break} - if(z_level){dmm_text+={"\n"}} - dmm_text += {"\n(1,1,[++z_level]) = {"\n"} - var/z_block = copytext(template_buffer,z_pos,findtext(template_buffer,".",z_pos)) - for(var/y_pos=1;TRUE;y_pos=findtext(z_block,";",y_pos)+1){ - if(y_pos>=length(z_block)){break} - var/y_block = copytext(z_block,y_pos,findtext(z_block,";",y_pos)) - for(var/x_pos=1;TRUE;x_pos=findtext(y_block,",",x_pos)+1){ - if(x_pos>=length(y_block)){break} - var/x_block = copytext(y_block,x_pos,findtext(y_block,",",x_pos)) - var/key_number = text2num(x_block) - var/temp_key = keys[key_number] - dmm_text += temp_key - sleep(-1) - } - dmm_text += {"\n"} - sleep(-1) - } - dmm_text += {"\"}"} - sleep(-1) - } - return dmm_text - } - proc{ - make_template(var/turf/model as turf, var/flags as num){ - var/template = "" - var/obj_template = "" - var/mob_template = "" - var/turf_template = "" - if(!(flags & DMM_IGNORE_TURFS)){ - turf_template = "[model.type][check_attributes(model)]," - } else{ turf_template = "[world.turf],"} - var/area_template = "" - if(!(flags & DMM_IGNORE_OBJS)){ - for(var/obj/O in model.contents){ - obj_template += "[O.type][check_attributes(O)]," - } - } - for(var/mob/M in model.contents){ - if(M.client){ - if(!(flags & DMM_IGNORE_PLAYERS)){ - mob_template += "[M.type][check_attributes(M)]," - } - } - else{ - if(!(flags & DMM_IGNORE_NPCS)){ - mob_template += "[M.type][check_attributes(M)]," - } - } - } - if(!(flags & DMM_IGNORE_AREAS)){ - var/area/m_area = model.loc - area_template = "[m_area.type][check_attributes(m_area)]" - } else{ area_template = "[world.area]"} - template = "[obj_template][mob_template][turf_template][area_template]" - return template - } - check_attributes(var/atom/A){ - var/attributes_text = {"{"} - for(var/V in A.vars){ - sleep(-1) - if((!issaved(A.vars[V])) || (A.vars[V]==initial(A.vars[V]))){continue} - if(istext(A.vars[V])){ - attributes_text += {"[V] = "[A.vars[V]]""} - } - else if(isnum(A.vars[V])||ispath(A.vars[V])){ - attributes_text += {"[V] = [A.vars[V]]"} - } - else if(isicon(A.vars[V])||isfile(A.vars[V])){ - attributes_text += {"[V] = '[A.vars[V]]'"} - } - else{ - continue - } - if(attributes_text != {"{"}){ - attributes_text+={"; "} - } - } - if(attributes_text=={"{"}){ - return - } - if(copytext(attributes_text, length(attributes_text)-1, 0) == {"; "}){ - attributes_text = copytext(attributes_text, 1, length(attributes_text)-1) - } - attributes_text += {"}"} - return attributes_text - } - get_model_key(var/which as num, var/key_length as num){ - var/key = "" - var/working_digit = which-1 - for(var/digit_pos=key_length;digit_pos>=1;digit_pos--){ - var/place_value = round/*floor*/(working_digit/(letter_digits.len**(digit_pos-1))) - working_digit-=place_value*(letter_digits.len**(digit_pos-1)) - key = "[key][letter_digits[place_value+1]]" - } - return key - } - } - } diff --git a/code/WorkInProgress/mapload/reader.dm b/code/WorkInProgress/mapload/reader.dm deleted file mode 100644 index 755b96fc2d..0000000000 --- a/code/WorkInProgress/mapload/reader.dm +++ /dev/null @@ -1,181 +0,0 @@ -dmm_suite/load_map(var/dmm_file as file, var/z_offset as num) - if(!z_offset) - z_offset = world.maxz+1 - var/quote = ascii2text(34) - var/tfile = file2text(dmm_file) - var/tfile_len = length(tfile) - var/list/grid_models[0] - var/key_len = length(copytext(tfile,2,findtext(tfile,quote,2,0))) - for(var/lpos=1;lposlength(zgrid)) break - sleep(-1) - - if(findtext(tfile,quote+"}",zpos,0)+2==tfile_len) break - sleep(-1) - - -dmm_suite/proc/parse_grid(var/model as text,var/xcrd as num,var/ycrd as num,var/zcrd as num) - set background = 1 - - /*Method parse_grid() - - Accepts a text string containing a comma separated list of type paths of the - same construction as those contained in a .dmm file, and instantiates them. - */ - var/list/text_strings[0] - for(var/index=1;findtext(model,quote);index++) - /*Loop: Stores quoted portions of text in text_strings, and replaces them with an - index to that list. - - Each iteration represents one quoted section of text. - */ - text_strings.len=index - text_strings[index] = copytext(model,findtext(model,quote)+1,findtext(model,quote,findtext(model,quote)+1,0)) - model = copytext(model,1,findtext(model,quote))+"~[index]"+copytext(model,findtext(model,quote,findtext(model,quote)+1,0)+1,0) - sleep(-1) - - for(var/dpos=1;dpos!=0;dpos=findtext(model,",",dpos,0)+1) - /*Loop: Identifies each object's data, instantiates it, and reconstitues it's fields. - - Each iteration represents one object's data, including type path and field values. - */ - var/full_def = copytext(model,dpos,findtext(model,",",dpos,0)) - var/atom_def = text2path(copytext(full_def,1,findtext(full_def,"{"))) - - if(ispath(atom_def, /turf/space)) - continue - - var/list/attributes[0] - if(findtext(full_def,"{")) - full_def = copytext(full_def,1,length(full_def)) - for(var/apos=findtext(full_def,"{")+1;apos!=0;apos=findtext(full_def,";",apos,0)+1) - //Loop: Identifies each attribute/value pair, and stores it in attributes[]. - attributes.Add(copytext(full_def,apos,findtext(full_def,";",apos,0))) - if(!findtext(copytext(full_def,apos,0),";")) break - sleep(-1) - - //Construct attributes associative list - var/list/fields = new(0) - for(var/index=1;index<=attributes.len;index++) - var/trim_left = trim_text(copytext(attributes[index],1,findtext(attributes[index],"="))) - var/trim_right = trim_text(copytext(attributes[index],findtext(attributes[index],"=")+1,0)) - //Check for string - if(findtext(trim_right,"~")) - var/reference_index = copytext(trim_right,findtext(trim_right,"~")+1,0) - trim_right=text_strings[text2num(reference_index)] - //Check for number - else if(isnum(text2num(trim_right))) - trim_right = text2num(trim_right) - //Check for file - else if(copytext(trim_right,1,2) == "'") - trim_right = file(copytext(trim_right,2,length(trim_right))) - fields[trim_left] = trim_right - - //End construction - //Begin Instanciation - var/atom/instance - var/dmm_suite/preloader/_preloader = new(fields) - if(ispath(atom_def,/area)) - var/turf/A = locate(xcrd,ycrd,zcrd) - if(A.loc.name == "Space") - instance = locate(atom_def) - if(instance) - instance.contents.Add(locate(xcrd,ycrd,zcrd)) - - else - //global.current_preloader = _preloader - instance = new atom_def(locate(xcrd,ycrd,zcrd)) - if(_preloader) - _preloader.load(instance) - //End Instanciation - if(!findtext(copytext(model,dpos,0),",")) break - - -dmm_suite/proc/trim_text(var/what as text) - while(length(what) && findtext(what," ",1,2)) - what=copytext(what,2,0) - while(length(what) && findtext(what," ",length(what),0)) - what=copytext(what,1,length(what)) - return what - -/* -var/global/dmm_suite/preloader/current_preloader = null -atom/New() - if(global.current_preloader) - global.current_preloader.load(src) - ..() -*/ - - -dmm_suite/preloader - parent_type = /datum - var/list/attributes - - - New(list/the_attributes) - ..() - if(!the_attributes.len) Del() - attributes = the_attributes - - - proc/load(atom/what) - for(var/attribute in attributes) - what.vars[attribute] = attributes[attribute] - Del() - - - -/client/proc/mapload(var/dmm_map as file) - set category = "Debug" - set name = "LoadMap" - set desc = "Loads a map" - set hidden = 1 - if(src.holder) - if(!src.mob) - return - if(src.holder.rank in list("Game Admin", "Game Master")) - var/file_name = "[dmm_map]" - var/file_extension = copytext(file_name,length(file_name)-2,0) - if(file_extension != "dmm") - usr << "Supplied file must be a .dmm file." - return - var/map_z = input(usr,"Enter variable value:" ,"Value", 123) as num - if(map_z > (world.maxz+1)) - map_z = (world.maxz+1) - - var/dmm_suite/new_reader = new() - new_reader.load_map(dmm_map, map_z) - log_admin("[key_name(src.mob)] loaded a map on z:[map_z]") - - else - alert("No") - return - return From 94447740e9b8e3da1d33322a4d110e783fce0ace Mon Sep 17 00:00:00 2001 From: Cael_Aislinn Date: Fri, 18 Jan 2013 15:36:02 +1000 Subject: [PATCH 06/19] halves the speed of everything in hydroponics Signed-off-by: Cael_Aislinn --- code/game/machinery/hydroponics.dm | 42 ++++++++++++++++-------------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/code/game/machinery/hydroponics.dm b/code/game/machinery/hydroponics.dm index aec6290da7..4a704e5a88 100644 --- a/code/game/machinery/hydroponics.dm +++ b/code/game/machinery/hydroponics.dm @@ -1,3 +1,5 @@ +#define SPEED_MULTIPLIER 0.5 + /obj/machinery/hydroponics name = "hydroponics tray" icon = 'icons/obj/hydroponics.dmi' @@ -45,42 +47,42 @@ obj/machinery/hydroponics/process() lastcycle = world.time if(planted && !dead) // Advance age - age++ + age += 1 * SPEED_MULTIPLIER //Nutrients////////////////////////////////////////////////////////////// // Nutrients deplete slowly if(nutrilevel > 0) if(prob(50)) - nutrilevel -= 1 + nutrilevel -= 1 * SPEED_MULTIPLIER // Lack of nutrients hurts non-weeds if(nutrilevel <= 0 && myseed.plant_type != 1) - health -= rand(1,3) + health -= rand(1,3) * SPEED_MULTIPLIER //Water////////////////////////////////////////////////////////////////// // Drink random amount of water - waterlevel = max(waterlevel - rand(1,6), 0) + waterlevel = max(waterlevel - rand(1,6) * SPEED_MULTIPLIER, 0) // If the plant is dry, it loses health pretty fast, unless mushroom if(waterlevel <= 10 && myseed.plant_type != 2) - health -= rand(0,1) + health -= rand(0,1) * SPEED_MULTIPLIER if(waterlevel <= 0) - health -= rand(0,2) + health -= rand(0,2) * SPEED_MULTIPLIER // Sufficient water level and nutrient level = plant healthy else if(waterlevel > 10 && nutrilevel > 0) - health += rand(1,2) + health += rand(1,2) * SPEED_MULTIPLIER if(prob(5)) //5 percent chance the weed population will increase - weedlevel += 1 + weedlevel += 1 * SPEED_MULTIPLIER //Toxins///////////////////////////////////////////////////////////////// // Too much toxins cause harm, but when the plant drinks the contaiminated water, the toxins disappear slowly if(toxic >= 40 && toxic < 80) - health -= 1 - toxic -= rand(1,10) + health -= 1 * SPEED_MULTIPLIER + toxic -= rand(1,10) * SPEED_MULTIPLIER else if(toxic >= 80) // I don't think it ever gets here tbh unless above is commented out - health -= 3 - toxic -= rand(1,10) + health -= 3 * SPEED_MULTIPLIER + toxic -= rand(1,10) * SPEED_MULTIPLIER else if(toxic < 0) // Make sure it won't go overoboard toxic = 0 @@ -91,11 +93,11 @@ obj/machinery/hydroponics/process() pestlevel = 10 else if(pestlevel >= 5) - health -= 1 + health -= 1 * SPEED_MULTIPLIER // If it's a weed, it doesn't stunt the growth if(weedlevel >= 5 && myseed.plant_type != 1 ) - health -= 1 + health -= 1 * SPEED_MULTIPLIER //Health & Age/////////////////////////////////////////////////////////// @@ -107,12 +109,12 @@ obj/machinery/hydroponics/process() else if(health <= 0) dead = 1 harvest = 0 - weedlevel += 1 // Weeds flourish + weedlevel += 1 * SPEED_MULTIPLIER // Weeds flourish pestlevel = 0 // Pests die // If the plant is too old, lose health fast if(age > myseed.lifespan) - health -= rand(1,5) + health -= rand(1,5) * SPEED_MULTIPLIER // Harvest code if(age > myseed.production && (age - lastproduce) > myseed.production && (!harvest && !dead)) @@ -129,10 +131,10 @@ obj/machinery/hydroponics/process() else lastproduce = age if(prob(5)) // On each tick, there's a 5 percent chance the pest population will increase - pestlevel += 1 + pestlevel += 1 * SPEED_MULTIPLIER else if(waterlevel > 10 && nutrilevel > 0 && prob(10)) // If there's no plant, the percentage chance is 10% - weedlevel += 1 + weedlevel += 1 * SPEED_MULTIPLIER if(weedlevel > 10) weedlevel = 10 @@ -1037,4 +1039,6 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob) SetLuminosity(round(myseed.potency/10)) else SetLuminosity(0) - return \ No newline at end of file + return + +#undef SPEED_MULTIPLIER \ No newline at end of file From 8de6998d83db13c3f8cc4d0d2613a4d38b6b25b4 Mon Sep 17 00:00:00 2001 From: cib Date: Fri, 18 Jan 2013 23:37:51 +0100 Subject: [PATCH 07/19] Removed space ninja random event. --- code/game/gamemodes/events.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/gamemodes/events.dm b/code/game/gamemodes/events.dm index d35b613f63..8b338e0b96 100644 --- a/code/game/gamemodes/events.dm +++ b/code/game/gamemodes/events.dm @@ -53,7 +53,7 @@ possibleEvents["Appendicitis"] = medical_count * 50 if(security_count >= 1) possibleEvents["Prison Break"] = security_count * 50 - possibleEvents["Space Ninja"] = security_count * 10 // very low chance for space ninja event + //possibleEvents["Space Ninja"] = security_count * 10 // very low chance for space ninja event var/picked_event = pick(possibleEvents) var/chance = possibleEvents[picked_event] From 5c97214b978aa3b64c651a3c17d1bd4ab40d99ba Mon Sep 17 00:00:00 2001 From: cib Date: Sun, 20 Jan 2013 18:54:29 +0100 Subject: [PATCH 08/19] Removed an instance of spawning space ninjas I overlooked. This one would cause a space ninja to be spawned on every round, 6 minutes in. --- code/game/gamemodes/events.dm | 3 --- 1 file changed, 3 deletions(-) diff --git a/code/game/gamemodes/events.dm b/code/game/gamemodes/events.dm index 8b338e0b96..591736f711 100644 --- a/code/game/gamemodes/events.dm +++ b/code/game/gamemodes/events.dm @@ -21,9 +21,6 @@ // Doesn't necessarily trigger an event, but might. Returns 1 if it did. /proc/event() event = 1 - if(!sent_ninja_to_station) - choose_space_ninja() - return var/minutes_passed = world.time/600 From 3e6283403feef7b7eeae817e2fc36016f527ddac Mon Sep 17 00:00:00 2001 From: Cael_Aislinn Date: Mon, 21 Jan 2013 04:55:02 +1000 Subject: [PATCH 09/19] cleanup of alt titles handling, made sechuds able to see icons for the real job if players have an alt title, made custom job titles via id computer into alt titles Signed-off-by: Cael_Aislinn --- code/game/jobs/access.dm | 50 +++++++++++++------- code/game/jobs/job_controller.dm | 19 +++----- code/game/machinery/computer/card.dm | 10 ++-- code/game/objects/items/weapons/cards_ids.dm | 5 +- code/modules/client/preferences.dm | 22 ++++----- code/modules/client/preferences_savefile.dm | 6 +-- code/modules/clothing/glasses/hud.dm | 5 +- code/modules/mob/living/carbon/human/hud.dm | 2 +- code/modules/mob/living/silicon/pai/hud.dm | 2 +- 9 files changed, 67 insertions(+), 54 deletions(-) diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm index deff61f50a..b7abbce7e7 100644 --- a/code/game/jobs/access.dm +++ b/code/game/jobs/access.dm @@ -414,29 +414,45 @@ /proc/get_all_centcom_jobs() return list("VIP Guest","Custodian","Thunderdome Overseer","Intel Officer","Medical Officer","Death Commando","Research Officer","BlackOps Commander","Supreme Commander") -/obj/proc/GetJobName() +//gets the actual job rank (ignoring alt titles) +//this is used solely for sechuds +/obj/proc/GetJobRealName() if (!istype(src, /obj/item/device/pda) && !istype(src,/obj/item/weapon/card/id)) return - var/jobName - var/realJobName - - // hack for alt titles - if(istype(loc, /mob)) - var/mob/M = loc - if(M.mind && M.mind.role_alt_title == jobName && M.mind.assigned_role in get_all_jobs()) - return M.mind.assigned_role - + var/rank + var/assignment if(istype(src, /obj/item/device/pda)) if(src:id) - jobName = src:id:assignment - realJobName = src:id:assignment_real_title - if(istype(src, /obj/item/weapon/card/id)) - jobName = src:assignment - realJobName = src:assignment_real_title + rank = src:id:rank + assignment = src:id:assignment + else if(istype(src, /obj/item/weapon/card/id)) + rank = src:rank + assignment = src:assignment - if( (realJobName in get_all_jobs()) || (jobName in get_all_jobs()) ) - return jobName + if( rank in get_all_jobs() ) + return rank + + if( assignment in get_all_jobs() ) + return assignment + + return "Unknown" + +//gets the alt title, failing that the actual job rank +//this is unused +/obj/proc/sdsdsd() //GetJobDisplayName + if (!istype(src, /obj/item/device/pda) && !istype(src,/obj/item/weapon/card/id)) + return + + var/assignment + if(istype(src, /obj/item/device/pda)) + if(src:id) + assignment = src:id:assignment + else if(istype(src, /obj/item/weapon/card/id)) + assignment = src:assignment + + if(assignment) + return assignment return "Unknown" diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index 137d725c72..dd1c2c0f48 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/game/jobs/job_controller.dm @@ -38,8 +38,8 @@ var/global/datum/controller/occupations/job_master if(J.title == rank) return J return null - proc/GetAltTitle(mob/new_player/player, rank) - return player.client.prefs.GetAltTitle(GetJob(rank)) + proc/GetPlayerAltTitle(mob/new_player/player, rank) + return player.client.prefs.GetPlayerAltTitle(GetJob(rank)) proc/AssignRole(var/mob/new_player/player, var/rank, var/latejoin = 0) Debug("Running AR, Player: [player], Rank: [rank], LJ: [latejoin]") @@ -53,7 +53,7 @@ var/global/datum/controller/occupations/job_master if((job.current_positions < position_limit) || position_limit == -1) Debug("Player: [player] is now Rank: [rank], JCP:[job.current_positions], JPL:[position_limit]") player.mind.assigned_role = rank - player.mind.role_alt_title = GetAltTitle(player, rank) + player.mind.role_alt_title = GetPlayerAltTitle(player, rank) unassigned -= player job.current_positions++ return 1 @@ -299,9 +299,6 @@ var/global/datum/controller/occupations/job_master H << "Your job is [rank] and the game just can't handle it! Please report this bug to an administrator." H.job = rank - if(H.mind && H.mind.assigned_role != rank) - H.mind.assigned_role = rank - H.mind.role_alt_title = null if(!joined_late) var/obj/S = null @@ -319,6 +316,7 @@ var/global/datum/controller/occupations/job_master if(H.mind) H.mind.assigned_role = rank + H.mind.role_alt_title = null switch(rank) if("Cyborg") @@ -347,10 +345,7 @@ var/global/datum/controller/occupations/job_master if(job.req_admin_notify) H << "You are playing a job that is important for Game Progression. If you have to disconnect, please notify the admins via adminhelp." - if(H.mind.assigned_role == rank && H.mind.role_alt_title) - spawnId(H, rank, H.mind.role_alt_title) - else - spawnId(H,rank) + spawnId(H, rank, H.mind.role_alt_title) H.equip_to_slot_or_del(new /obj/item/device/radio/headset(H), slot_ears) // H.update_icons() return 1 @@ -358,7 +353,6 @@ var/global/datum/controller/occupations/job_master proc/spawnId(var/mob/living/carbon/human/H, rank, title) if(!H) return 0 - if(!title) title = rank var/obj/item/weapon/card/id/C = null var/datum/job/job = null @@ -377,7 +371,8 @@ var/global/datum/controller/occupations/job_master C = new /obj/item/weapon/card/id(H) if(C) C.registered_name = H.real_name - C.assignment = title + C.rank = rank + C.assignment = title ? title : rank C.name = "[C.registered_name]'s ID Card ([C.assignment])" H.equip_to_slot_or_del(C, slot_wear_id) H.equip_to_slot_or_del(new /obj/item/device/pda(H), slot_belt) diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm index fc422d6d87..a32e9ea134 100644 --- a/code/game/machinery/computer/card.dm +++ b/code/game/machinery/computer/card.dm @@ -232,8 +232,9 @@ var/t1 = href_list["assign_target"] if(t1 == "Custom") var/temp_t = copytext(sanitize(input("Enter a custom job assignment.","Assignment")),1,MAX_MESSAGE_LEN) - if(temp_t) - t1 = temp_t + //let custom jobs function as an impromptu alt title, mainly for sechuds + if(temp_t && modify) + modify.assignment = temp_t else var/datum/job/jobdatum for(var/jobtype in typesof(/datum/job)) @@ -246,8 +247,9 @@ return modify.access = ( istype(src,/obj/machinery/computer/card/centcom) ? get_centcom_access(t1) : jobdatum.get_access() ) - if (modify) - modify.assignment = t1 + if (modify) + modify.assignment = t1 + modify.rank = t1 if ("reg") if (authenticated) var/t2 = modify diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index 0ebd8ed7a0..028b5c93f6 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -74,8 +74,9 @@ var/dna_hash = "\[UNSET\]" var/fingerprint_hash = "\[UNSET\]" - var/assignment = null - var/assignment_real_title = null + //alt titles are handled a bit weirdly in order to unobtrusively integrate into existing ID system + var/assignment = null //can be alt title or the actual job + var/rank = null //actual job var/dorm = 0 // determines if this ID has claimed a dorm already /obj/item/weapon/card/id/attack_self(mob/user as mob) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 55259f65f0..df468ca1b6 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -91,7 +91,7 @@ datum/preferences // will probably not be able to do this for head and torso ;) var/list/organ_data = list() - var/list/job_alt_titles = new() // the default name of a job like "Medical Doctor" + var/list/player_alt_titles = new() // the default name of a job like "Medical Doctor" var/flavor_text = "" var/med_record = "" @@ -425,7 +425,7 @@ datum/preferences else HTML += " \[NEVER]" if(job.alt_titles) - HTML += "
\[[GetAltTitle(job)]\]" + HTML += "
\[[GetPlayerAltTitle(job)]\]" HTML += "" HTML += "" @@ -487,18 +487,18 @@ datum/preferences user << browse(HTML, "window=records;size=350x300") return - proc/GetAltTitle(datum/job/job) - return job_alt_titles.Find(job.title) > 0 \ - ? job_alt_titles[job.title] \ + proc/GetPlayerAltTitle(datum/job/job) + return player_alt_titles.Find(job.title) > 0 \ + ? player_alt_titles[job.title] \ : job.title - proc/SetAltTitle(datum/job/job, new_title) + proc/SetPlayerAltTitle(datum/job/job, new_title) // remove existing entry - if(job_alt_titles.Find(job.title)) - job_alt_titles -= job.title + if(player_alt_titles.Find(job.title)) + player_alt_titles -= job.title // add one if it's not default if(job.title != new_title) - job_alt_titles[job.title] = new_title + player_alt_titles[job.title] = new_title proc/SetJob(mob/user, role) var/datum/job/job = job_master.GetJob(role) @@ -638,9 +638,9 @@ datum/preferences var/datum/job/job = locate(href_list["job"]) if (job) var/choices = list(job.title) + job.alt_titles - var/choice = input("Pick a title for [job.title].", "Character Generation", GetAltTitle(job)) as anything in choices | null + var/choice = input("Pick a title for [job.title].", "Character Generation", GetPlayerAltTitle(job)) as anything in choices | null if(choice) - SetAltTitle(job, choice) + SetPlayerAltTitle(job, choice) SetChoices(user) if("input") SetJob(user, href_list["text"]) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index fd1ec7ec71..80d5e718df 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -138,7 +138,7 @@ S["sec_record"] >> sec_record S["be_special"] >> be_special S["disabilities"] >> disabilities - S["job_alt_titles"] >> job_alt_titles + S["player_alt_titles"] >> player_alt_titles S["used_skillpoints"] >> used_skillpoints S["skills"] >> skills S["skill_specialization"] >> skill_specialization @@ -182,7 +182,7 @@ if(!skills) skills = list() if(!used_skillpoints) used_skillpoints= 0 if(isnull(disabilities)) disabilities = 0 - if(!job_alt_titles) job_alt_titles = new() + if(!player_alt_titles) player_alt_titles = new() if(!organ_data) src.organ_data = list() //if(!skin_style) skin_style = "Default" @@ -232,7 +232,7 @@ S["flavor_text"] << flavor_text S["med_record"] << med_record S["sec_record"] << sec_record - S["job_alt_titles"] << job_alt_titles + S["player_alt_titles"] << player_alt_titles S["be_special"] << be_special S["used_skillpoints"] << used_skillpoints S["skills"] << skills diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index c166427404..18d20cbc85 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -83,14 +83,13 @@ var/icon/tempHud = 'icons/mob/hud.dmi' for(var/mob/living/carbon/human/perp in view(M)) if(!C) continue - var/perpname = "wot" + var/perpname = perp.name if(perp.wear_id) var/obj/item/weapon/card/id/I = perp.wear_id.GetID() if(I) - C.images += image(tempHud, perp, "hud[ckey(I.GetJobName())]") + C.images += image(tempHud, perp, "hud[ckey(I.GetJobRealName())]") perpname = I.registered_name else - perpname = perp.name C.images += image(tempHud, perp, "hudunknown") for(var/datum/data/record/E in data_core.general) diff --git a/code/modules/mob/living/carbon/human/hud.dm b/code/modules/mob/living/carbon/human/hud.dm index b5c06386d2..59961e34f9 100644 --- a/code/modules/mob/living/carbon/human/hud.dm +++ b/code/modules/mob/living/carbon/human/hud.dm @@ -629,7 +629,7 @@ Radar-related things var/mob/living/M = A if(ishuman(M)) if(M:wear_id) - var/job = M:wear_id:GetJobName() + var/job = M:wear_id:GetJobRealName() if(job == "Security Officer") blip.icon_state = "secblip" blip.name = "Security Officer" diff --git a/code/modules/mob/living/silicon/pai/hud.dm b/code/modules/mob/living/silicon/pai/hud.dm index d2f96656d6..c900ef60a8 100644 --- a/code/modules/mob/living/silicon/pai/hud.dm +++ b/code/modules/mob/living/silicon/pai/hud.dm @@ -10,7 +10,7 @@ var/turf/T = get_turf_or_move(src.loc) for(var/mob/living/carbon/human/perp in view(T)) if(perp.wear_id) - client.images += image(tempHud,perp,"hud[ckey(perp:wear_id:GetJobName())]") + client.images += image(tempHud,perp,"hud[ckey(perp:wear_id:GetJobRealName())]") var/perpname = "wot" if(istype(perp.wear_id,/obj/item/weapon/card/id)) perpname = perp.wear_id:registered_name From 082af8f6385b58cdc2d5b2607915f9b6013cb376 Mon Sep 17 00:00:00 2001 From: Cael_Aislinn Date: Mon, 21 Jan 2013 04:56:20 +1000 Subject: [PATCH 10/19] removed some duplicate events code brought in by mistake during tg port, fixed space ninja spam, renamed 'NSV Exodus' to 'NSS Exodus' Signed-off-by: Cael_Aislinn --- code/game/gamemodes/events.dm | 51 ++--------------------------------- code/global.dm | 2 +- 2 files changed, 3 insertions(+), 50 deletions(-) diff --git a/code/game/gamemodes/events.dm b/code/game/gamemodes/events.dm index fccb79cdbf..a8b1cb2692 100644 --- a/code/game/gamemodes/events.dm +++ b/code/game/gamemodes/events.dm @@ -77,57 +77,10 @@ return 0 switch(picked_event) - if("Meteor") - command_alert("Meteors have been detected on collision course with the station.", "Meteor Alert") - for(var/mob/M in player_list) - if(!istype(M,/mob/new_player)) - M << sound('sound/AI/meteors.ogg') - spawn(100) - meteor_wave() - spawn_meteors() - spawn(700) - meteor_wave() - spawn_meteors() - - if(2) - command_alert("Gravitational anomalies detected on the station. There is no additional data.", "Anomaly Alert") - for(var/mob/M in player_list) - if(!istype(M,/mob/new_player)) - M << sound('sound/AI/granomalies.ogg') - var/turf/T = pick(blobstart) - var/obj/effect/bhole/bh = new /obj/effect/bhole( T.loc, 30 ) - spawn(rand(50, 300)) - del(bh) - /* - if(3) //Leaving the code in so someone can try and delag it, but this event can no longer occur randomly, per SoS's request. --NEO - command_alert("Space-time anomalies detected on the station. There is no additional data.", "Anomaly Alert") - world << sound('sound/AI/spanomalies.ogg') - var/list/turfs = new - var/turf/picked - for(var/turf/simulated/floor/T in world) - if(T.z == 1) - turfs += T - for(var/turf/simulated/floor/T in turfs) - if(prob(20)) - spawn(50+rand(0,3000)) - picked = pick(turfs) - var/obj/effect/portal/P = new /obj/effect/portal( T ) - P.target = picked - P.creator = null - P.icon = 'icons/obj/objects.dmi' - P.failchance = 0 - P.icon_state = "anom" - P.name = "wormhole" - spawn(rand(300,600)) - del(P) - */ - if(3) - if((world.time/10)>=3600 && toggle_space_ninja && !sent_ninja_to_station)//If an hour has passed, relatively speaking. Also, if ninjas are allowed to spawn and if there is not already a ninja for the round. - space_ninja_arrival()//Handled in space_ninja.dm. Doesn't announce arrival, all sneaky-like. - if(4) mini_blob_event() if("Space Ninja") //Handled in space_ninja.dm. Doesn't announce arrival, all sneaky-like. - space_ninja_arrival() + if((world.time/10)>=3600 && toggle_space_ninja && !sent_ninja_to_station) + space_ninja_arrival() if("Radiation") high_radiation_event() if("Virus") diff --git a/code/global.dm b/code/global.dm index 62c22b4662..8e1c8dc1c9 100644 --- a/code/global.dm +++ b/code/global.dm @@ -70,7 +70,7 @@ var/blobevent = 0 var/diary = null var/diaryofmeanpeople = null var/href_logfile = null -var/station_name = "NSV Exodus" +var/station_name = "NSS Exodus" var/game_version = "Baystation12" var/changelog_hash = "" From 0752ca2fff9596ca0b2eaf78c58e08bebddceaf4 Mon Sep 17 00:00:00 2001 From: Cael_Aislinn Date: Mon, 21 Jan 2013 05:38:04 +1000 Subject: [PATCH 11/19] changed erroneous name in sec hardsuit, reverted some derpy chemistry merging Signed-off-by: Cael_Aislinn --- code/modules/clothing/spacesuits/rig.dm | 2 +- code/modules/reagents/Chemistry-Reagents.dm | 456 +++++++------------- 2 files changed, 155 insertions(+), 303 deletions(-) diff --git a/code/modules/clothing/spacesuits/rig.dm b/code/modules/clothing/spacesuits/rig.dm index a2c432f372..7f6863528d 100644 --- a/code/modules/clothing/spacesuits/rig.dm +++ b/code/modules/clothing/spacesuits/rig.dm @@ -133,7 +133,7 @@ /obj/item/clothing/suit/space/rig/security desc = "A special suit that protects against hazardous, low pressure environments. Has additional layers of armour and ablative shielding in lieu of radiation shielding." icon_state = "rig-security" - name = "atmos hardsuit" + name = "security hardsuit" item_state = "atmos_hardsuit" armor = list(melee = 45, bullet = 10, laser = 25,energy = 10, bomb = 40, bio = 100, rad = 5) allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/weapon/gun/energy) diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 0b147e657a..ff401e9447 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -1,7 +1,6 @@ #define SOLID 1 #define LIQUID 2 #define GAS 3 -#define FOOD_METABOLISM 0.4 //The reaction procs must ALWAYS set src = null, this detaches the proc from the object (the reagent) //so that it can continue working when the reagent is deleted while the proc is still active. @@ -270,27 +269,28 @@ datum if(!M) M = holder.my_atom M.drowsyness = max(M.drowsyness-2, 0) if(holder.has_reagent("toxin")) - holder.remove_reagent("toxin", 10*REAGENTS_METABOLISM) + holder.remove_reagent("toxin", 2) if(holder.has_reagent("stoxin")) - holder.remove_reagent("stoxin", 10*REAGENTS_METABOLISM) + holder.remove_reagent("stoxin", 2) if(holder.has_reagent("plasma")) - holder.remove_reagent("plasma", 10*REAGENTS_METABOLISM) + holder.remove_reagent("plasma", 1) if(holder.has_reagent("sacid")) - holder.remove_reagent("sacid", 10*REAGENTS_METABOLISM) + holder.remove_reagent("sacid", 1) if(holder.has_reagent("cyanide")) - holder.remove_reagent("cyanide", 10*REAGENTS_METABOLISM) + holder.remove_reagent("cyanide", 1) if(holder.has_reagent("amatoxin")) - holder.remove_reagent("amatoxin", 10*REAGENTS_METABOLISM) + holder.remove_reagent("amatoxin", 2) if(holder.has_reagent("chloralhydrate")) - holder.remove_reagent("chloralhydrate", 10*REAGENTS_METABOLISM) + holder.remove_reagent("chloralhydrate", 5) if(holder.has_reagent("carpotoxin")) - holder.remove_reagent("carpotoxin", 10*REAGENTS_METABOLISM) + holder.remove_reagent("carpotoxin", 1) if(holder.has_reagent("zombiepowder")) - holder.remove_reagent("zombiepowder", 10*REAGENTS_METABOLISM) + holder.remove_reagent("zombiepowder", 0.5) if(holder.has_reagent("mindbreaker")) - holder.remove_reagent("mindbreaker", 10*REAGENTS_METABOLISM) - M.hallucination = max(0, M.hallucination - 5*REAGENTS_EFFECT_MULTIPLIER) - M.adjustToxLoss(-2*REAGENTS_EFFECT_MULTIPLIER) ..() + holder.remove_reagent("mindbreaker", 2) + M.hallucination = max(0, M.hallucination - 5) + M.adjustToxLoss(-2) + ..() return toxin @@ -318,8 +318,6 @@ datum M.adjustToxLoss(3) M.adjustOxyLoss(3) M.sleeping += 1 - // Sleep toxins should always be consumed pretty fast - holder.remove_reagent(src.id, 0.1) ..() return @@ -442,8 +440,6 @@ datum M.stuttering = 0 M.confused = 0 M.jitteriness = 0 - // Sleep toxins should always be consumed pretty fast - holder.remove_reagent(src.id, 0.1) ..() return @@ -926,13 +922,12 @@ datum id = "virusfood" description = "A mixture of water, milk, and oxygen. Virus cells can use this mixture to reproduce." reagent_state = LIQUID - nutriment_factor = 2 * FOOD_METABOLISM + nutriment_factor = 2 * REAGENTS_METABOLISM color = "#899613" // rgb: 137, 150, 19 on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M.nutrition += nutriment_factor - holder.remove_reagent(src.id, FOOD_METABOLISM) ..() return @@ -1156,8 +1151,9 @@ datum on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom if(holder.has_reagent("inaprovaline")) - holder.remove_reagent("inaprovaline", 10*REAGENTS_METABOLISM) - M.adjustToxLoss(1*REAGENTS_EFFECT_MULTIPLIER) ..() + holder.remove_reagent("inaprovaline", 2) + M.adjustToxLoss(1) + ..() return reaction_obj(var/obj/O, var/volume) src = null @@ -1274,7 +1270,8 @@ datum if(!M) M = holder.my_atom M.adjustOxyLoss(-2) if(holder.has_reagent("lexorin")) - holder.remove_reagent("lexorin", 10*REAGENTS_METABOLISM) ..() + holder.remove_reagent("lexorin", 2) + ..() return dexalinp @@ -1290,7 +1287,8 @@ datum if(!M) M = holder.my_atom M.adjustOxyLoss(-M.getOxyLoss()) if(holder.has_reagent("lexorin")) - holder.remove_reagent("lexorin", 10*REAGENTS_METABOLISM) ..() + holder.remove_reagent("lexorin", 2) + ..() return tricordrazine @@ -1389,7 +1387,7 @@ datum M.AdjustStunned(-1) M.AdjustWeakened(-1) if(holder.has_reagent("mindbreaker")) - holder.remove_reagent("mindbreaker", 10*REAGENTS_METABOLISM) + holder.remove_reagent("mindbreaker", 5) M.hallucination = max(0, M.hallucination - 10) if(prob(60)) M.adjustToxLoss(1) ..() @@ -1740,9 +1738,6 @@ datum if(51 to INFINITY) M.sleeping += 1 M.adjustToxLoss(data - 50) - - // Sleep toxins should always be consumed pretty fast - holder.remove_reagent(src.id, 0.1) ..() return @@ -1766,8 +1761,6 @@ datum M.sleeping += 1 M.adjustToxLoss(data - 50) data++ - // Sleep toxins should always be consumed pretty fast - holder.remove_reagent(src.id, 0.1) ..() return @@ -1780,176 +1773,35 @@ datum id = "nutriment" description = "All the vitamins, minerals, and carbohydrates the body needs in pure form." reagent_state = SOLID - nutriment_factor = 15 * FOOD_METABOLISM + nutriment_factor = 15 * REAGENTS_METABOLISM color = "#664330" // rgb: 102, 67, 48 on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom if(prob(50)) M.heal_organ_damage(1,0) M.nutrition += nutriment_factor // For hunger and fatness - holder.remove_reagent(src.id, FOOD_METABOLISM) ..() - return - - coco - name = "Coco Powder" - id = "coco" - description = "A fatty, bitter paste made from coco beans." - nutriment_factor = 5 * FOOD_METABOLISM - color = "#302000" // rgb: 48, 32, 0 - - sprinkles - name = "Sprinkles" - id = "sprinkles" - description = "Multi-colored little bits of sugar, commonly found on donuts. Loved by cops." - nutriment_factor = 1 * FOOD_METABOLISM - color = "#302000" // rgb: 48, 32, 0 - - syndicream - name = "Cream filling" - id = "syndicream" - description = "Delicious cream filling of a mysterious origin. Tastes criminally good." - nutriment_factor = 1 * FOOD_METABOLISM - color = "#AB7878" // rgb: 171, 120, 120 - - cornoil - name = "Corn Oil" - id = "cornoil" - description = "An oil derived from various types of corn." - reagent_state = LIQUID - nutriment_factor = 20 * FOOD_METABOLISM - color = "#302000" // rgb: 48, 32, 0 - - reaction_turf(var/turf/simulated/T, var/volume) - if (!istype(T)) return - src = null - if(volume >= 3) - if(T.wet >= 1) return - T.wet = 1 - if(T.wet_overlay) - T.overlays -= T.wet_overlay - T.wet_overlay = null - T.wet_overlay = image('icons/effects/water.dmi',T,"wet_floor") - T.overlays += T.wet_overlay - - spawn(800) - if (!istype(T)) return - if(T.wet >= 2) return - T.wet = 0 - if(T.wet_overlay) - T.overlays -= T.wet_overlay - T.wet_overlay = null - var/hotspot = (locate(/obj/fire) in T) - if(hotspot) - var/datum/gas_mixture/lowertemp = T.remove_air( T:air:total_moles() ) - lowertemp.temperature = max( min(lowertemp.temperature-2000,lowertemp.temperature / 2) ,0) - lowertemp.react() - T.assume_air(lowertemp) - del(hotspot) - - dry_ramen - name = "Dry Ramen" - id = "dry_ramen" - description = "Space age food, since August 25, 1958. Contains dried noodles, vegetables, and chemicals that boil in contact with water." - nutriment_factor = 1 * FOOD_METABOLISM - color = "#302000" // rgb: 48, 32, 0 - - hot_ramen - name = "Hot Ramen" - id = "hot_ramen" - description = "The noodles are boiled, the flavors are artificial, just like being back in school." - reagent_state = LIQUID - nutriment_factor = 5 * FOOD_METABOLISM - color = "#302000" // rgb: 48, 32, 0 - - on_mob_life(var/mob/living/M as mob) - if (M.bodytemperature < 310)//310 is the normal bodytemp. 310.055 - M.bodytemperature = min(310, M.bodytemperature + (10 * TEMPERATURE_DAMAGE_COEFFICIENT)) - ..() - return - - hell_ramen - name = "Hell Ramen" - id = "hell_ramen" - description = "The noodles are boiled, the flavors are artificial, just like being back in school." - reagent_state = LIQUID - nutriment_factor = 5 * FOOD_METABOLISM - color = "#302000" // rgb: 48, 32, 0 - - on_mob_life(var/mob/living/M as mob) - M.bodytemperature += 10 * TEMPERATURE_DAMAGE_COEFFICIENT - ..() - return - - flour - name = "flour" - id = "flour" - description = "This is what you rub all over yourself to pretend to be a ghost." - nutriment_factor = 1 * FOOD_METABOLISM - color = "#FFFFFF" // rgb: 0, 0, 0 - - reaction_turf(var/turf/T, var/volume) - src = null - if(!istype(T, /turf/space)) - new /obj/effect/decal/cleanable/flour(T) - - cherryjelly - name = "Cherry Jelly" - id = "cherryjelly" - description = "Totally the best. Only to be spread on foods with excellent lateral symmetry." - reagent_state = LIQUID - nutriment_factor = 1 * FOOD_METABOLISM - color = "#801E28" // rgb: 128, 30, 40 - -//Drugs - amatoxin - name = "Amatoxin" - id = "amatoxin" - description = "A powerful poison derived from certain species of mushroom." - color = "#792300" // rgb: 121, 35, 0 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.adjustToxLoss(1) +/* + // If overeaten - vomit and fall down + // Makes you feel bad but removes reagents and some effect + // from your body + if (M.nutrition > 650) + M.nutrition = rand (250, 400) + M.weakened += rand(2, 10) + M.jitteriness += rand(0, 5) + M.dizziness = max (0, (M.dizziness - rand(0, 15))) + M.druggy = max (0, (M.druggy - rand(0, 15))) + M.adjustToxLoss(rand(-15, -5))) + M.updatehealth() +*/ ..() return - psilocybin - name = "Psilocybin" - id = "psilocybin" - description = "A strong psycotropic derived from certain species of mushroom." - color = "#E700E7" // rgb: 231, 0, 231 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.druggy = max(M.druggy, 30) - if(!data) data = 1 - switch(data) - if(1 to 5) - if (!M.stuttering) M.stuttering = 1 - M.make_dizzy(5) - if(prob(10)) M.emote(pick("twitch","giggle")) - if(5 to 10) - if (!M.stuttering) M.stuttering = 1 - M.make_jittery(10) - M.make_dizzy(10) - M.druggy = max(M.druggy, 35) - if(prob(20)) M.emote(pick("twitch","giggle")) - if (10 to INFINITY) - if (!M.stuttering) M.stuttering = 1 - M.make_jittery(20) - M.make_dizzy(20) - M.druggy = max(M.druggy, 40) - if(prob(30)) M.emote(pick("twitch","giggle")) - holder.remove_reagent(src.id, 0.2) - data++ - ..() - return lipozine name = "Lipozine" // The anti-nutriment. id = "lipozine" description = "A chemical compound that causes a powerful fat-burning reaction." reagent_state = LIQUID - nutriment_factor = 10 * FOOD_METABOLISM + nutriment_factor = 10 * REAGENTS_METABOLISM color = "#BBEDA4" // rgb: 187, 237, 164 on_mob_life(var/mob/living/M as mob) @@ -1966,7 +1818,7 @@ datum id = "soysauce" description = "A salty sauce made from the soy plant." reagent_state = LIQUID - nutriment_factor = 2 * FOOD_METABOLISM + nutriment_factor = 2 * REAGENTS_METABOLISM color = "#792300" // rgb: 121, 35, 0 ketchup @@ -1974,7 +1826,7 @@ datum id = "ketchup" description = "Ketchup, catsup, whatever. It's tomato paste." reagent_state = LIQUID - nutriment_factor = 5 * FOOD_METABOLISM + nutriment_factor = 5 * REAGENTS_METABOLISM color = "#731008" // rgb: 115, 16, 8 @@ -1992,7 +1844,7 @@ datum if(1 to 15) M.bodytemperature += 5 * TEMPERATURE_DAMAGE_COEFFICIENT if(holder.has_reagent("frostoil")) - holder.remove_reagent("frostoil", 10*REAGENTS_METABOLISM) + holder.remove_reagent("frostoil", 5) if(istype(M, /mob/living/carbon/slime)) M.bodytemperature += rand(5,20) if(15 to 25) @@ -2078,7 +1930,7 @@ datum if(1 to 15) M.bodytemperature -= 5 * TEMPERATURE_DAMAGE_COEFFICIENT if(holder.has_reagent("capsaicin")) - holder.remove_reagent("capsaicin", 10*REAGENTS_METABOLISM) + holder.remove_reagent("capsaicin", 5) if(istype(M, /mob/living/carbon/slime)) M.bodytemperature -= rand(5,20) if(15 to 25) @@ -2117,12 +1969,11 @@ datum id = "coco" description = "A fatty, bitter paste made from coco beans." reagent_state = SOLID - nutriment_factor = 5 * FOOD_METABOLISM + nutriment_factor = 5 * REAGENTS_METABOLISM color = "#302000" // rgb: 48, 32, 0 on_mob_life(var/mob/living/M as mob) M.nutrition += nutriment_factor - holder.remove_reagent(src.id, FOOD_METABOLISM) ..() return @@ -2131,14 +1982,13 @@ datum id = "hot_coco" description = "Made with love! And coco beans." reagent_state = LIQUID - nutriment_factor = 2 * FOOD_METABOLISM + nutriment_factor = 2 * REAGENTS_METABOLISM color = "#403010" // rgb: 64, 48, 16 on_mob_life(var/mob/living/M as mob) if (M.bodytemperature < 310)//310 is the normal bodytemp. 310.055 M.bodytemperature = min(310, M.bodytemperature + (5 * TEMPERATURE_DAMAGE_COEFFICIENT)) M.nutrition += nutriment_factor - holder.remove_reagent(src.id, FOOD_METABOLISM) ..() return @@ -2190,17 +2040,15 @@ datum name = "Sprinkles" id = "sprinkles" description = "Multi-colored little bits of sugar, commonly found on donuts. Loved by cops." - nutriment_factor = 1 * FOOD_METABOLISM + nutriment_factor = 1 * REAGENTS_METABOLISM color = "#302000" // rgb: 48, 32, 0 on_mob_life(var/mob/living/M as mob) M.nutrition += nutriment_factor - holder.remove_reagent(src.id, FOOD_METABOLISM) if(istype(M, /mob/living/carbon/human) && M.job in list("Security Officer", "Head of Security", "Detective", "Warden")) if(!M) M = holder.my_atom M.heal_organ_damage(1,1) M.nutrition += nutriment_factor - holder.remove_reagent(src.id, FOOD_METABOLISM) ..() return ..() @@ -2209,18 +2057,16 @@ datum name = "Cream filling" id = "syndicream" description = "Delicious cream filling of a mysterious origin. Tastes criminally good." - nutriment_factor = 1 * FOOD_METABOLISM + nutriment_factor = 1 * REAGENTS_METABOLISM color = "#AB7878" // rgb: 171, 120, 120 on_mob_life(var/mob/living/M as mob) M.nutrition += nutriment_factor - holder.remove_reagent(src.id, FOOD_METABOLISM) if(istype(M, /mob/living/carbon/human) && M.mind) if(M.mind.special_role) if(!M) M = holder.my_atom M.heal_organ_damage(1,1) M.nutrition += nutriment_factor - holder.remove_reagent(src.id, FOOD_METABOLISM) ..() return ..() @@ -2230,12 +2076,11 @@ datum id = "cornoil" description = "An oil derived from various types of corn." reagent_state = LIQUID - nutriment_factor = 20 * FOOD_METABOLISM + nutriment_factor = 20 * REAGENTS_METABOLISM color = "#302000" // rgb: 48, 32, 0 on_mob_life(var/mob/living/M as mob) M.nutrition += nutriment_factor - holder.remove_reagent(src.id, FOOD_METABOLISM) ..() return reaction_turf(var/turf/simulated/T, var/volume) @@ -2277,12 +2122,11 @@ datum id = "dry_ramen" description = "Space age food, since August 25, 1958. Contains dried noodles, vegetables, and chemicals that boil in contact with water." reagent_state = SOLID - nutriment_factor = 1 * FOOD_METABOLISM + nutriment_factor = 1 * REAGENTS_METABOLISM color = "#302000" // rgb: 48, 32, 0 on_mob_life(var/mob/living/M as mob) M.nutrition += nutriment_factor - holder.remove_reagent(src.id, FOOD_METABOLISM) ..() return @@ -2291,12 +2135,11 @@ datum id = "hot_ramen" description = "The noodles are boiled, the flavors are artificial, just like being back in school." reagent_state = LIQUID - nutriment_factor = 5 * FOOD_METABOLISM + nutriment_factor = 5 * REAGENTS_METABOLISM color = "#302000" // rgb: 48, 32, 0 on_mob_life(var/mob/living/M as mob) M.nutrition += nutriment_factor - holder.remove_reagent(src.id, FOOD_METABOLISM) if (M.bodytemperature < 310)//310 is the normal bodytemp. 310.055 M.bodytemperature = min(310, M.bodytemperature + (10 * TEMPERATURE_DAMAGE_COEFFICIENT)) ..() @@ -2307,12 +2150,11 @@ datum id = "hell_ramen" description = "The noodles are boiled, the flavors are artificial, just like being back in school." reagent_state = LIQUID - nutriment_factor = 5 * FOOD_METABOLISM + nutriment_factor = 5 * REAGENTS_METABOLISM color = "#302000" // rgb: 48, 32, 0 on_mob_life(var/mob/living/M as mob) M.nutrition += nutriment_factor - holder.remove_reagent(src.id, FOOD_METABOLISM) M.bodytemperature += 10 * TEMPERATURE_DAMAGE_COEFFICIENT ..() return @@ -2322,12 +2164,11 @@ datum id = "flour" description = "This is what you rub all over yourself to pretend to be a ghost." reagent_state = SOLID - nutriment_factor = 1 * FOOD_METABOLISM + nutriment_factor = 1 * REAGENTS_METABOLISM color = "#FFFFFF" // rgb: 0, 0, 0 on_mob_life(var/mob/living/M as mob) M.nutrition += nutriment_factor - holder.remove_reagent(src.id, FOOD_METABOLISM) ..() return @@ -2341,12 +2182,11 @@ datum id = "cherryjelly" description = "Totally the best. Only to be spread on foods with excellent lateral symmetry." reagent_state = LIQUID - nutriment_factor = 1 * FOOD_METABOLISM + nutriment_factor = 1 * REAGENTS_METABOLISM color = "#801E28" // rgb: 128, 30, 40 on_mob_life(var/mob/living/M as mob) M.nutrition += nutriment_factor - holder.remove_reagent(src.id, FOOD_METABOLISM) ..() return @@ -2359,7 +2199,7 @@ datum id = "orangejuice" description = "Both delicious AND rich in Vitamin C, what more do you need?" reagent_state = LIQUID - nutriment_factor = 1 * FOOD_METABOLISM + nutriment_factor = 1 * REAGENTS_METABOLISM color = "#E78108" // rgb: 231, 129, 8 on_mob_life(var/mob/living/M as mob) @@ -2380,14 +2220,9 @@ datum on_mob_life(var/mob/living/M as mob) M.nutrition += nutriment_factor - holder.remove_reagent(src.id, FOOD_METABOLISM) - if (adj_dizzy) M.dizziness = max(0,M.dizziness + adj_dizzy) - if (adj_drowsy) M.drowsyness = max(0,M.drowsyness + adj_drowsy) - if (adj_sleepy) M.sleeping = max(0,M.sleeping + adj_sleepy) - if (adj_temp) - if (M.bodytemperature < 310)//310 is the normal bodytemp. 310.055 - M.bodytemperature = min(310, M.bodytemperature + (25 * TEMPERATURE_DAMAGE_COEFFICIENT)) // Drinks should be used up faster than other reagents. - holder.remove_reagent(src.id, FOOD_METABOLISM) + if(!M) M = holder.my_atom + if(M.getFireLoss() && prob(20)) M.heal_organ_damage(0,1) + M.nutrition++ ..() return @@ -2574,12 +2409,11 @@ datum nutriment_factor = 1 * REAGENTS_METABOLISM color = "#DFD7AF" // rgb: 223, 215, 175 - potato_juice - name = "Potato Juice" - id = "potato" - description = "Juice of the potato. Bleh." - nutriment_factor = 2 * FOOD_METABOLISM - color = "#302000" // rgb: 48, 32, 0 + on_mob_life(var/mob/living/M as mob) + M.nutrition += nutriment_factor + if(M.getBruteLoss() && prob(20)) M.heal_organ_damage(1,0) + ..() + return coffee name = "Coffee" @@ -2588,12 +2422,19 @@ datum reagent_state = LIQUID color = "#482000" // rgb: 72, 32, 0 - on_mob_life(var/mob/living/M as mob) - if(M.getBruteLoss() && prob(20)) M.heal_organ_damage(1,0) - if(holder.has_reagent("capsaicin")) - holder.remove_reagent("capsaicin", 10*REAGENTS_METABOLISM) - ..() - return + on_mob_life(var/mob/living/M as mob) + ..() + M.dizziness = max(0,M.dizziness-5) + M.drowsyness = max(0,M.drowsyness-3) + M.sleeping = max(0,M.sleeping - 2) + if (M.bodytemperature < 310)//310 is the normal bodytemp. 310.055 + M.bodytemperature = min(310, M.bodytemperature + (25 * TEMPERATURE_DAMAGE_COEFFICIENT)) + M.make_jittery(5) + if(holder.has_reagent("frostoil")) + holder.remove_reagent("frostoil", 5) + ..() + return + tea name = "Tea" id = "tea" @@ -2614,13 +2455,12 @@ datum ..() return - hot_coco - name = "Hot Chocolate" - id = "hot_coco" - description = "Made with love! And coco beans." - nutriment_factor = 2 * FOOD_METABOLISM - color = "#403010" // rgb: 64, 48, 16 - adj_temp = 5 + icecoffee + name = "Iced Coffee" + id = "icecoffee" + description = "Coffee and ice, refreshing and cool." + reagent_state = LIQUID + color = "#102838" // rgb: 16, 40, 56 on_mob_life(var/mob/living/M as mob) ..() @@ -2633,14 +2473,13 @@ datum ..() return - on_mob_life(var/mob/living/M as mob) - ..() - M.make_jittery(5) - if(adj_temp > 0 && holder.has_reagent("frostoil")) - holder.remove_reagent("frostoil", 10*REAGENTS_METABOLISM) - - holder.remove_reagent(src.id, 0.1) - return + icetea + name = "Iced Tea" + id = "icetea" + description = "No relation to a certain rap artist/ actor." + reagent_state = LIQUID + color = "#104038" // rgb: 16, 64, 56 + on_mob_life(var/mob/living/M as mob) ..() M.dizziness = max(0,M.dizziness-2) @@ -3184,10 +3023,17 @@ datum color = "#664300" // rgb: 102, 67, 0 on_mob_life(var/mob/living/M as mob) - M:nutrition += nutriment_factor - holder.remove_reagent(src.id, FOOD_METABOLISM) - if(!src.data) data = 1 - src.data++ + if(!data) data = 1 + data++ + M.dizziness +=3 + if(data >= 45 && data <125) + if (!M.stuttering) M.stuttering = 1 + M.stuttering += 3 + else if(data >= 125 && prob(33)) + M.confused = max(M.confused+2,0) + ..() + return + patron name = "Patron" id = "patron" @@ -3245,16 +3091,13 @@ datum ..() return - beer //It's really much more stronger than other drinks. - name = "Beer" - id = "beer" - description = "An alcoholic beverage made from malted grains, hops, yeast, and water." - nutriment_factor = 2 * FOOD_METABOLISM - color = "#664300" // rgb: 102, 67, 0 - on_mob_life(var/mob/living/M as mob) - ..() - M:jitteriness = max(M:jitteriness-3,0) - return + whiskey_cola + name = "Whiskey Cola" + id = "whiskeycola" + description = "Whiskey, mixed with cola. Surprisingly refreshing." + reagent_state = LIQUID + color = "#3E1B00" // rgb: 62, 27, 0 + on_mob_life(var/mob/living/M as mob) if(!data) data = 1 data++ @@ -3409,16 +3252,18 @@ datum reagent_state = LIQUID color = "#664300" // rgb: 102, 67, 0 - ..() - M:nutrition += nutriment_factor - holder.remove_reagent(src.id, FOOD_METABOLISM) - M:drowsyness = max(0,M:drowsyness-7) - //if(!M:sleeping_willingly) - // M:sleeping = max(0,M.sleeping-2) - if (M.bodytemperature > 310) - M.bodytemperature = max(310, M.bodytemperature-5) - M.make_jittery(1) - return + on_mob_life(var/mob/living/M as mob) + if(!data) data = 1 + data++ + M.dizziness +=3 + if(data >= 45 && data <145) + if (!M.stuttering) M.stuttering = 1 + M.stuttering += 3 + else if(data >= 145 && prob(33)) + M.confused = max(M.confused+2,0) + ..() + return + tequilla_sunrise name = "Tequila Sunrise" id = "tequillasunrise" @@ -3618,25 +3463,25 @@ datum reagent_state = LIQUID color = "#664300" // rgb: 102, 67, 0 - doctor_delight - name = "The Doctor's Delight" - id = "doctorsdelight" - description = "A gulp a day keeps the MediBot away. That's probably for the best." - reagent_state = LIQUID - nutriment_factor = 1 * FOOD_METABOLISM - color = "#664300" // rgb: 102, 67, 0 - on_mob_life(var/mob/living/M as mob) - M:nutrition += nutriment_factor - holder.remove_reagent(src.id, FOOD_METABOLISM) - if(!M) M = holder.my_atom - if(M:getOxyLoss() && prob(50)) M:adjustOxyLoss(-2) - if(M:getBruteLoss() && prob(60)) M:heal_organ_damage(2,0) - if(M:getFireLoss() && prob(50)) M:heal_organ_damage(0,2) - if(M:getToxLoss() && prob(50)) M:adjustToxLoss(-2) - if(M.dizziness !=0) M.dizziness = max(0,M.dizziness-15) - if(M.confused !=0) M.confused = max(0,M.confused - 5) - ..() - return + on_mob_life(var/mob/living/M as mob) + if(!data) data = 1 + data++ + M.dizziness +=4 + if(data >= 55 && data <150) + if (!M.stuttering) M.stuttering = 1 + M.stuttering += 3 + else if(data >= 150 && prob(33)) + M.confused = max(M.confused+2,0) + ..() + return + + black_russian + name = "Black Russian" + id = "blackrussian" + description = "For the lactose-intolerant. Still as classy as a White Russian." + reagent_state = LIQUID + color = "#360000" // rgb: 54, 0, 0 + on_mob_life(var/mob/living/M as mob) if(!data) data = 1 data++ @@ -3970,18 +3815,25 @@ datum ..() return - bananahonk - name = "Banana Mama" - id = "bananahonk" - description = "A drink from Clown Heaven." - nutriment_factor = 1 * FOOD_METABOLISM - color = "#664300" // rgb: 102, 67, 0 - silencer - name = "Silencer" - id = "silencer" - description = "A drink from Mime Heaven." - nutriment_factor = 1 * FOOD_METABOLISM - color = "#664300" // rgb: 102, 67, 0 + grog + name = "Grog" + id = "grog" + description = "Watered down rum, Nanotrasen approves!" + reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + + on_mob_life(var/mob/living/M as mob) + if(!data) data = 1 + data++ + M.dizziness +=2 + if(data >= 90 && data <250) + if (!M.stuttering) M.stuttering = 1 + M.stuttering += 2 + else if(data >= 250 && prob(33)) + M.confused = max(M.confused+2,0) + ..() + return + aloe name = "Aloe" id = "aloe" From 7673cb27fd2ded14cb970311f9e04c89d4d327b0 Mon Sep 17 00:00:00 2001 From: Cael_Aislinn Date: Mon, 21 Jan 2013 05:40:49 +1000 Subject: [PATCH 12/19] removed extraneous file defines in dme Signed-off-by: Cael_Aislinn --- baystation12.dme | 44 -------------------------------------------- 1 file changed, 44 deletions(-) diff --git a/baystation12.dme b/baystation12.dme index b3a5a9788e..e98adba9ef 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -5,50 +5,6 @@ // END_INTERNALS // BEGIN_FILE_DIR #define FILE_DIR . -#define FILE_DIR "code" -#define FILE_DIR "code/TriDimension" -#define FILE_DIR "code/WorkInProgress" -#define FILE_DIR "code/WorkInProgress/Cael_Aislinn" -#define FILE_DIR "code/WorkInProgress/Cael_Aislinn/Jungle" -#define FILE_DIR "code/WorkInProgress/Cael_Aislinn/Rust" -#define FILE_DIR "code/WorkInProgress/Cael_Aislinn/Supermatter" -#define FILE_DIR "code/WorkInProgress/Susan" -#define FILE_DIR "html" -#define FILE_DIR "icons" -#define FILE_DIR "icons/48x48" -#define FILE_DIR "icons/effects" -#define FILE_DIR "icons/mecha" -#define FILE_DIR "icons/misc" -#define FILE_DIR "icons/mob" -#define FILE_DIR "icons/mob/human_races" -#define FILE_DIR "icons/obj" -#define FILE_DIR "icons/obj/assemblies" -#define FILE_DIR "icons/obj/atmospherics" -#define FILE_DIR "icons/obj/clothing" -#define FILE_DIR "icons/obj/doors" -#define FILE_DIR "icons/obj/flora" -#define FILE_DIR "icons/obj/machines" -#define FILE_DIR "icons/obj/pipes" -#define FILE_DIR "icons/pda_icons" -#define FILE_DIR "icons/spideros_icons" -#define FILE_DIR "icons/Testing" -#define FILE_DIR "icons/turf" -#define FILE_DIR "icons/vending_icons" -#define FILE_DIR "sound" -#define FILE_DIR "sound/AI" -#define FILE_DIR "sound/ambience" -#define FILE_DIR "sound/effects" -#define FILE_DIR "sound/effects/wind" -#define FILE_DIR "sound/hallucinations" -#define FILE_DIR "sound/items" -#define FILE_DIR "sound/machines" -#define FILE_DIR "sound/mecha" -#define FILE_DIR "sound/misc" -#define FILE_DIR "sound/music" -#define FILE_DIR "sound/piano" -#define FILE_DIR "sound/violin" -#define FILE_DIR "sound/voice" -#define FILE_DIR "sound/weapons" // END_FILE_DIR // BEGIN_PREFERENCES From 05479bdb96d26ff56726126f0f0e74e7d1b6b87e Mon Sep 17 00:00:00 2001 From: Cael_Aislinn Date: Mon, 21 Jan 2013 12:07:49 +1000 Subject: [PATCH 13/19] removed many alt_titles Signed-off-by: Cael_Aislinn --- code/game/jobs/job/captain.dm | 2 -- code/game/jobs/job/civilian.dm | 15 +++++++-------- code/game/jobs/job/civilian_chaplain.dm | 2 +- code/game/jobs/job/engineering.dm | 3 --- code/game/jobs/job/medical.dm | 1 - code/game/jobs/job/science.dm | 2 +- code/game/jobs/job/security.dm | 5 +---- 7 files changed, 10 insertions(+), 20 deletions(-) diff --git a/code/game/jobs/job/captain.dm b/code/game/jobs/job/captain.dm index 761b787e24..e110f87ec5 100644 --- a/code/game/jobs/job/captain.dm +++ b/code/game/jobs/job/captain.dm @@ -11,7 +11,6 @@ req_admin_notify = 1 access = list() //See get_access() minimal_access = list() //See get_access() - alt_titles = list("Administrator") equip(var/mob/living/carbon/human/H) @@ -56,7 +55,6 @@ selection_color = "#ddddff" idtype = /obj/item/weapon/card/id/silver req_admin_notify = 1 - alt_titles = list("Human resources director","Executive Officer") access = list(access_security, access_sec_doors, access_brig, access_court, access_forensics_lockers, access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads, access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue, diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm index 8d003944a3..655f93499a 100644 --- a/code/game/jobs/job/civilian.dm +++ b/code/game/jobs/job/civilian.dm @@ -10,7 +10,7 @@ selection_color = "#dddddd" access = list(access_bar) minimal_access = list(access_bar) - alt_titles = list("Waiter","Waitress") + equip(var/mob/living/carbon/human/H) if(!H) return 0 @@ -52,7 +52,7 @@ selection_color = "#dddddd" access = list(access_kitchen, access_morgue) minimal_access = list(access_kitchen, access_morgue) - alt_titles = list("Gourmet chef","Cook") + alt_titles = list("Cook") equip(var/mob/living/carbon/human/H) @@ -83,6 +83,7 @@ minimal_access = list(access_hydroponics, access_morgue) // Removed tox and chem access because STOP PISSING OFF THE CHEMIST GUYS // //Removed medical access because WHAT THE FUCK YOU AREN'T A DOCTOR YOU GROW WHEAT //Given Morgue access because they have a viable means of cloning. alt_titles = list("Hydroponicist") + equip(var/mob/living/carbon/human/H) if(!H) return 0 H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/hydroponics(H), slot_w_uniform) @@ -111,7 +112,6 @@ selection_color = "#dddddd" access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mint, access_mining, access_mining_station) minimal_access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mint, access_mining, access_mining_station) - alt_titles = list("Supplies Officer","Logistics Officer") equip(var/mob/living/carbon/human/H) @@ -142,7 +142,6 @@ selection_color = "#dddddd" access = list(access_maint_tunnels, access_cargo, access_cargo_bot, access_mailsorting) minimal_access = list(access_maint_tunnels, access_cargo, access_cargo_bot, access_mailsorting) - alt_titles = list("Supplies worker","Courier","Logistics worker") equip(var/mob/living/carbon/human/H) @@ -171,7 +170,7 @@ selection_color = "#dddddd" access = list(access_mining, access_mint, access_mining_station, access_mailsorting) minimal_access = list(access_mining, access_mint, access_mining_station, access_mailsorting) - alt_titles = list("Deep space miner","NTCA Affiliate","Prospector") + alt_titles = list("Deep space miner") equip(var/mob/living/carbon/human/H) @@ -283,7 +282,7 @@ selection_color = "#dddddd" access = list(access_janitor, access_maint_tunnels) minimal_access = list(access_janitor, access_maint_tunnels) - alt_titles = list("Custodial officer","Hygiene supervisor","OHS assistant","Health and Safety worker") + alt_titles = list("Custodial officer") equip(var/mob/living/carbon/human/H) @@ -312,7 +311,7 @@ selection_color = "#dddddd" access = list(access_library) minimal_access = list(access_library) - alt_titles = list("Journalist","Clerk","Record keeper") + alt_titles = list("Journalist") equip(var/mob/living/carbon/human/H) @@ -341,7 +340,7 @@ var/global/lawyer = 0//Checks for another lawyer selection_color = "#dddddd" access = list(access_lawyer, access_court, access_sec_doors) minimal_access = list(access_lawyer, access_court, access_sec_doors) - alt_titles = list("Attourney","Barrister","Solicitor","Queen's Counsel","Paralegal") + alt_titles = list("Attourney", "IA Consultant") equip(var/mob/living/carbon/human/H) diff --git a/code/game/jobs/job/civilian_chaplain.dm b/code/game/jobs/job/civilian_chaplain.dm index f896fa919d..39e806c1ad 100644 --- a/code/game/jobs/job/civilian_chaplain.dm +++ b/code/game/jobs/job/civilian_chaplain.dm @@ -10,7 +10,7 @@ selection_color = "#dddddd" access = list(access_morgue, access_chapel_office, access_crematorium) minimal_access = list(access_morgue, access_chapel_office, access_crematorium) - alt_titles = list("Counselor","Psychiatrist","Crew services adviser","Morale Officer") + alt_titles = list("Counselor") equip(var/mob/living/carbon/human/H) diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm index b3f6a1b8a8..23651d9383 100644 --- a/code/game/jobs/job/engineering.dm +++ b/code/game/jobs/job/engineering.dm @@ -9,7 +9,6 @@ selection_color = "#ffeeaa" idtype = /obj/item/weapon/card/id/silver req_admin_notify = 1 - alt_titles = list("Engineering supervisor") access = list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_teleporter, access_external_airlocks, access_atmospherics, access_emergency_storage, access_eva, access_heads, access_construction, access_sec_doors, @@ -55,7 +54,6 @@ alt_titles = list("Technician","Maintenance technician","Engine technician","EVA technician","Electrician","Construction specialist") - equip(var/mob/living/carbon/human/H) if(!H) return 0 H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_eng(H), slot_ears) @@ -88,7 +86,6 @@ selection_color = "#fff5cc" access = list(access_atmospherics, access_maint_tunnels, access_emergency_storage, access_construction) minimal_access = list(access_atmospherics, access_maint_tunnels, access_emergency_storage, access_construction) - alt_titles = list("Pipeworker","Gas supervisor","Firefighter") equip(var/mob/living/carbon/human/H) diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm index 9068192adc..7d866c4dae 100644 --- a/code/game/jobs/job/medical.dm +++ b/code/game/jobs/job/medical.dm @@ -131,7 +131,6 @@ selection_color = "#ffeef0" access = list(access_medical, access_morgue, access_genetics, access_research) minimal_access = list(access_medical, access_morgue, access_genetics, access_research) - alt_titles = list("Sequencer") equip(var/mob/living/carbon/human/H) diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm index a2cc28a8e2..06a7b821c1 100644 --- a/code/game/jobs/job/science.dm +++ b/code/game/jobs/job/science.dm @@ -47,7 +47,7 @@ access = list(access_tox, access_tox_storage, access_research, access_xenobiology) minimal_access = list(access_tox, access_tox_storage, access_research, access_xenobiology) - alt_titles = list("Xenoarcheologist", "Anomalist", "Plasma Researcher", "Xenobiologist","High Energy Materials Researcher") + alt_titles = list("Xenoarcheologist", "Anomalist", "Plasma Researcher", "Xenobiologist") equip(var/mob/living/carbon/human/H) if(!H) return 0 diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm index 3e6d19a8b1..0a3e4d695a 100644 --- a/code/game/jobs/job/security.dm +++ b/code/game/jobs/job/security.dm @@ -9,7 +9,6 @@ selection_color = "#ffdddd" idtype = /obj/item/weapon/card/id/silver req_admin_notify = 1 - alt_titles = list("Commander","Commissioner") access = list(access_security, access_sec_doors, access_brig, access_armory, access_court, access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers, access_research, access_engine, access_mining, access_medical, access_construction, access_mailsorting, @@ -56,7 +55,6 @@ spawn_positions = 1 supervisors = "the head of security" selection_color = "#ffeeee" - alt_titles = list("Arsenal clerk","Brig supervisor","Superintendant") access = list(access_security, access_sec_doors, access_brig, access_armory, access_court) minimal_access = list(access_security, access_sec_doors, access_brig, access_armory, access_court) @@ -97,7 +95,7 @@ access = list(access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court) minimal_access = list(access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court) - alt_titles = list("Forensic Technician","Investigator") + alt_titles = list("Forensic Technician") equip(var/mob/living/carbon/human/H) if(!H) return 0 @@ -144,7 +142,6 @@ selection_color = "#ffeeee" access = list(access_security, access_sec_doors, access_brig, access_court) minimal_access = list(access_security, access_sec_doors, access_brig, access_court) - alt_titles = list("OHS marshal","Enforcer") equip(var/mob/living/carbon/human/H) From 632cad1044cfe4583ac48bd56bcaaed2e9bcd446 Mon Sep 17 00:00:00 2001 From: Cael_Aislinn Date: Mon, 21 Jan 2013 18:47:03 +1000 Subject: [PATCH 14/19] observers can become mice, strange ore can be picked up in ore boxes/satchels, crates and closets can be built out of plasteel, changelog update Signed-off-by: Cael_Aislinn --- .../items/stacks/sheets/sheet_types.dm | 2 ++ code/modules/mining/satchel_ore_boxdm.dm | 5 ++++ code/modules/mob/dead/observer/observer.dm | 28 +++++++++++++++++++ .../modules/research/xenoarchaeology/finds.dm | 2 ++ html/changelog.html | 9 ++++++ 5 files changed, 46 insertions(+) diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index ba755b336f..e1290a215c 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -72,6 +72,8 @@ var/global/list/datum/stack_recipe/metal_recipes = list ( \ */ var/global/list/datum/stack_recipe/plasteel_recipes = list ( \ new/datum/stack_recipe("AI core", /obj/structure/AIcore, 4, time = 50, one_per_turf = 1), \ + new/datum/stack_recipe("Metal closet", /obj/structure/closet, 5, time = 50, one_per_turf = 1), \ + new/datum/stack_recipe("Metal crate", /obj/structure/closet/crate, 10, time = 50, one_per_turf = 1), \ ) /obj/item/stack/sheet/plasteel diff --git a/code/modules/mining/satchel_ore_boxdm.dm b/code/modules/mining/satchel_ore_boxdm.dm index 3a02b9fca5..4a0c9a6103 100644 --- a/code/modules/mining/satchel_ore_boxdm.dm +++ b/code/modules/mining/satchel_ore_boxdm.dm @@ -28,6 +28,7 @@ var/amt_plasma = 0 var/amt_uranium = 0 var/amt_clown = 0 + var/amt_strange = 0 for (var/obj/item/weapon/ore/C in contents) @@ -47,6 +48,8 @@ amt_uranium++; if (istype(C,/obj/item/weapon/ore/clown)) amt_clown++; + if (istype(C,/obj/item/weapon/ore/strangerock)) + amt_strange++; var/dat = text("The contents of the ore box reveal...
") if (amt_gold) @@ -65,6 +68,8 @@ dat += text("Uranium ore: [amt_uranium]
") if (amt_clown) dat += text("Bananium ore: [amt_clown]
") + if (amt_strange) + dat += text("Strange rocks: [amt_strange]
") dat += text("

Empty box") user << browse("[dat]", "window=orebox") diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 43eb1b3ba5..58f226d21f 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -258,3 +258,31 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp see_invisible = SEE_INVISIBLE_OBSERVER else see_invisible = SEE_INVISIBLE_OBSERVER_NOLIGHTING + +/mob/dead/observer/verb/become_mouse() + set name = "Become mouse" + set category = "Ghost" + + //find a viable mouse candidate + var/mob/living/simple_animal/mouse/host + var/list/mouse_candidates = list() + for(var/mob/living/simple_animal/mouse/M in world) + if(!M.ckey && !M.stat) + mouse_candidates.Add(M) + if(mouse_candidates.len) + host = pick(mouse_candidates) + else + var/obj/machinery/atmospherics/unary/vent_pump/vent_found + var/list/found_vents = list() + for(var/obj/machinery/atmospherics/unary/vent_pump/v in world) + if(!v.welded && v.z == src.z) + found_vents.Add(v) + if(found_vents.len) + vent_found = pick(found_vents) + host = new /mob/living/simple_animal/mouse(vent_found.loc) + else + src << "Unable to find any live mice, or unwelded vents to spawn one at." + + if(host) + host.ckey = src.ckey + host << "You are now a mouse. Try to avoid interaction with players, and do not give hints away that you are more than a simple rodent." diff --git a/code/modules/research/xenoarchaeology/finds.dm b/code/modules/research/xenoarchaeology/finds.dm index a834b96f69..b3060a2515 100644 --- a/code/modules/research/xenoarchaeology/finds.dm +++ b/code/modules/research/xenoarchaeology/finds.dm @@ -79,6 +79,8 @@ R.source_rock = src.source_rock R.geological_data = src.geological_data user << "\blue You take a core sample of the [src]." + else + ..() /*Code does not work, likely due to removal/change of acid_act proc //Strange rocks currently melt to gooey grey w/ acid application (see reactions) diff --git a/html/changelog.html b/html/changelog.html index f750f811a3..c6e26d8e23 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -59,6 +59,15 @@ should be listed in the changelog upon commit though. Thanks. --> +
+

January 21st

+

Cael_Aislinn updated:

+
    +
  • Satchels and ore boxes can now hold strange rocks.
  • +
  • Closets and crates can now be built out of 5 and 10 plasteel respectively.
  • +
  • Observers can become mice once more.
  • +
+

13/01/2013

From 351e6d490c0423647be6edd44b120e1bb9a63ada Mon Sep 17 00:00:00 2001 From: Cael_Aislinn Date: Mon, 21 Jan 2013 18:47:36 +1000 Subject: [PATCH 15/19] empty guns play a "click" sound Signed-off-by: Cael_Aislinn --- code/game/objects/items/toys.dm | 1 + code/modules/projectiles/gun.dm | 1 + code/modules/projectiles/guns/projectile/revolver.dm | 2 ++ 3 files changed, 4 insertions(+) diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 3bc4f7ab2f..77e2f630e7 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -167,6 +167,7 @@ src.add_fingerprint(user) if (src.bullets < 1) user.show_message("\red *click* *click*", 2) + playsound(user, 'sound/weapons/empty.ogg', 100, 1) return playsound(user, 'sound/weapons/Gunshot.ogg', 100, 1) src.bullets-- diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 9d9e824f98..d97115d777 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -75,6 +75,7 @@ return if(!load_into_chamber()) user << "\red *click*"; + playsound(user, 'sound/weapons/empty.ogg', 100, 1) return if(!in_chamber) diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm index 9b9ea0f9b6..0f6fca68b2 100644 --- a/code/modules/projectiles/guns/projectile/revolver.dm +++ b/code/modules/projectiles/guns/projectile/revolver.dm @@ -143,6 +143,7 @@ if(!loaded.len) user.visible_message("\red *click*", "\red *click*") + playsound(user, 'sound/weapons/empty.ogg', 100, 1) return if(isliving(target) && isliving(user)) @@ -153,6 +154,7 @@ var/obj/item/ammo_casing/AC = loaded[1] if(!load_into_chamber()) user.visible_message("\red *click*", "\red *click*") + playsound(user, 'sound/weapons/empty.ogg', 100, 1) return if(!in_chamber) return From 66ce65a68020ed04708ca7575d265ccb0dd1ed8b Mon Sep 17 00:00:00 2001 From: Cael_Aislinn Date: Mon, 21 Jan 2013 19:15:38 +1000 Subject: [PATCH 16/19] minor tweaks and cleanup with events, readded meteor shower and grid check events, removed most unused event files (left some interesting ones) Signed-off-by: Cael_Aislinn --- code/game/gamemodes/events.dm | 36 ++++++-- code/game/gamemodes/events/BlowOut.dm | 32 ------- code/game/gamemodes/events/ElectricalStorm.dm | 88 ------------------- .../gamemodes/events/GravitationalAnomaly.dm | 10 --- code/game/gamemodes/events/ImmovableRod.dm | 5 -- code/game/gamemodes/events/MeteorStorm.dm | 11 --- code/game/gamemodes/events/PowerOffline.dm | 16 ---- code/game/gamemodes/events/PrisonBreak.dm | 30 ------- code/game/gamemodes/events/RadiationBelt.dm | 27 ------ code/game/gamemodes/events/SpaceCarp.dm | 14 --- code/game/gamemodes/events/SpaceNinja.dm | 6 -- code/game/gamemodes/traitor/traitor_info.dm | 7 -- 12 files changed, 30 insertions(+), 252 deletions(-) delete mode 100644 code/game/gamemodes/events/BlowOut.dm delete mode 100644 code/game/gamemodes/events/ElectricalStorm.dm delete mode 100644 code/game/gamemodes/events/GravitationalAnomaly.dm delete mode 100644 code/game/gamemodes/events/ImmovableRod.dm delete mode 100644 code/game/gamemodes/events/MeteorStorm.dm delete mode 100644 code/game/gamemodes/events/PowerOffline.dm delete mode 100644 code/game/gamemodes/events/PrisonBreak.dm delete mode 100644 code/game/gamemodes/events/RadiationBelt.dm delete mode 100644 code/game/gamemodes/events/SpaceCarp.dm delete mode 100644 code/game/gamemodes/events/SpaceNinja.dm delete mode 100644 code/game/gamemodes/traitor/traitor_info.dm diff --git a/code/game/gamemodes/events.dm b/code/game/gamemodes/events.dm index f4d89d1f7b..c705df2f79 100644 --- a/code/game/gamemodes/events.dm +++ b/code/game/gamemodes/events.dm @@ -46,13 +46,15 @@ possibleEvents["Meteor"] = 80 * engineer_count possibleEvents["Blob"] = 30 * engineer_count possibleEvents["Spacevine"] = 30 * engineer_count + possibleEvents["Grid Check"] = 10 * engineer_count if(medical_count >= 1) possibleEvents["Radiation"] = medical_count * 100 possibleEvents["Virus"] = medical_count * 50 possibleEvents["Appendicitis"] = medical_count * 50 if(security_count >= 1) possibleEvents["Prison Break"] = security_count * 50 - //possibleEvents["Space Ninja"] = security_count * 10 // very low chance for space ninja event + /*if((world.time/10)>=3600 && toggle_space_ninja && !sent_ninja_to_station) + possibleEvents["Space Ninja"] = security_count * 10*/ var/picked_event = pick(possibleEvents) var/chance = possibleEvents[picked_event] @@ -79,8 +81,7 @@ switch(picked_event) if("Space Ninja") //Handled in space_ninja.dm. Doesn't announce arrival, all sneaky-like. - if((world.time/10)>=3600 && toggle_space_ninja && !sent_ninja_to_station) - space_ninja_arrival() + space_ninja_arrival() if("Radiation") high_radiation_event() if("Virus") @@ -101,6 +102,10 @@ spacevine_infestation() if("Communications") communications_blackout() + if("Grid Check") + grid_check() + if("Meteor") + meteor_shower() return 1 @@ -116,8 +121,9 @@ for(var/obj/machinery/telecomms/T in telecomms_list) T.emp_act(1) -/proc/power_failure() - command_alert("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Critical Power Failure") +/proc/power_failure(var/is_grid_check = 0) + command_alert("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", is_grid_check ? "Automated Grid Check" : "Critical Power Failure") + for(var/mob/M in player_list) M << sound('sound/AI/poweroff.ogg') for(var/obj/machinery/power/smes/S in world) @@ -577,10 +583,28 @@ Would like to add a law like "Law x is _______" where x = a number, and _____ is world << "Ion Storm Main Done" */ +/proc/meteor_shower() + command_alert("The station is now in a meteor shower", "Meteor Alert") + + spawn(0) + var/waves = rand(1,4) + while(waves > 0) + sleep(rand(20,100)) + spawn_meteors(rand(1,3)) + waves-- + + command_alert("The station has cleared the meteor shower", "Meteor Alert") + +/proc/grid_check() + spawn(0) + power_failure(1) + sleep(rand(100,600)) + power_restore() + // Returns how many characters are currently active(not logged out, not AFK for more than 10 minutes) // with a specific role. // Note that this isn't sorted by department, because e.g. having a roboticist shouldn't make meteors spawn. -proc/number_active_with_role(role) +/proc/number_active_with_role(role) var/count = 0 for(var/mob/M in player_list) if(!M.client || M.client.inactivity > 10 * 10 * 60) // longer than 10 minutes AFK counts them as inactive diff --git a/code/game/gamemodes/events/BlowOut.dm b/code/game/gamemodes/events/BlowOut.dm deleted file mode 100644 index 1d660989d9..0000000000 --- a/code/game/gamemodes/events/BlowOut.dm +++ /dev/null @@ -1,32 +0,0 @@ -/area/var/radsafe = 0 -/area/maintenance/radsafe = 1 -/area/ai_monitored/maintenance/radsafe = 1 -/area/centcom/radsafe = 1 -/area/admin/radsafe = 1 -/area/adminsafety/radsafe = 1 -/area/shuttle/radsafe = 1 -/area/syndicate_station/radsafe = 1 -/area/asteroid/radsafe = 1 -/area/crew_quarters/sleeping/radsafe = 1 - -/datum/event/blowout - Lifetime = 150 - Announce() - if(!forced && prob(90)) - ActiveEvent = null - SpawnEvent() - del src - return - command_alert("Warning: station approaching high-density radiation cloud. Seek cover immediately.") - Tick() - if(ActiveFor == 50) - command_alert("Station has entered radiation cloud. Do not leave cover until it has passed.") - if(ActiveFor == 100 || ActiveFor == 150) //1/2 and 2/2 f the way after it start proper make peope be half dead mostly - for(var/mob/living/carbon/M in world) - var/area = get_area(M) - if(area:radsafe) - continue - if(!M.stat) - M.radiate(100) - Die() - command_alert("The station has cleared the radiation cloud. It is now safe to leave cover.") \ No newline at end of file diff --git a/code/game/gamemodes/events/ElectricalStorm.dm b/code/game/gamemodes/events/ElectricalStorm.dm deleted file mode 100644 index 58d42c23d0..0000000000 --- a/code/game/gamemodes/events/ElectricalStorm.dm +++ /dev/null @@ -1,88 +0,0 @@ -//This file was auto-corrected by findeclaration.exe on 29/05/2012 15:03:04 - -/datum/event/electricalstorm - var/list/obj/machinery/light/Lights = list( ) - var/list/obj/machinery/light/APCs = list( ) - var/list/obj/machinery/light/Doors = list( ) - var/list/obj/machinery/light/Comms = list( ) - - Announce() -// command_alert("The station is flying through an electrical storm. Radio communications may be disrupted", "Anomaly Alert") - - for(var/obj/machinery/light/Light in world) - if(Light.z == 1 && Light.status != 0) - Lights += Light - - for(var/obj/machinery/power/apc/APC in world) - if(APC.z == 1 && !APC.crit) - APCs += APC - - for(var/obj/machinery/door/airlock/Door in world) - if(Door.z == 1 && !istype(Door,/obj/machinery/door/airlock/secure)) - Doors += Door - - for(var/obj/machinery/telecomms/processor/T in world) - if(prob(90) && !(T.stat & (BROKEN|NOPOWER))) - T.stat |= BROKEN - Comms |= T - - Tick() - for(var/x = 0; x < 3; x++) - if (prob(30)) - BlowLight() - if (prob(10)) - DisruptAPC() - if (prob(10)) - DisableDoor() - - - Die() - command_alert("The station has cleared the electrical storm. Radio communications restored", "Anomaly Alert") - for(var/obj/machinery/telecomms/processor/T in Comms) - T.stat &= ~BROKEN - Comms = list() - - proc - BlowLight() //Blow out a light fixture - var/obj/machinery/light/Light = null - var/failed_attempts = 0 - while (Light == null || Light.status != 0) - Light = pick(Lights) - failed_attempts++ - if (failed_attempts >= 10) - return - - spawn(0) //Overload the light, spectacularly. - //Light.sd_SetLuminosity(10) - //sleep(2) - Light.on = 1 - Light.broken() - Lights -= Light - - DisruptAPC() - var/failed_attempts = 0 - var/obj/machinery/power/apc/APC - while (!APC || !APC.operating) - APC = pick(APCs) - failed_attempts++ - if (failed_attempts >= 10) - return - - if (prob(40)) - APC.operating = 0 //Blow its breaker - if (prob(8)) - APC.set_broken() - APCs -= APC - - DisableDoor() - var/obj/machinery/door/airlock/Airlock - while (!Airlock || Airlock.z != 1) - Airlock = pick(Doors) - Airlock.pulse(airlockIndexToWireColor[4]) - for (var/x = 0; x < 2; x++) - var/Wire = 0 - while(!Wire || Wire == 4) - Wire = rand(1, 9) - Airlock.pulse(airlockIndexToWireColor[Wire]) - Airlock.update_icon() - Doors -= Airlock diff --git a/code/game/gamemodes/events/GravitationalAnomaly.dm b/code/game/gamemodes/events/GravitationalAnomaly.dm deleted file mode 100644 index 8b7d2186cf..0000000000 --- a/code/game/gamemodes/events/GravitationalAnomaly.dm +++ /dev/null @@ -1,10 +0,0 @@ -/datum/event/gravitationalanomaly - - Announce() - - command_alert("Gravitational anomalies detected on the station. There is no additional data.", "Anomaly Alert") - world << sound('granomalies.ogg') - var/turf/T = pick(blobstart) - var/obj/effect/bhole/bh = new /obj/effect/bhole( T.loc, 30 ) - spawn(rand(50, 300)) - del(bh) diff --git a/code/game/gamemodes/events/ImmovableRod.dm b/code/game/gamemodes/events/ImmovableRod.dm deleted file mode 100644 index 27956c7e35..0000000000 --- a/code/game/gamemodes/events/ImmovableRod.dm +++ /dev/null @@ -1,5 +0,0 @@ -/datum/event/immovablerod - - Announce() - - immovablerod() \ No newline at end of file diff --git a/code/game/gamemodes/events/MeteorStorm.dm b/code/game/gamemodes/events/MeteorStorm.dm deleted file mode 100644 index 10cb7ef676..0000000000 --- a/code/game/gamemodes/events/MeteorStorm.dm +++ /dev/null @@ -1,11 +0,0 @@ -/datum/event/meteorstorm - - Announce() - command_alert("The station is now in a meteor shower", "Meteor Alert") - - Tick() - if (prob(20)) - meteor_wave() - - Die() - command_alert("The station has cleared the meteor shower", "Meteor Alert") \ No newline at end of file diff --git a/code/game/gamemodes/events/PowerOffline.dm b/code/game/gamemodes/events/PowerOffline.dm deleted file mode 100644 index c6e8a8b657..0000000000 --- a/code/game/gamemodes/events/PowerOffline.dm +++ /dev/null @@ -1,16 +0,0 @@ -/datum/event/power_offline - Announce() - for(var/obj/machinery/power/apc/a in world) - if(!a.crit && a.z == 1) - if(istype(a.area, /area/ai_monitored/storage/eva) || istype(a.area, /area/engine)\ - || istype(a.area, /area/toxins/xenobiology) || istype(a.area, /area/turret_protected/ai)) - continue - a.eventoff = 1 - a.update() - - Die() - command_alert("The station has finished an automated power system grid check, thank you.", "Maintenance alert") - for(var/obj/machinery/power/apc/a in world) - if(!a.crit) - a.eventoff = 0 - a.update() \ No newline at end of file diff --git a/code/game/gamemodes/events/PrisonBreak.dm b/code/game/gamemodes/events/PrisonBreak.dm deleted file mode 100644 index e51c5c8e77..0000000000 --- a/code/game/gamemodes/events/PrisonBreak.dm +++ /dev/null @@ -1,30 +0,0 @@ -/datum/event/prisonbreak - - Announce() - - for (var/obj/machinery/power/apc/temp_apc in world) - if(istype(get_area(temp_apc), /area/security/prison)) - temp_apc.overload_lighting() - if(istype(get_area(temp_apc), /area/security/brig)) - temp_apc.overload_lighting() - // for (var/obj/machinery/computer/prison_shuttle/temp_shuttle in world) - // temp_shuttle.prison_break() - for (var/obj/structure/closet/secure_closet/brig/temp_closet in world) - if(istype(get_area(temp_closet), /area/security/prison)) - temp_closet.locked = 0 - temp_closet.icon_state = temp_closet.icon_closed - for (var/obj/machinery/door/airlock/security/temp_airlock in world) - if(istype(get_area(temp_airlock), /area/security/prison)) - temp_airlock.prison_open() - if(istype(get_area(temp_airlock), /area/security/brig)) - temp_airlock.prison_open() - for (var/obj/machinery/door/airlock/glass/glass_security/temp_glassairlock in world) - if(istype(get_area(temp_glassairlock), /area/security/prison)) - temp_glassairlock.prison_open() - if(istype(get_area(temp_glassairlock), /area/security/brig)) - temp_glassairlock.prison_open() - for (var/obj/machinery/door_timer/temp_timer in world) - if(istype(get_area(temp_timer), /area/security/brig)) - temp_timer.releasetime = 1 - sleep(150) - command_alert("Glitch in imprisonment subroutines detected on [station_name()]. Recommend station AI involvement.", "Security Alert") diff --git a/code/game/gamemodes/events/RadiationBelt.dm b/code/game/gamemodes/events/RadiationBelt.dm deleted file mode 100644 index 15a4e6407c..0000000000 --- a/code/game/gamemodes/events/RadiationBelt.dm +++ /dev/null @@ -1,27 +0,0 @@ -/datum/event/radiation - var/current_iteration = 0 - - // 50 - 20 (grace period) seconds lifetime - Lifetime = 50 - Announce() - command_alert("The station is now travelling through a radiation belt. Take shelter in the maintenance tunnels, or in the crew quarters!", "Medical Alert") - - Tick() - current_iteration++ - - // start radiating after 20 seconds grace period - if(current_iteration > 20) - for(var/mob/living/carbon/L in world) - // check whether they're in a safe place - // if they are, do not radiate - var/turf/T = get_turf(L) - if(T && ( istype(T.loc, /area/maintenance) || istype(T.loc, /area/crew_quarters) )) - continue - - if (istype(L, /mob/living/carbon/monkey)) // So as to stop monkeys from dying in their pens - L.apply_effect(rand(3,4), IRRADIATE) - else - L.apply_effect(rand(4,10), IRRADIATE) - - Die() - command_alert("The station has cleared the radiation belt", "Medical Alert") diff --git a/code/game/gamemodes/events/SpaceCarp.dm b/code/game/gamemodes/events/SpaceCarp.dm deleted file mode 100644 index 5decc7636f..0000000000 --- a/code/game/gamemodes/events/SpaceCarp.dm +++ /dev/null @@ -1,14 +0,0 @@ -/datum/event/spacecarp - - Announce() - - for(var/obj/effect/landmark/C in world) - if(C.name == "carpspawn") - if(prob(99)) - new /mob/living/simple_animal/carp(C.loc) - else - new /mob/living/simple_animal/carp/elite(C.loc) - //sleep(100) - spawn(rand(3000, 6000)) //Delayed announcements to keep the crew on their toes. - command_alert("Unknown biological entities have been detected near [station_name()], please stand-by.", "Lifesign Alert") - world << sound('commandreport.ogg') \ No newline at end of file diff --git a/code/game/gamemodes/events/SpaceNinja.dm b/code/game/gamemodes/events/SpaceNinja.dm deleted file mode 100644 index 63d8211707..0000000000 --- a/code/game/gamemodes/events/SpaceNinja.dm +++ /dev/null @@ -1,6 +0,0 @@ -/datum/event/spaceninja - - Announce() - - if((world.time/10)>=3600 && toggle_space_ninja && !sent_ninja_to_station)//If an hour has passed, relatively speaking. Also, if ninjas are allowed to spawn and if there is not already a ninja for the round. - space_ninja_arrival()//Handled in space_ninja.dm. Doesn't announce arrival, all sneaky-like. \ No newline at end of file diff --git a/code/game/gamemodes/traitor/traitor_info.dm b/code/game/gamemodes/traitor/traitor_info.dm deleted file mode 100644 index d3d4b1a47d..0000000000 --- a/code/game/gamemodes/traitor/traitor_info.dm +++ /dev/null @@ -1,7 +0,0 @@ -/datum/traitorinfo - var/starting_objective = "" - var/starting_player_count = 0 - var/starting_occupation = "" - var/starting_name = "" - var/ckey = "" - var/list/spawnlist = list() \ No newline at end of file From bb4be2c86a1c2923c31bf7d7428b0acb5beeb8f9 Mon Sep 17 00:00:00 2001 From: Cael_Aislinn Date: Mon, 21 Jan 2013 19:25:19 +1000 Subject: [PATCH 17/19] moved cryo cells to the same layer as tables - this will look weird for stuff on the top tile ('behind' the cry cell) but beakers wont be hidden underneath it when they're ejected any more, fixed typo in escape shuttle, fixed syntax error in new player setup screen Signed-off-by: Cael_Aislinn --- code/game/machinery/computer/shuttle.dm | 2 +- code/game/machinery/cryo.dm | 2 +- code/modules/mob/new_player/new_player.dm | 5 +++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/code/game/machinery/computer/shuttle.dm b/code/game/machinery/computer/shuttle.dm index 23c1c3b4a2..978db653f9 100644 --- a/code/game/machinery/computer/shuttle.dm +++ b/code/game/machinery/computer/shuttle.dm @@ -52,7 +52,7 @@ world << text("\blue Alert: [] authorizations needed until shuttle is launched early", src.auth_need - src.authorized.len) if("Abort") - world << "\blue All authorizations to shorting time for shuttle launch have been revoked!" + world << "\blue All authorizations to shortening time for shuttle launch have been revoked!" src.authorized.len = 0 src.authorized = list( ) diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm index 9b433f33f7..479714b6b4 100644 --- a/code/game/machinery/cryo.dm +++ b/code/game/machinery/cryo.dm @@ -4,7 +4,7 @@ icon_state = "cell-off" density = 1 anchored = 1.0 - layer = 5 + layer = 2.8 var/on = 0 var/temperature_archived diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index f6d6b5118d..38dfc6ab4c 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -318,8 +318,9 @@ if(job && IsJobAvailable(job.title)) var/active = 0 // Only players with the job assigned and AFK for less than 10 minutes count as active - for(var/mob/M in player_list) if(M.mind && M.client && M.mind.assigned_job == job && M.client.inactivity <= 10 * 60 * 10) - active++ + for(var/mob/M in player_list) + if(M.mind && M.mind.assigned_job == job && M.client && M.client.inactivity <= 10 * 60 * 10) + active++ dat += "[job.title] ([job.current_positions]) (Active: [active])
" dat += "" From 0c2c999f74f2998912ae009223df83cbd987aa5d Mon Sep 17 00:00:00 2001 From: Cael_Aislinn Date: Tue, 22 Jan 2013 17:55:49 +1000 Subject: [PATCH 18/19] money! re-added atms, created account system / accounts database, whole bunch of options for moving money around, some tweaks to spacecash and icons Signed-off-by: Cael_Aislinn --- baystation12.dme | 5 +- .../Cael_Aislinn/Economy/Accounts.dm | 298 ++++++++++++++ .../Cael_Aislinn/Economy/EFTPOS.dm | 177 ++++++++ code/WorkInProgress/Mini/ATM.dm | 385 +++++++++++++++--- code/defines/obj/weapon.dm | 24 +- code/game/objects/items/weapons/cards_ids.dm | 1 + icons/obj/items.dmi | Bin 57884 -> 57860 bytes icons/obj/terminals.dmi | Bin 17900 -> 18814 bytes 8 files changed, 835 insertions(+), 55 deletions(-) create mode 100644 code/WorkInProgress/Cael_Aislinn/Economy/Accounts.dm create mode 100644 code/WorkInProgress/Cael_Aislinn/Economy/EFTPOS.dm diff --git a/baystation12.dme b/baystation12.dme index e98adba9ef..7f2730fbfb 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -1129,9 +1129,11 @@ #include "code\WorkInProgress\Cael_Aislinn\sculpture.dm" #include "code\WorkInProgress\Cael_Aislinn\shield_capacitor.dm" #include "code\WorkInProgress\Cael_Aislinn\shield_gen.dm" +#include "code\WorkInProgress\Cael_Aislinn\Economy\Accounts.dm" #include "code\WorkInProgress\Cael_Aislinn\Economy\Economy.dm" #include "code\WorkInProgress\Cael_Aislinn\Economy\Economy_Events.dm" #include "code\WorkInProgress\Cael_Aislinn\Economy\Economy_TradeDestinations.dm" +#include "code\WorkInProgress\Cael_Aislinn\Economy\EFTPOS.dm" #include "code\WorkInProgress\Cael_Aislinn\Jungle\falsewall.dm" #include "code\WorkInProgress\Cael_Aislinn\Jungle\jungle.dm" #include "code\WorkInProgress\Cael_Aislinn\Jungle\jungle_animals.dm" @@ -1157,6 +1159,7 @@ #include "code\WorkInProgress\Cael_Aislinn\Supermatter\SuperMatter.dm" #include "code\WorkInProgress\Cael_Aislinn\Supermatter\ZeroPointLaser.dm" #include "code\WorkInProgress\Chinsky\ashtray.dm" +#include "code\WorkInProgress\Mini\ATM.dm" #include "code\WorkInProgress\Ported\policetape.dm" #include "code\WorkInProgress\SkyMarshal\Ultralight_procs.dm" #include "code\WorkInProgress\Susan\susan_desert_turfs.dm" @@ -1179,7 +1182,7 @@ #include "code\ZAS\ZAS_Zones.dm" #include "interface\interface.dm" #include "interface\skin.dmf" -#include "maps\tgstation.2.1.0.dmm" +#include "maps\tgstation.2.1.0.0.1.dmm" #include "maps\RandomZLevels\Academy.dm" #include "maps\RandomZLevels\challenge.dm" #include "maps\RandomZLevels\stationCollision.dm" diff --git a/code/WorkInProgress/Cael_Aislinn/Economy/Accounts.dm b/code/WorkInProgress/Cael_Aislinn/Economy/Accounts.dm new file mode 100644 index 0000000000..a69f364e0f --- /dev/null +++ b/code/WorkInProgress/Cael_Aislinn/Economy/Accounts.dm @@ -0,0 +1,298 @@ +var/global/current_date_string +var/global/num_financial_terminals = 1 +var/global/datum/money_account/station_account +var/global/next_account_number = 0 + +/proc/create_station_account() + if(!station_account) + next_account_number = rand(111111, 999999) + + station_account = new() + station_account.owner_name = "[station_name()] Station Account" + station_account.account_number = rand(111111, 999999) + station_account.remote_access_pin = rand(1111, 111111) + station_account.money = 10000 + + //create an entry in the account transaction log for when it was created + var/datum/transaction/T = new() + T.target_name = station_account.owner_name + T.purpose = "Account creation" + T.amount = 10000 + T.date = "2nd April, 2555" + T.time = "11:24" + T.source_terminal = "Biesel GalaxyNet Terminal #277" + + //add the account + station_account.transaction_log.Add(T) + for(var/obj/machinery/account_database/A in world) + A.accounts.Add(station_account) + +//the current ingame time (hh:mm) can be obtained by calling: +//worldtime2text() + +/datum/money_account + var/owner_name = "" + var/account_number = 0 + var/remote_access_pin = 0 + var/money = 0 + var/list/transaction_log = list() + var/security_level = 1 //0 - auto-identify from worn ID, require only account number + //1 - require manual login / account number and pin + //2 - require card and manual login + +/datum/transaction + var/target_name = "" + var/purpose = "" + var/amount = 0 + var/date = "" + var/time = "" + var/source_terminal = "" + +/obj/machinery/account_database + name = "Accounts database" + desc = "Holds transaction logs, account data and all kinds of other financial records." + icon = 'virology.dmi' + icon_state = "analyser" + density = 1 + var/list/accounts = list() + req_one_access = list(access_hop, access_captain) + var/receipt_num + var/machine_id = "" + var/obj/item/weapon/card/id/held_card + var/access_level = 0 + var/datum/money_account/detailed_account_view + var/creating_new_account = 0 + +/obj/machinery/account_database/New() + ..() + if(!station_account) + create_station_account() + + if(!current_date_string) + current_date_string = "[num2text(rand(1,31))] [pick("January","February","March","April","May","June","July","August","September","October","November","December")], 2557" + + machine_id = "[station_name()] Acc. DB #[num_financial_terminals++]" + +/obj/machinery/account_database/attack_hand(mob/user as mob) + if(get_dist(src,user) <= 1) + var/dat = "Accounts Database
" + dat += "[machine_id]
" + dat += "Confirm identity: [held_card ? held_card : "-----"]
" + + if(access_level > 0) + dat += "You may not edit accounts at this terminal, only create and view them.
" + if(creating_new_account) + dat += "
" + dat += "Return to accounts list" + dat += "
" + dat += "" + dat += "" + dat += "Holder name:
" + dat += "Initial funds: (subtracted from station account)
" + dat += "New accounts are automatically assigned a secret number and pin, which are printed separately in a sealed package.
" + dat += "
" + dat += "
" + else + if(detailed_account_view) + dat += "
" + dat += "Return to accounts list
" + dat += "Account number: #[detailed_account_view.account_number]
" + dat += "Account holder: [detailed_account_view.owner_name]
" + dat += "Account balance: $[detailed_account_view.money]
" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + for(var/datum/transaction/T in detailed_account_view.transaction_log) + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "
DateTimeTargetPurposeValueSource terminal ID
[T.date][T.time][T.target_name][T.purpose]$[T.amount][T.source_terminal]
" + else + dat += "Create new account Sync accounts across databases

" + dat += "" + for(var/i=1, i<=accounts.len, i++) + var/datum/money_account/D = accounts[i] + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "
#[D.account_number][D.owner_name]View in detail
" + + user << browse(dat,"window=account_db;size=700x650") + else + user << browse(null,"window=account_db") + +/obj/machinery/account_database/attackby(O as obj, user as mob)//TODO:SANITY + if(istype(O, /obj/item/weapon/card)) + var/obj/item/weapon/card/id/idcard = O + if(!held_card) + usr.drop_item() + idcard.loc = src + held_card = idcard + + if(access_cent_captain in idcard.access) + access_level = 2 + else if(access_hop in idcard.access || access_captain in idcard.access) + access_level = 1 + else + ..() + +/obj/machinery/account_database/Topic(var/href, var/href_list) + if(href_list["choice"]) + switch(href_list["choice"]) + if("sync_accounts") + for(var/obj/machinery/account_database/A in world) + for(var/datum/money_account/M in src.accounts) + if(!A.accounts.Find(M)) + A.accounts.Add(M) + usr << "\icon[src] Accounts synched across all databases in range." + + if("create_account") + creating_new_account = 1 + if("finalise_create_account") + var/account_name = href_list["holder_name"] + var/starting_funds = max(text2num(href_list["starting_funds"]), 0) + add_account(account_name, starting_funds) + if(starting_funds > 0) + //subtract the money + station_account.money -= starting_funds + + //create a transaction log entry + var/datum/transaction/T = new() + T.target_name = account_name + T.purpose = "New account funds initialisation" + T.amount = "([starting_funds])" + T.date = current_date_string + T.time = worldtime2text() + T.source_terminal = machine_id + station_account.transaction_log.Add(T) + + creating_new_account = 0 + if("insert_card") + if(held_card) + held_card.loc = src.loc + + if(ishuman(usr) && !usr.get_active_hand()) + usr.put_in_hands(held_card) + held_card = null + access_level = 0 + + else + var/obj/item/I = usr.get_active_hand() + if (istype(I, /obj/item/weapon/card/id)) + var/obj/item/weapon/card/id/C = I + usr.drop_item() + C.loc = src + held_card = C + + if(access_cent_captain in C.access) + access_level = 2 + else if(access_hop in C.access || access_captain in C.access) + access_level = 1 + if("view_account_detail") + var/index = text2num(href_list["account_index"]) + if(index && index <= accounts.len) + detailed_account_view = accounts[index] + if("view_accounts_list") + detailed_account_view = null + creating_new_account = 0 + + src.attack_hand(usr) + +/obj/machinery/account_database/proc/add_account(var/new_owner_name = "Default user", var/starting_funds = 0, var/pre_existing = 0) + + //create a new account + var/datum/money_account/M = new() + M.owner_name = new_owner_name + M.remote_access_pin = rand(1111, 111111) + M.money = starting_funds + + //create an entry in the account transaction log for when it was created + var/datum/transaction/T = new() + T.target_name = new_owner_name + T.purpose = "Account creation" + T.amount = starting_funds + if(pre_existing) + //set a random date, time and location some time over the past few decades + T.date = "[num2text(rand(1,31))] [pick("January","February","March","April","May","June","July","August","September","October","November","December")], 25[rand(10,56)]" + T.time = "[rand(0,24)]:[rand(11,59)]" + T.source_terminal = "NTGalaxyNet Terminal #[rand(111,1111)]" + + M.account_number = rand(111111, 999999) + else + T.date = current_date_string + T.time = worldtime2text() + T.source_terminal = machine_id + + M.account_number = next_account_number + next_account_number += rand(1,25) + + //create a sealed package containing the account details + var/obj/item/smallDelivery/P = new(src.loc) + + var/obj/item/weapon/paper/R = new(P) + P.wrapped = R + R.name = "Account information: [M.owner_name]" + R.info = "Account details (confidential)


" + R.info += "Account holder: [M.owner_name]
" + R.info += "Account number: [M.account_number]
" + R.info += "Account pin: [M.remote_access_pin]
" + R.info += "Starting balance: $[M.money]
" + R.info += "Date and time: [worldtime2text()], [current_date_string]

" + R.info += "Creation terminal ID: [machine_id]
" + R.info += "Authorised NT officer overseeing creation: [held_card.registered_name]
" + + //stamp the paper + var/image/stampoverlay = image('icons/obj/bureaucracy.dmi') + stampoverlay.icon_state = "paper_stamp-cent" + if(!R.stamped) + R.stamped = new + R.stamped += /obj/item/weapon/stamp + R.overlays += stampoverlay + R.stamps += "
This paper has been stamped by the Accounts Database." + + + //add the account + M.transaction_log.Add(T) + accounts.Add(M) + +/obj/machinery/account_database/proc/charge_to_account(var/attempt_account_number, var/source_name, var/purpose, var/terminal_id, var/amount) + for(var/datum/money_account/D in accounts) + if(D.account_number == attempt_account_number) + D.money += amount + + //create a transaction log entry + var/datum/transaction/T = new() + T.target_name = source_name + T.purpose = purpose + if(amount < 0) + T.amount = "([amount])" + else + T.amount = "[amount]" + T.date = current_date_string + T.time = worldtime2text() + T.source_terminal = terminal_id + D.transaction_log.Add(T) + + return 1 + + return 0 + +//this returns the first account datum that matches the supplied accnum/pin combination, it returns null if the combination did not match any account +/obj/machinery/account_database/proc/attempt_account_access(var/attempt_account_number, var/attempt_pin_number, var/security_level_passed = 0) + for(var/datum/money_account/D in accounts) + if(D.account_number == attempt_account_number) + if( D.security_level <= security_level_passed && (!D.security_level || D.remote_access_pin == attempt_pin_number) ) + return D diff --git a/code/WorkInProgress/Cael_Aislinn/Economy/EFTPOS.dm b/code/WorkInProgress/Cael_Aislinn/Economy/EFTPOS.dm new file mode 100644 index 0000000000..5fc619755a --- /dev/null +++ b/code/WorkInProgress/Cael_Aislinn/Economy/EFTPOS.dm @@ -0,0 +1,177 @@ +/obj/item/weapon/eftpos + name = "EFTPOS scanner" + desc = "Swipe your ID card to pay electronically." + icon = 'icons/obj/library.dmi' + icon_state = "scanner" + var/machine_id = "" + var/eftpos_name = "Default EFTPOS scanner" + var/transaction_locked = 0 + var/transaction_paid = 0 + var/transaction_amount = 0 + var/transaction_purpose = "Default charge" + var/access_code = 0 + var/obj/machinery/account_database/linked_db + var/datum/money_account/linked_account + +/obj/item/weapon/eftpos/New() + ..() + machine_id = "[station_name()] EFTPOS #[num_financial_terminals++]" + access_code = rand(1111,111111) + reconnect_database() + print_reference() + + //by default, connect to the station account + //the user of the EFTPOS device can change the target account though, and no-one will be the wiser (except whoever's being charged) + linked_account = station_account + +/obj/item/weapon/eftpos/proc/print_reference() + var/obj/item/weapon/paper/R = new(get_turf(src)) + R.name = "Reference: [eftpos_name]" + R.info = "[eftpos_name] reference

" + R.info += "Access code: [access_code]

" + R.info += "Do not lose this code, or the device will have to be replaced.
" + + //stamp the paper + var/image/stampoverlay = image('icons/obj/bureaucracy.dmi') + stampoverlay.icon_state = "paper_stamp-cent" + if(!R.stamped) + R.stamped = new + R.stamped += /obj/item/weapon/stamp + R.overlays += stampoverlay + R.stamps += "
This paper has been stamped by the EFTPOS device." + +/obj/item/weapon/eftpos/proc/reconnect_database() + for(var/obj/machinery/account_database/DB in world) + if(DB.z == src.z) + linked_db = DB + break + +/obj/item/weapon/eftpos/attack_self(mob/user as mob) + if(get_dist(src,user) <= 1) + var/dat = "[eftpos_name]
" + dat += "This terminal is [machine_id]. Report this code when contacting NanoTrasen IT Support
" + if(transaction_locked) + dat += "Reset[transaction_paid ? "" : " (authentication required)"]

" + + dat += "Transaction purpose: [transaction_purpose]
" + dat += "Value: $[transaction_amount]
" + dat += "Linked account: [linked_account ? linked_account.owner_name : "None"]
" + if(transaction_paid) + dat += "This transaction has been processed successfully.
" + else + dat += "Swipe your card below the line to finish this transaction.
" + dat += "\[------\]" + else + dat += "Lock in new transaction

" + + dat += "Transaction purpose: [transaction_purpose]
" + dat += "Value: $[transaction_amount]
" + dat += "Linked account: [linked_account ? linked_account.owner_name : "None"]
" + dat += "Change access code" + user << browse(dat,"window=eftpos") + else + user << browse(null,"window=eftpos") + +/obj/item/weapon/eftpos/attackby(O as obj, user as mob) + if(istype(O, /obj/item/weapon/card)) + //attempt to connect to a new db, and if that doesn't work then fail + if(!linked_db) + reconnect_database() + if(linked_db && linked_account) + var/obj/item/weapon/card/I = O + scan_card(I) + else + usr << "\icon[src]Unable to connect to accounts database." + else + ..() + +/obj/item/weapon/eftpos/Topic(var/href, var/href_list) + if(href_list["choice"]) + switch(href_list["choice"]) + if("change_code") + var/attempt_code = text2num(input("Re-enter the current EFTPOS access code", "Confirm old EFTPOS code")) + if(attempt_code == access_code) + access_code = text2num(input("Enter a new access code for this device", "Enter new EFTPOS code")) + print_reference() + else + usr << "\icon[src]Incorrect code entered." + if("link_account") + if(linked_db) + var/attempt_account_num = text2num(input("Enter account number to pay EFTPOS charges into", "New account number")) + var/attempt_pin = text2num(input("Enter pin code", "Account pin")) + linked_account = linked_db.attempt_account_access(attempt_account_num, attempt_pin, 1) + else + usr << "Unable to connect to accounts database." + if("trans_purpose") + transaction_purpose = input("Enter reason for EFTPOS transaction", "Transaction purpose") + if("trans_value") + transaction_amount = max(text2num(input("Enter amount for EFTPOS transaction", "Transaction amount")),0) + if("toggle_lock") + if(transaction_locked) + var/attempt_code = text2num(input("Enter EFTPOS access code", "Reset Transaction")) + if(attempt_code == access_code) + transaction_locked = 0 + transaction_paid = 0 + else if(linked_account) + transaction_locked = 1 + else + usr << "\icon[src] No account connected to send transactions to." + if("scan_card") + //attempt to connect to a new db, and if that doesn't work then fail + if(!linked_db) + reconnect_database() + if(linked_db && linked_account) + var/obj/item/I = usr.get_active_hand() + if (istype(I, /obj/item/weapon/card)) + scan_card(I) + else + usr << "\icon[src]Unable to link accounts." + + src.attack_self(usr) + +/obj/item/weapon/eftpos/proc/scan_card(var/obj/item/weapon/card/I) + if (istype(I, /obj/item/weapon/card/id)) + var/obj/item/weapon/card/id/C = I + visible_message("[usr] swipes a card through [src].") + if(transaction_locked && !transaction_paid) + if(linked_account) + var/attempt_pin = text2num(input("Enter pin code", "EFTPOS transaction")) + var/datum/money_account/D = linked_db.attempt_account_access(C.associated_account_number, attempt_pin, 2) + if(D) + if(transaction_amount <= D.money) + playsound(src, 'chime.ogg', 50, 1) + src.visible_message("\icon[src] The [src] chimes.") + transaction_paid = 1 + + //transfer the money + D.money -= transaction_amount + linked_account.money += transaction_amount + + //create entries in the two account transaction logs + var/datum/transaction/T = new() + T.target_name = "[linked_account.owner_name] ([eftpos_name])" + T.purpose = transaction_purpose + T.amount = "([transaction_amount])" + T.source_terminal = machine_id + T.date = current_date_string + T.time = worldtime2text() + D.transaction_log.Add(T) + // + T = new() + T.target_name = D.owner_name + T.purpose = transaction_purpose + T.amount = "[transaction_amount]" + T.source_terminal = machine_id + T.date = current_date_string + T.time = worldtime2text() + linked_account.transaction_log.Add(T) + else + usr << "\icon[src]You don't have that much money!" + else + usr << "\icon[src]EFTPOS is not connected to an account." + else + usr << "\icon[src]Unable to access account. Check security settings and try again." + else + ..() + + //emag? \ No newline at end of file diff --git a/code/WorkInProgress/Mini/ATM.dm b/code/WorkInProgress/Mini/ATM.dm index 17b6ef2e47..7551e96e9c 100644 --- a/code/WorkInProgress/Mini/ATM.dm +++ b/code/WorkInProgress/Mini/ATM.dm @@ -7,6 +7,11 @@ log transactions */ +#define NO_SCREEN 0 +#define CHANGE_SECURITY_LEVEL 1 +#define TRANSFER_FUNDS 2 +#define VIEW_TRANSACTION_LOGS 3 + /obj/item/weapon/card/id/var/money = 2000 /obj/machinery/atm @@ -17,72 +22,346 @@ log transactions anchored = 1 use_power = 1 idle_power_usage = 10 + var/obj/machinery/account_database/linked_db + var/datum/money_account/authenticated_account + var/number_incorrect_tries = 0 + var/previous_account_number = 0 + var/max_pin_attempts = 3 + var/ticks_left_locked_down = 0 + var/ticks_left_timeout = 0 + var/machine_id = "" + var/obj/item/weapon/card/held_card + var/editing_security_level = 0 + var/view_screen = NO_SCREEN + +/obj/machinery/atm/New() + ..() + reconnect_database() + machine_id = "[station_name()] RT #[num_financial_terminals++]" + +/obj/machinery/atm/process() + if(ticks_left_timeout > 0) + ticks_left_timeout-- + if(ticks_left_timeout <= 0) + authenticated_account = null + if(ticks_left_locked_down > 0) + ticks_left_locked_down-- + + for(var/obj/item/weapon/spacecash/S in src) + S.loc = src.loc + if(prob(50)) + playsound(loc, 'sound/items/polaroid1.ogg', 50, 1) + else + playsound(loc, 'sound/items/polaroid2.ogg', 50, 1) + break + +/obj/machinery/atm/proc/reconnect_database() + for(var/obj/machinery/account_database/DB in world) + if(DB.z == src.z) + linked_db = DB + break /obj/machinery/atm/attackby(obj/item/I as obj, mob/user as mob) - if(ishuman(user)) - var/obj/item/weapon/card/id/user_id = src.scan_user(user) + if(istype(I, /obj/item/weapon/card)) + var/obj/item/weapon/card/id/idcard = I + if(!held_card) + usr.drop_item() + idcard.loc = src + held_card = idcard + authenticated_account = null + else if(authenticated_account) if(istype(I,/obj/item/weapon/spacecash)) - user_id.money += I:worth + //consume the money + authenticated_account.money += I:worth + if(prob(50)) + playsound(loc, 'sound/items/polaroid1.ogg', 50, 1) + else + playsound(loc, 'sound/items/polaroid2.ogg', 50, 1) + + //create a transaction log entry + var/datum/transaction/T = new() + T.target_name = authenticated_account.owner_name + T.purpose = "Credit deposit" + T.amount = I:worth + T.source_terminal = machine_id + T.date = current_date_string + T.time = worldtime2text() + authenticated_account.transaction_log.Add(T) + + user << "You insert [I] into [src]." + src.attack_hand(user) del I + else ..() /obj/machinery/atm/attack_hand(mob/user as mob) if(istype(user, /mob/living/silicon)) user << "\red Artificial unit recognized. Artificial units do not currently receive monetary compensation, as per NanoTrasen regulation #1005." return + if(get_dist(src,user) <= 1) + //check to see if the user has low security enabled + scan_user(user) - var/obj/item/weapon/card/id/user_id = src.scan_user(user) - if(..()) - return - var/dat = "" - dat += "

NanoTrasen Automatic Teller Machine


" - dat += "For all your monetary needs!

" - dat += "Welcome, [user_id.registered_name].
" - dat += "You have $[user_id.money] in your account.
" - dat += "Withdraw
" - user << browse(dat,"window=atm") + //js replicated from obj/machinery/computer/card + var/dat = "

NanoTrasen Automatic Teller Machine

" + dat += "For all your monetary needs!
" + dat += "This terminal is [machine_id]. Report this code when contacting NanoTrasen IT Support
" + dat += "Card: [held_card ? held_card.name : "------"]

" + + if(ticks_left_locked_down > 0) + dat += "Maximum number of pin attempts exceeded! Access to this ATM has been temporarily disabled." + else if(authenticated_account) + switch(view_screen) + if(CHANGE_SECURITY_LEVEL) + dat += "Select a new security level for this account:

" + var/text = "Zero - Only account number or card is required to access this account. EFTPOS transactions will require a card and ask for a pin, but not verify the pin is correct." + if(authenticated_account.security_level != 0) + text = "[text]" + dat += "[text]
" + text = "One - Both an account number and pin is required to access this account and process transactions." + if(authenticated_account.security_level != 1) + text = "[text]" + dat += "[text]
" + text = "Two - In addition to account number and pin, a card is required to access this account and process transactions." + if(authenticated_account.security_level != 2) + text = "[text]" + dat += "[text]

" + dat += "Back" + if(VIEW_TRANSACTION_LOGS) + dat += "Transaction logs
" + dat += "Back" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + for(var/datum/transaction/T in authenticated_account.transaction_log) + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "
DateTimeTargetPurposeValueSource terminal ID
[T.date][T.time][T.target_name][T.purpose]$[T.amount][T.source_terminal]
" + if(TRANSFER_FUNDS) + dat += "Account balance: $[authenticated_account.money]
" + dat += "Back

" + dat += "
" + dat += "" + dat += "" + dat += "Target account number:
" + dat += "Funds to transfer:
" + dat += "Transaction purpose:
" + dat += "
" + dat += "
" + else + dat += "Welcome, [authenticated_account.owner_name].
" + dat += "Account balance: $[authenticated_account.money]" + dat += "
" + dat += "" + dat += "" + dat += "
" + dat += "
" + dat += "Change account security level
" + dat += "Make transfer
" + dat += "View transaction log
" + dat += "Print balance statement
" + dat += "Logout
" + else if(linked_db) + dat += "
" + dat += "" + dat += "" + dat += "Account:
" + dat += "PIN:
" + dat += "
" + dat += "
" + else + dat += "Unable to connect to accounts database, please retry and if the issue persists contact NanoTrasen IT support." + reconnect_database() + + user << browse(dat,"window=atm;size=500x650") + else + user << browse(null,"window=atm") /obj/machinery/atm/Topic(var/href, var/href_list) - if(href_list["withdraw"] && href_list["id"]) - var/amount = input("How much would you like to withdraw?", "Amount", 0) in list(1,10,20,50,100,200,500,1000, 0) - var/obj/item/weapon/card/id/user_id = locate(href_list["id"]) - if(amount != 0 && user_id) - if(amount <= user_id.money) - user_id.money -= amount - //hueg switch for giving moneh out - switch(amount) - if(1) - new /obj/item/weapon/spacecash(loc) - if(10) - new /obj/item/weapon/spacecash/c10(loc) - if(20) - new /obj/item/weapon/spacecash/c20(loc) - if(50) - new /obj/item/weapon/spacecash/c50(loc) - if(100) - new /obj/item/weapon/spacecash/c100(loc) - if(200) - new /obj/item/weapon/spacecash/c200(loc) - if(500) - new /obj/item/weapon/spacecash/c500(loc) - if(1000) - new /obj/item/weapon/spacecash/c1000(loc) - else - usr << browse("You don't have that much money!
Back","window=atm") - return + if(href_list["choice"]) + switch(href_list["choice"]) + if("transfer") + if(authenticated_account && linked_db) + var/target_account_number = text2num(href_list["target_acc_number"]) + var/transfer_amount = text2num(href_list["funds_amount"]) + var/transfer_purpose = href_list["purpose"] + if(transfer_amount <= authenticated_account.money) + if(linked_db.charge_to_account(target_account_number, authenticated_account.owner_name, transfer_purpose, machine_id, transfer_amount)) + usr << "\icon[src]Funds transfer successful." + authenticated_account.money -= transfer_amount + + //create an entry in the account transaction log + var/datum/transaction/T = new() + T.target_name = "Account #[target_account_number]" + T.purpose = transfer_purpose + T.source_terminal = machine_id + T.date = current_date_string + T.time = worldtime2text() + T.amount = "([transfer_amount])" + authenticated_account.transaction_log.Add(T) + else + usr << "\icon[src]Funds transfer failed." + + else + usr << "\icon[src]You don't have enough funds to do that!" + if("view_screen") + view_screen = text2num(href_list["view_screen"]) + if("change_security_level") + if(authenticated_account) + var/new_sec_level = max( min(text2num(href_list["new_security_level"]), 2), 0) + authenticated_account.security_level = new_sec_level + if("attempt_auth") + if(linked_db) + var/tried_account_num = text2num(href_list["account_num"]) + if(!tried_account_num) + tried_account_num = held_card.associated_account_number + var/tried_pin = text2num(href_list["account_pin"]) + + authenticated_account = linked_db.attempt_account_access(tried_account_num, tried_pin, held_card && held_card.associated_account_number == tried_account_num ? 2 : 1) + if(!authenticated_account) + if(previous_account_number == tried_account_num) + if(++number_incorrect_tries > max_pin_attempts) + //lock down the atm + number_incorrect_tries = 0 + ticks_left_locked_down = 10 + playsound(src, 'buzz-two.ogg', 50, 1) + + //create an entry in the account transaction log + var/datum/transaction/T = new() + T.target_name = authenticated_account.owner_name + T.purpose = "Unauthorised login attempt" + T.source_terminal = machine_id + T.date = current_date_string + T.time = worldtime2text() + authenticated_account.transaction_log.Add(T) + else + previous_account_number = tried_account_num + number_incorrect_tries = 1 + playsound(src, 'buzz-sigh.ogg', 50, 1) + else + playsound(src, 'twobeep.ogg', 50, 1) + ticks_left_timeout = 120 + view_screen = NO_SCREEN + + //create a transaction log entry + var/datum/transaction/T = new() + T.target_name = authenticated_account.owner_name + T.purpose = "Remote terminal access" + T.source_terminal = machine_id + T.date = current_date_string + T.time = worldtime2text() + authenticated_account.transaction_log.Add(T) + if("withdrawal") + var/amount = max(text2num(href_list["funds_amount"]),0) + if(authenticated_account && amount > 0) + if(amount <= authenticated_account.money) + playsound(src, 'chime.ogg', 50, 1) + + //remove the money + authenticated_account.money -= amount + withdraw_arbitrary_sum(amount) + + //create an entry in the account transaction log + var/datum/transaction/T = new() + T.target_name = authenticated_account.owner_name + T.purpose = "Credit withdrawal" + T.amount = "([amount])" + T.source_terminal = machine_id + T.date = current_date_string + T.time = worldtime2text() + authenticated_account.transaction_log.Add(T) + else + usr << "\icon[src]You don't have enough funds to do that!" + if("balance_statement") + if(authenticated_account) + var/obj/item/weapon/paper/R = new(src.loc) + R.name = "Account balance: [authenticated_account.owner_name]" + R.info = "NT Automated Teller Account Statement

" + R.info += "Account holder: [authenticated_account.owner_name]
" + R.info += "Account number: [authenticated_account.account_number]
" + R.info += "Balance: $[authenticated_account.money]
" + R.info += "Date and time: [worldtime2text()], [current_date_string]

" + R.info += "Service terminal ID: [machine_id]
" + + //stamp the paper + var/image/stampoverlay = image('icons/obj/bureaucracy.dmi') + stampoverlay.icon_state = "paper_stamp-cent" + if(!R.stamped) + R.stamped = new + R.stamped += /obj/item/weapon/stamp + R.overlays += stampoverlay + R.stamps += "
This paper has been stamped by the Automatic Teller Machine." + + if(prob(50)) + playsound(loc, 'sound/items/polaroid1.ogg', 50, 1) + else + playsound(loc, 'sound/items/polaroid2.ogg', 50, 1) + if("insert_card") + if(held_card) + held_card.loc = src.loc + authenticated_account = null + + if(ishuman(usr) && !usr.get_active_hand()) + usr.put_in_hands(held_card) + held_card = null + + else + var/obj/item/I = usr.get_active_hand() + if (istype(I, /obj/item/weapon/card/id)) + usr.drop_item() + I.loc = src + held_card = I + if("logout") + authenticated_account = null src.attack_hand(usr) +//create the most effective combination of notes to make up the requested amount +/obj/machinery/atm/proc/withdraw_arbitrary_sum(var/arbitrary_sum) + while(arbitrary_sum >= 1000) + arbitrary_sum -= 1000 + new /obj/item/weapon/spacecash/c1000(src) + while(arbitrary_sum >= 500) + arbitrary_sum -= 500 + new /obj/item/weapon/spacecash/c500(src) + while(arbitrary_sum >= 200) + arbitrary_sum -= 200 + new /obj/item/weapon/spacecash/c200(src) + while(arbitrary_sum >= 100) + arbitrary_sum -= 100 + new /obj/item/weapon/spacecash/c100(src) + while(arbitrary_sum >= 50) + arbitrary_sum -= 50 + new /obj/item/weapon/spacecash/c50(src) + while(arbitrary_sum >= 20) + arbitrary_sum -= 20 + new /obj/item/weapon/spacecash/c20(src) + while(arbitrary_sum >= 10) + arbitrary_sum -= 10 + new /obj/item/weapon/spacecash/c10(src) + while(arbitrary_sum >= 1) + arbitrary_sum -= 1 + new /obj/item/weapon/spacecash(src) + //stolen wholesale and then edited a bit from newscasters, which are awesome and by Agouri /obj/machinery/atm/proc/scan_user(mob/living/carbon/human/human_user as mob) - if(human_user.wear_id) - if(istype(human_user.wear_id, /obj/item/device/pda) ) - var/obj/item/device/pda/P = human_user.wear_id - if(P.id) - return P.id - else - return null - else if(istype(human_user.wear_id, /obj/item/weapon/card/id) ) - return human_user.wear_id - else - return null - else - return null + if(!authenticated_account && linked_db) + if(human_user.wear_id) + var/obj/item/weapon/card/id/I + if(istype(human_user.wear_id, /obj/item/weapon/card/id) ) + I = human_user.wear_id + else if(istype(human_user.wear_id, /obj/item/device/pda) ) + var/obj/item/device/pda/P = human_user.wear_id + I = P.id + if(I) + authenticated_account = linked_db.attempt_account_access(I.associated_account_number) diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm index 959f1cef71..94caf0454d 100644 --- a/code/defines/obj/weapon.dm +++ b/code/defines/obj/weapon.dm @@ -27,7 +27,7 @@ /obj/item/weapon/spacecash - name = "space cash" + name = "1 credit chip" desc = "It's worth 1 credit." gender = PLURAL icon = 'icons/obj/items.dmi' @@ -42,35 +42,57 @@ w_class = 1.0 var/access = list() access = access_crate_cash + var/worth = 1 /obj/item/weapon/spacecash/c10 + name = "10 credit chip" icon_state = "spacecash10" access = access_crate_cash desc = "It's worth 10 credits." + worth = 10 + /obj/item/weapon/spacecash/c20 + name = "20 credit chip" icon_state = "spacecash20" access = access_crate_cash desc = "It's worth 20 credits." + worth = 20 + /obj/item/weapon/spacecash/c50 + name = "50 credit chip" icon_state = "spacecash50" access = access_crate_cash desc = "It's worth 50 credits." + worth = 50 + /obj/item/weapon/spacecash/c100 + name = "100 credit chip" icon_state = "spacecash100" access = access_crate_cash desc = "It's worth 100 credits." + worth = 100 + /obj/item/weapon/spacecash/c200 + name = "200 credit chip" icon_state = "spacecash200" access = access_crate_cash desc = "It's worth 200 credits." + worth = 200 + /obj/item/weapon/spacecash/c500 + name = "500 credit chip" icon_state = "spacecash500" access = access_crate_cash desc = "It's worth 500 credits." + worth = 500 + /obj/item/weapon/spacecash/c1000 + name = "1000 credit chip" icon_state = "spacecash1000" access = access_crate_cash desc = "It's worth 1000 credits." + worth = 1000 + /obj/item/weapon/bananapeel name = "banana peel" diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index 028b5c93f6..649a4fe713 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -16,6 +16,7 @@ desc = "Does card things." icon = 'icons/obj/card.dmi' w_class = 1.0 + var/associated_account_number = 0 var/list/files = list( ) diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi index 6ce1454ff41f05c61eef11c31535707e1e360aef..64570ee032dd4dbe933dbd8c44aef5c70c95abfe 100644 GIT binary patch delta 56801 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%0Ds`r-1efl{v{Q&gFJ=nClKc^k`_Wo zSH63*ccdR?I)zp=4n&K9s%mQP)|i*1cUlE-SKzBkFiVBL?Gc8AB^Z(YdC-uQoE*OM zN){l^Gg6^D4O?(a?I2{4I}&n9;QcF%$RGwPb(1<-sjB$?*eM*3oFT!jS*8TrW=UZA z4Od6YaE4W6ysTB4TQpXF^tf%kRpur%1NdX;x%6RRsXpCtsrK|$OGRGX?Sp+~gV-_- zz7KecQO3Z@FibAioME7KL_>1^80AlyPyI!M`10Mu`oS=bN*uFF(ekN}6qFQ1G|{*w zqn&0JaSa;6u274rmT&I!eh&=F_FC6ypIEMXC_PNn@*5PL_%K6MA{N?A)(6A@Zi9`~ zmz%T$TZNRZSXIMhX2ul7N_y?}`CiA_mj6#F+I9H)C}Z3=wI>V zcHq%3KDfZHG4j&RB(%_dzDOT-<@dkCXii<94f zfCwI%s9gnEe9f+M;14q8G|;cRts}N!J^h2TcfM9u9VSz!tY#D=g`3|G}x5 z`g)7w%#ZhZhd|nR@x2N1BCVf|cU6 zk57P`u2uw&2!p%XP+r;hm?D#|?T;LFVDEB5sHc6`#wuXmtm96dpb32`aK{M6nOR%E^bXt_Y0fGlVLZY-X(meLB<`Wn=>Ul&Tz30}!n6FtG*MOjSR3k|R9EwyR zCEOi!>Z+D&pj<`t);Ylh2rd>+!kH9z<#K2OJONqCifz~0wY#8X>ln(>xP@m#cK_W2 zYN1mLAer9B4Ee32mUcBHsIEZ@l=>1m!|I0UkNa+^_-@}zBN=%K82v790wzQEC zIOUT|Y*{IqX^nZ0ZlRlNK8LH2J$SX>RjW(43pJi#tra|4^EFmD{4_8eoDwAb*nX^| z8;Kg;wua(9?=K>3+3OVH6ag4{QX)8)5IJDr%dh2xd!s}7=9i3&GuSXOMLTW!M<5Nv zEb)h55mVezm+Eaz^FI#T;I~(00}gjVE!_ANL5%OW^Jm2RQyiIIU%tNFaIl7Uq(t-9 zh=0*zBr|7H4wWFyJ}r3sp6q>x=<}v~&^tf}$=aXFjN&m6ajY7W%1K2T)Ue!J+9rTQubmZliYT`8e$LWT66w_*_pS z2%A8_=@?92&lWr)h^zPcWRP|dsE8HlnjG7u5GXSg=R+kilyiqe zBf3!iEiyLjvdYF;ul4&Oe}S*Ut2*3b`W|cft=}ZuG{a$RI?O8qU0ttOhea6!cU zEdooJY@v5^L0>|o@?2P=<%gN)cat{=Xd!&em~`8$+5*>|AMue7v!XtTaJz_N5Xas~ z3iLb?bQ|}eEaVfIzX~wQCpHJMva|QXgAqU7omq(fq~N5Eq0DW5(TCmKsKJSq_9y_p zR{?BKRAM&uZ3!0cjeUza0wwx%QBgImhLfqO zh-D+-U83(6p50DOsNMvKO#H1nvI!;3~rw-X)d&e=k9PE>;{lU)Xj9$%UW8YQ4%1 zUX>R#bJX?oaL=@TZRjJzc~|B}cADqpm}ZX8!m+W4apB`n1%#|^d9fx z6V2t7qKT#B$P)0vqVoc}PXu@&YkZ9-4_42bXTpqx$f?LZT-k`q%m~a;KR94q=(lFcw;(Aj9(&Wm1i68$);{~o9L z04+lQ-Q&sUl_S6&5DkP9G=_L#n6oki`9iY`9*TQk2yWd zld&L>i?hF$l~T`!k%JTy=vp~c7=K`L4{mq}7jPe^>GFnKTiZM+@7N-WK3*PbpDCWM zBKn_{_BhG!Or}NxHFW51JwbENT))Lr5H&soDcQ+Gzq@SfF!v?L2c^s;DwK_fn4iAa z0?^EzWxEV1FAm)|8)Ta^g6Tlq;R5o4hUTc673NT}-whslW67c0vIr?RI1RRi-HSWY z>8)tHG`U=CK3VBaqJ-!pXl-qY=8YNVeD8WvF{w!i6OO$ateNP44h5l#$S4`2em-_?(*dL? z*U-MMNwcCpCltlSbzz5YJeyVH@!$JmY#K&2y28W2_O1HsmJFhNRhT1fUK4PVq$)F~ zuHx7F)*(c!;
    Cm?Gi&<3!QNL*5o( z>}3S0d=XPPIhJ))#T{*os%c-EtOi)fO-Rt{LZJk-EXZ})ZhfuH>A!x+^!t|LlZqsY9KLA{OTGP@4pR6IxXR`)Vxe|3 zMSn07!|+3HzGD|(RWfbsUBN|QP6U5v3Vj8r!A#3zDGZ6k}@U&5Y(7R0r}UQ3Fsx?AyiknW0v2Rx+q@3AeHuP3d*XI!2^Y& zz&jHx2=Wg_2wYZW-_+3_ow$_`fQlQ;4R&i~q&?T#@({B8mjT<{Cq(#hP?xMV3-9siDqsVPa1h_uS_N{yWPVHi z7!pHXE&R4MOs{O;gVYS1fJ{hgsu8;J`OoZ>@D)cn09d?t{D){7Swvz7Sx2{ei$w-E zan$sFeN5-1qF%zOttU26vEL_Kh?VklE`3lHK|OuF>GPiDftD7sRi;C>F)B9~6;w*C z@r}sVW6Q0*t?fHo>LfektC3lhb{WYZ@9@(SFj+>+eiJXL^Az?SI>;DlQV^sscWX{f zWM@YQIs=tLobM;U91X6!-XBJp^Goqww;eQz&|x4}fNcywOp>K=V%$ey%hu@+NyP50qd~UucT$df3q$x7LUKIn+U_MNm=;V}p>!_7vUk3tfIk$VJT4k+)`^Kda zCx6wbS29qQcgFJbZZ35qynCT9-P$J|0c0?VJG%vmt8ak1!%2tx{^=>@i`&XF;Jm5} zFuD6mftTu2vRFTBY<}>~We+hiVh_m%fue)eXQj}EkB*x;zdEbba!Hg(k%?fbd?1*M z=ivBg79|^8b%@hjtolWXIwegK{1COzH~c}_VQDyu1l>P8oFRb-xtH-85w*A}fw%W= z=pcxh0E}UUqz~Tb!L=eM2~_EuCmywUElHKu!MCDJ~nK~(nXj)xBE>V`_lg4{t zLxoSGJtz8&IXnxy%Yn@P2&4_I>GOJu2xa~T3wgUU$gF8aPK)25erhBHxtjFADRV#% z-L}?o0V^v`s1_~a1=F+un`?PVB*Lh9LN;p122S#@0=e`XvQqn^ijt(@-OsWH$YPA8 zc)zaDrMh{e1}wLl*0t~ul?G@dh9S8sf>AI`bu3mI1@rshD-;a2NQ%2B=KS@DB4+#) z*Oi+~CY@>ZH_64$BB}hR$j#_L3|{Z^Q`D=M1M3-N^Ys*5NIWfxS-_sy&hZYWoVZi9 zQCGI!`j>IB;2)tof2R3zXP(!UyNiS0EjMOuoeQN{e4p`r9Gh-a3(vAPtH4WDovXDV z(+>}_H$b1J^0th#AiEK=V(BwrHc~|Ahz&?Xw=qaDsr+s4xc!OqED`VpR9eklh(N|e3l+hnI7a<@#vGB_r!94v``tTs{zT8Y||AXTYmtmG0pZ? z`Bh3B;@@$@zn0Qy`-WbKj7jjKII@ZNk_-iqL>{+vCl2W zq?-<8EoL)P$2)q?LIUUaXx=UOs?w?T+>IuOw&c-cwzM@Rj}8J8qfLyVT7>m=o*kP_ z91*A;EDCDb;=^rlda@{HBtd}FQYfB%a#i7wy#Yy-EQ4c|Sj?U>F@I9#yVsgFWr`dF zNKKqT3|G66_)I{4w)n~ge7+M|)cW?bf2xssi{2EY`KZ0qdS*}ayV(9S{VCtCO57xK zM*XjtUQTvnApBwcI|vK#8?rS$#%D`ny53!WJY-hu38^VD9!9ExpBH_XkX@aGW}()a z^xqJReqmU>bbcqKk2CY%H3z9my=}lnzPtOwtC#E7fVh+9KnbbJaM=@!U?a`kv#ePc ziyEz5QSY_um?$|UB}8RLCHr5K{kw(!-Cxjc5x%1f%$Ey(@QQ+Ke8c(Fs|f%6!A`l|!E#QuNfE6>YI3-s?p&yq>AI07HHXbG`U zH3YuxcY^}EXf415zP+vCj442wxuI}WORUR2S$L4kerj8g3)z^DYK)JlqLCv9Q&CZB zvEoN_h{Uh6VE8y@YclqYW!yHsT8|?}Hw)Y}iz-WGDY*A99n-g;EyF7=B!bjrGT^0X z8EVgaHobjYx65NR==t9;6t`@KQw}zqhTw{)5~Jr_bOFq}f3voT01JdniV@9Tg0b6w z%AEP-PRmVM-Y0)?LL=%WR%8`0a!ZFb7A1BuK3!d1@dm6B6xqX=HB5B}pPyi5)zy0& zLClAThj`Lb=I;oZC>awKEo;d(d!^UzM>0n3>?BLsH{DVPxr|aLCqUw6OOns8%9_e8 zmG_=YZbb}?i&|i|0C%&e2lY8wdHKajJ0%=2YKqwyiNKrg7En%TdvdcVtVqOVOX02M zY?lmTQx3J)vp+b179DgW*o>#YDL%T`KImg7_ex2?d!9ZzO`wQP!Am*4r^w&Fyr1wF zCz7MbL(eT8^Z4Rb1hk9SYUOJQ(=wzr+`12H#_7S6u2`)B9be=d$76UpQ;C;HTw$%L z60SHY_I%E3VD3kvSvUy4r%=PPSJMn#ZwmS1zE|_;C_%b)9jXOY%X*V6*#ZhMhXnt# zB&a2OR!2D3Cjv@AVk8B*yrVaNX}>N#^Pz1dBoN#<`{`+GCs`SiXca5>2&gctrG2$X z%@r!@;=}~R$_Qfy_n}8S$$F+1o4sMmY2sOfmERtBcz{noaA`#Msl>crOrNg;S%BBg zQ(;cK7k1WUs6mqGD%0>FvZ2#k!kB@xdjXHt?i#F6CSH#cx=xo|BVo0dO?wh<*(6VLYtNX@ADe?S$|U)!qA9UG=Z*&8b70Ep&#_8jOAr3Bpsoh1DU zs40-LOI7oiCTeu|N6%iak$!$I3h}q!J~9UHXn}JJ(iIV5<1?$g9= zDF9g0DQ)tT6;5}GwT7|rSNal`dSq#R7ZfVaAZtSx33-MzI*R`Sk$d6U-Vh=Or+$Q4 z(-RG3|M^FzXJ$rQY_FkX@)u5w8pOoY{Jd0ZdSmamQjk2vOH5s@tX|E|hNNYNR~0nsv zuuq1V?<(7jruK}cy|%ZrbE|Hyto(L= zxmQ9xO^Rhn5qxn`8#dPyero;0WH8M(b2C^dX9=u~^fo1ed7G{LvKD*g=04+I_s=z< z<;#H&M{{;VWcqTQUhcD9!(ikmgC`>0EFrPe8`r=*gX4hHfD^Im6ul$h@l3Nwoap%SyzrZog^zB9Ul4yE-Dx$B(%>$8YlHBP(s{x z3Y2r2dRZN7D81m4C?>{Cg!~Bqy?Yb(2SxZAMKNVul>p}fTGNn-#dP~OJOCnVM*1hn z?&HYg`i}qmgVeKltYMd0y@n(!Ot|WUia?p2r@vITH9;)fNrUGRHhS+ln_< z!m_e+Tdy^5P<7OyMMDtNzV+q0pGISS12eA2S#KF{teK_5){jzcyeG`9Q*1LX z%!59YN9}HxG<^V?ligc*>2N>#%kl2XndAPyzdK^H&7?gwLZJ25btr)5Keo<5SR4CB zZ2_fbJYpR9Voy*P8^NJW`1f>(2RXcI>+)V)0Hpgw-+dygO^l+WGocOpHI23O)X4=F zAQqTa?I%#x%UBVlyy;^~-v2{ZG`mAq%lcjsKb&F!Pds|qBXm4251B1Ty9YuNgp^fK z2P||={Ko=a+RmB1PL}>08`L9A_@_Tj2}H+4PXYqiDwm5#+Sq?fgw@P%wDjSN+S=OM z_{(Igr2yVrY)mB`^_tgXEB4u%bWR3y8!Ndf19MzPQ?c>)+w_?;jmEy+i<%7CjP?eh z(g@9Qg3yO7wC^)VYS^9)jg6n+o9fw+g!oa_CG4qx3;g)pojRt7~tD8$i^ zmNP?Qmgo=aF#4)r_msn9CL*g;%yQ2qLOB5Oz+YvpRcH2qfG6dgX4!+IBg$)VS_+lJ zM{|R4%7m1soZ_osE_dFiXY}mKV|j5JbSFdR;wr0s;qbf?vn~sB{bIkTVtc>d6f$Ht zXJ@W)iI+ijT@U!ZfSGR<8D!BnyWjj+|zVRAp)T)90lf zMA`e4w8-L>Rjt$zF|KNCYo?t5USz;IZvJmlhG;rvo*42l33&^r{YIFJv)cFp zS`%l9*#e>k_U3R6O^q}~X{^rmjmPBjvb?u9uGs3YtD74Jvg2El&#Ccj5dhU9E|aFS zvvX#^jX}rN6vv71J8h-;A@MH{tGD90{(DV4F*-kWRZ>|xT12XxIB}y+%>v&M6B8#T zCAn>pRuf4)-&bFLF1a^dml@}>Jti3u>6*R1P)$TGIMcImKsElE+~iuy?aY&4Y4!b$j(2zAKq z_jq~!#`B0CDmA@gE-n(}+9z06nk7Ym?~Rmk^XV-@PIU3ok0pELGgvN&I4IhJJrpC@ zj!nxxR;THbIr7?z9xE#_CpIlI1fQNJYRc*%@+N%)Gxt{hz;Qn6mI;s-TicBUjp?F4 zwEc#xHT<75!BG|EEI6&$LSnr|&m2ieY}+AZ0Y^S2ubVpj-ZIr|DF4{WwlDCVX_ebx z3pkVzf!732iA-sBZth}8;+YScDvi#09FcOquOGx~)}i^kus%FIyhG-05ZnOlo4QLw zC2Bp*)}U$>z{Kh}K}E!xA$IrjcvrveS_T$YuwGMq8=TQ@k@OPePhqAE2yMS5-dk_J zOiQ}O4LQz#RZeI?{Z}R|>!_f#PkV$cgtJdl&2T?FjF&SZT#^ie#~PhGgoSr@REj|R zUIU?+iIp3RfE_CjCH4`-TaM?UrA26kEhTaB`xTWAfW9QaXFba?t&EVM<MD!tDx33uW?zPqU)Yk9+Q4TLrVV1hFZ% zZ-W4_mB9u=s}*RODPMH(E~9NxN`+{4ksU?3O+>0z5W5J?YPHPAs~YQrAFNQ)BwajK z?xNECXtysYOm7;AlJ&HV4P>P3$x*C#?)v12^ycwc*~uH9G{SNbnp{?e=kNr~ULNM< zSDS#`^)GXuL=D~*$MoP;-~|_EGg8DXDk=eO*qph+H&NwBehJn)v<42R;?T*%FI)Llo8Fm!W3B*0+u?z5lI(mrMAD z0zM-=h+6g8`Zk&&GGG5f-^laJ=$>0Ms#LpAaAQ=SscDne^3BAE)p7wcRP!4FF?_43! z!f0w9BjB2_dRVl5+QGc*pW2BOz{rcAxck5L-?9I3&F2W)+k}&%ulio2UWk*PxRG|#%m-W3t>sFuH!g;+jOIB12DpHTTKqKhXEH+0RGx(pRB1eZO%c}YZ4lZ;OB8lxh zSkn`{9;kMcAIF0L!DhRM}AX~0$_fSUTsn~I|GNdN@gW9mi13sT&|vl6u&IXF0`N&uZu zgb@UTkdnPe9@P3PqFKc(z0y+Fy(P!$qPlX28Pa1_Zu25#0dt!hq~(B|Vtana-BJ3X zeJE5#q8PB3kQ&S6Yk<}khp3<}HrNv)#Rqau=eM?|rR>_kld1~2ZGirxg6fV34779{ zw~cOu^o(?&g_Yxz^|`rliB~Y5c!gldZt*ozF)0fS?vMf<@zH0$*KbtPM^12;-HKI^!U@gYPOVB>fE^KK~j-;jul!055dcDLCmeHisb=- zO$-eUjh?M8-^{_m_qP63nL$H=4+#O)Nb%^m{-=KZR-Y^GgFrI=tM5hNNJ( z)adBX?Ck9No&N7ivb-pglarHDQZzLI!*s7-@Qjr9)MYST?@m9Om&*)TnkLmo)@k-0(PmBZ!S%4-TUdyNC0(X)SM^D^ zAW75&{IM_Hph>$VJAn_JB=tR+%9i_WMzq2i>2IBvN=+A&^2$mwXS>&Sjc zRZRV?AOBjG&5G&_9&={r>gql3>CsT{Y4qxHZ;W>Aqb{Rsn>Ww63vDJ~yIv3MSI!Dt zv;3zjZR=%mAujeM+byU;pa ze}jZKnk7-cSdstT&8L^N==TMp*E3oLF0?oi^_F_G0@^CpFKF$lH?;=#U^})DiA;O2 zGc(kA1>xh+dBV*t)B&(u8fEh`39!8g>j$wu$&;RO{rn`u6$g`_uD%wx4?Pq%G}u_M41#v4`)a zWtBZ1btzCD!CwMJRDp$Mhu^An`$5(B9DN-=1!iGtIHS0p^| z6%qyD6t60Lz^H67H9IK>=XpWqc+(TB6~bNXaTXN&iqxCR-CR0wjSh|0A99?5bawy9 zY3M@`-+3PKQS{4j$@9~r@6LY;7j4%+j>mD=lfBosRhtt=Kk>EH3O0kA@fPy-M+42v z*4LX7mQ9_2k;8X8guQj^deZ{l4$@$AgY)6AghU7vC*~>}Z3gx?CU2VtEm9gq*T5I{ zohw&yIBfSW2#NOCt7=wt^l!yIZc}|xIfhYl=Xm%_OW+E!YJC^XJpC!&Mnsqb#tpGv z_zVY?WIER2L9`aa~5&t}Z8)kej4 z{~*maTeY5V>fH3*!q3Oq?Ws>gT&4jM!v8Kf(EQ{Zaw?BbPfttQ+cUIO-=RRRkLHUO z$)M+AUxZ0Ms@*(L!~Z~IGL9({FB-oU%<0Pps*CVB};=h4?co5lQs zY()eM53m=#xfA!+hH5GbvMW_w?@Ni5Z+;apYb`xfk1G8}2jc&rF3gl_ZT=tb&M(!> zKcYD##KW3mxjSK+F$t}ijxfT2r)*ImfQX5{|5f6b zgpl^(AC<}vho7t7OwOPFnU*(@59al;uvL>uo`V}d{sY+utNO0NerMN7Ww_t|_Y`5} zrl(I!S}Dnf=ffe@CGp$;i_43CNe6wQxBCxyzu2}%{Qu8_ZnpoY)kNbM zBEVziFb}iwT+$ryy6v(0y{J+%s}x!n3D=<19oi}#7XkYz zMtB3nmp>}WNcRRsafFCFI^D2A!22sa_$T}rrGT~(^q)!Lev%gO1L#2IJFo5qbDoFK z>WgeOaM#@0$Re2#SlQ9t`a8M}9uddYjNcFnj`iz>qP% zSzZ6S+<9fmF z@i&j+D#jOGUzYW_0YWAeaR;TRs{t(Oz+}WOY4`gRr!DK|0_|Gc4y;#z(I-qg!6;R21p>z#q`pIx7) zpokmmz(q*h$~utWxZ6d$R#58jd+#zi!0Dv-`#7njMlPN4=uaN8#5d>?K79xOLfa5~ z11G}hfMZ^I7s=lT6C9jZ_14u;^0%Hts{tzRXQm>$k^pSj+VX>SN{Aj5T_@>AWnbtPVe$~a7!)pJIOJde3|x_dO#z#ZVF;d);z$C z)�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 diff --git a/icons/obj/terminals.dmi b/icons/obj/terminals.dmi index a3ad55381a0380062467746431851aac7187dba7..ab3d80a03c42a2258847fb4b6e0920c637f98885 100644 GIT binary patch literal 18814 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 literal 17900 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 V3%P>;{)-Ff;XUoUC8`!7{|`EGY$pH! From 7932f1f795b322fb9d268121ec3dbd1db03dd0f6 Mon Sep 17 00:00:00 2001 From: Cael_Aislinn Date: Tue, 22 Jan 2013 17:56:57 +1000 Subject: [PATCH 19/19] removed extraneous line in detectivework/evidence.dm, removed constructing closets from plasteel Signed-off-by: Cael_Aislinn --- code/game/objects/items/stacks/sheets/sheet_types.dm | 1 - code/modules/DetectiveWork/evidence.dm | 1 - 2 files changed, 2 deletions(-) diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index e1290a215c..6c62365fdb 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -72,7 +72,6 @@ var/global/list/datum/stack_recipe/metal_recipes = list ( \ */ var/global/list/datum/stack_recipe/plasteel_recipes = list ( \ new/datum/stack_recipe("AI core", /obj/structure/AIcore, 4, time = 50, one_per_turf = 1), \ - new/datum/stack_recipe("Metal closet", /obj/structure/closet, 5, time = 50, one_per_turf = 1), \ new/datum/stack_recipe("Metal crate", /obj/structure/closet/crate, 10, time = 50, one_per_turf = 1), \ ) diff --git a/code/modules/DetectiveWork/evidence.dm b/code/modules/DetectiveWork/evidence.dm index 4ced7b7ce8..80955a8214 100644 --- a/code/modules/DetectiveWork/evidence.dm +++ b/code/modules/DetectiveWork/evidence.dm @@ -8,7 +8,6 @@ item_state = "" w_class = 1 -/obj/item/weapon/evidencebag/afterattack(obj/item/O, mob/user as mob) /obj/item/weapon/evidencebag/afterattack(obj/item/I, mob/user as mob) if(!in_range(I, user)) return