From 88370e9fd6a91acd50119cceecac506fbde146af Mon Sep 17 00:00:00 2001 From: Cael_Aislinn Date: Tue, 1 Jan 2013 16:30:58 +1000 Subject: [PATCH 1/6] modified changelog header to have a link to BEF server Signed-off-by: Cael_Aislinn --- html/changelog.html | 2 ++ 1 file changed, 2 insertions(+) diff --git a/html/changelog.html b/html/changelog.html index 1c8f86afc98..187645d138d 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -46,6 +46,8 @@ Header Section +Visit the bleeding-edge test server at byond://tekkit.fallemmc.com:8000 + From e43e96d296b8838bce4e2f56c5708aed2d6aaba6 Mon Sep 17 00:00:00 2001 From: Cael_Aislinn Date: Thu, 3 Jan 2013 14:38:59 +1000 Subject: [PATCH 2/6] removed exploit where syndicate ids could make players untargettable Signed-off-by: Cael_Aislinn --- code/game/objects/items/weapons/cards_ids.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index f6780570bcb..ba8852dc8c6 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -69,7 +69,7 @@ if(!src.registered_name) //Stop giving the players unsanitized unputs! You are giving ways for players to intentionally crash clients! -Nodrak var t = copytext(sanitize(input(user, "What name would you like to put on this card?", "Agent card name", ishuman(user) ? user.real_name : user.name)),1,26) - if(!t || t == "Unknown" || t == "floor" || t == "wall" || t == "r-wall") //Same as mob/new_player/prefrences.dm + if(!t || t == "Unknown" || t == "floor" || t == "wall" || t == "r-wall" || t == "") //Same as mob/new_player/prefrences.dm alert("Invalid name.") return src.registered_name = t From 17317e3ff63265e9dfd2a337dcaf79b680708d59 Mon Sep 17 00:00:00 2001 From: GauHelldragon Date: Thu, 3 Jan 2013 16:08:46 -0800 Subject: [PATCH 3/6] Fixes closets and destructive analyzer You can no longer load your robot modules into these. Fixes #2138 --- .../structures/crates_lockers/closets/secure/secure_closets.dm | 2 ++ code/modules/research/destructive_analyzer.dm | 2 ++ 2 files changed, 4 insertions(+) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm index 87d964ada16..440c3718846 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm @@ -63,6 +63,8 @@ src.MouseDrop_T(W:affecting, user) //act like they were dragged onto the closet else user << "The locker is too small to stuff [W] into!" + if(isrobot(user)) + return user.drop_item() if(W) W.loc = src.loc diff --git a/code/modules/research/destructive_analyzer.dm b/code/modules/research/destructive_analyzer.dm index 719647ebaba..72430976b84 100644 --- a/code/modules/research/destructive_analyzer.dm +++ b/code/modules/research/destructive_analyzer.dm @@ -78,6 +78,8 @@ Note: Must be placed within 3 tiles of the R&D Console user << "\red The protolathe is busy right now." return if (istype(O, /obj/item) && !loaded_item) + if(isrobot(user)) //Don't put your module items in there! + return if(!O.origin_tech) user << "\red This doesn't seem to have a tech origin!" return From 037f86aaf0259b4d102fe79128a21efe4b2c39ab Mon Sep 17 00:00:00 2001 From: GauHelldragon Date: Thu, 3 Jan 2013 16:12:17 -0800 Subject: [PATCH 4/6] This belongs in bleeding edge, not master! --- code/game/machinery/bots/farmbot.dm | 590 ---------------------------- 1 file changed, 590 deletions(-) delete mode 100644 code/game/machinery/bots/farmbot.dm diff --git a/code/game/machinery/bots/farmbot.dm b/code/game/machinery/bots/farmbot.dm deleted file mode 100644 index ef582351570..00000000000 --- a/code/game/machinery/bots/farmbot.dm +++ /dev/null @@ -1,590 +0,0 @@ -//Farmbots by GauHelldragon - 12/30/2012 -// A new type of buildable aiBot that helps out in hydroponics - -// Made by using a robot arm on a water tank and then adding: -// A plant analyzer, a bucket, a mini-hoe and then a proximity sensor (in that order) - -// Will water, weed and fertilize plants that need it -// When emagged, it will "water", "weed" and "fertilize" humans instead -// Holds up to 10 fertilizers (only the type dispensed by the machines, not chemistry bottles) -// It will fill up it's water tank at a sink when low. - -// The behavior panel can be unlocked with hydroponics access and be modified to disable certain behaviors -// By default, it will ignore weeds and mushrooms, but can be set to tend to these types of plants as well. - - -#define FARMBOT_MODE_WATER 1 -#define FARMBOT_MODE_FERTILIZE 2 -#define FARMBOT_MODE_WEED 3 -#define FARMBOT_MODE_REFILL 4 -#define FARMBOT_MODE_WAITING 5 - -#define FARMBOT_ANIMATION_TIME 25 //How long it takes to use one of the action animations -#define FARMBOT_EMAG_DELAY 60 //How long of a delay after doing one of the emagged attack actions -#define FARMBOT_ACTION_DELAY 35 //How long of a delay after doing one of the normal actions - -/obj/machinery/bot/farmbot - name = "Farmbot" - desc = "The botanist's best friend." - icon = 'aibots.dmi' - icon_state = "farmbot0" - layer = 5.0 - density = 1 - anchored = 0 - health = 50 - maxhealth = 50 - req_access =list(access_hydroponics) - - var/Max_Fertilizers = 10 - - var/setting_water = 1 - var/setting_refill = 1 - var/setting_fertilize = 1 - var/setting_weed = 1 - var/setting_ignoreWeeds = 1 - var/setting_ignoreMushrooms = 1 - - var/atom/target //Current target, can be a human, a hydroponics tray, or a sink - var/mode //Which mode is being used, 0 means it is looking for work - - var/obj/structure/reagent_dispensers/watertank/tank // the water tank that was used to make it, remains inside the bot. - - var/path[] = new() // used for pathing - var/frustration - -/obj/machinery/bot/farmbot/New() - ..() - src.icon_state = "farmbot[src.on]" - spawn (4) - src.botcard = new /obj/item/weapon/card/id(src) - src.botcard.access = req_access - - if ( !tank ) //Should be set as part of making it... but lets check anyway - tank = locate(/obj/structure/reagent_dispensers/watertank/) in contents - if ( !tank ) //An admin must have spawned the farmbot! Better give it a tank. - tank = new /obj/structure/reagent_dispensers/watertank(src) - -/obj/machinery/bot/farmbot/Bump(M as mob|obj) //Leave no door unopened! - spawn(0) - if ((istype(M, /obj/machinery/door)) && (!isnull(src.botcard))) - var/obj/machinery/door/D = M - if (!istype(D, /obj/machinery/door/firedoor) && D.check_access(src.botcard)) - D.open() - src.frustration = 0 - return - return - -/obj/machinery/bot/farmbot/turn_on() - . = ..() - src.icon_state = "farmbot[src.on]" - src.updateUsrDialog() - -/obj/machinery/bot/farmbot/turn_off() - ..() - src.path = new() - src.icon_state = "farmbot[src.on]" - src.updateUsrDialog() - -/obj/machinery/bot/farmbot/attack_paw(mob/user as mob) - return attack_hand(user) - - -/obj/machinery/bot/farmbot/proc/get_total_ferts() - var total_fert = 0 - for (var/obj/item/nutrient/fert in contents) - total_fert++ - return total_fert - -/obj/machinery/bot/farmbot/attack_hand(mob/user as mob) - . = ..() - if (.) - return - var/dat - dat += "Automatic Hyrdoponic Assisting Unit v1.0

" - dat += "Status: [src.on ? "On" : "Off"]
" - - dat += "Water Tank: " - if ( tank ) - dat += "\[[tank.reagents.total_volume]/[tank.reagents.maximum_volume]\]" - else - dat += "Error: Water Tank not Found" - - dat += "
Fertilizer Storage: \[[get_total_ferts()]/[Max_Fertilizers]\]" - - dat += "
Behaviour controls are [src.locked ? "locked" : "unlocked"]
" - if(!src.locked) - dat += "Watering Controls:
" - dat += " Water Plants : [src.setting_water ? "Yes" : "No"]
" - dat += " Refill Watertank : [src.setting_refill ? "Yes" : "No"]
" - dat += "
Fertilizer Controls:
" - dat += " Fertilize Plants : [src.setting_fertilize ? "Yes" : "No"]
" - dat += "
Weeding Controls:
" - dat += " Weed Plants : [src.setting_weed ? "Yes" : "No"]
" - dat += "
Ignore Weeds : [src.setting_ignoreWeeds ? "Yes" : "No"]
" - dat += "Ignore Mushrooms : [src.setting_ignoreMushrooms ? "Yes" : "No"]
" - dat += "
" - - user << browse("Farmbot v1.0 controls[dat]", "window=autofarm") - onclose(user, "autofarm") - return - -/obj/machinery/bot/farmbot/Topic(href, href_list) - if(..()) - return - usr.machine = src - src.add_fingerprint(usr) - if ((href_list["power"]) && (src.allowed(usr))) - if (src.on) - turn_off() - else - turn_on() - - else if((href_list["water"]) && (!src.locked)) - setting_water = !setting_water - else if((href_list["refill"]) && (!src.locked)) - setting_refill = !setting_refill - else if((href_list["fertilize"]) && (!src.locked)) - setting_fertilize = !setting_fertilize - else if((href_list["weed"]) && (!src.locked)) - setting_weed = !setting_weed - else if((href_list["ignoreWeed"]) && (!src.locked)) - setting_ignoreWeeds = !setting_ignoreWeeds - else if((href_list["ignoreMush"]) && (!src.locked)) - setting_ignoreMushrooms = !setting_ignoreMushrooms - else if (href_list["eject"] ) - flick("farmbot_hatch",src) - for (var/obj/item/nutrient/fert in contents) - fert.loc = get_turf(src) - - src.updateUsrDialog() - return - -/obj/machinery/bot/farmbot/attackby(obj/item/weapon/W as obj, mob/user as mob) - if (istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) - if (src.allowed(user)) - src.locked = !src.locked - user << "Controls are now [src.locked ? "locked." : "unlocked."]" - src.updateUsrDialog() - else - user << "\red Access denied." - - else if (istype(W, /obj/item/nutrient)) - if ( get_total_ferts() >= Max_Fertilizers ) - user << "The fertilizer storage is full!" - return - user.drop_item() - W.loc = src - user << "You insert [W]." - flick("farmbot_hatch",src) - src.updateUsrDialog() - return - - else - ..() - -/obj/machinery/bot/farmbot/Emag(mob/user as mob) - ..() - if(user) user << "\red You short out [src]'s plant identifier circuits." - spawn(0) - for(var/mob/O in hearers(src, null)) - O.show_message("\red [src] buzzes oddly!", 1) - flick("farmbot_broke", src) - src.emagged = 1 - src.on = 1 - src.icon_state = "farmbot[src.on]" - target = null - mode = FARMBOT_MODE_WAITING //Give the emagger a chance to get away! 15 seconds should be good. - spawn(150) - mode = 0 - -/obj/machinery/bot/farmbot/explode() - src.on = 0 - visible_message("\red [src] blows apart!", 1) - var/turf/Tsec = get_turf(src) - - new /obj/item/weapon/minihoe(Tsec) - new /obj/item/weapon/reagent_containers/glass/bucket(Tsec) - new /obj/item/device/assembly/prox_sensor(Tsec) - new /obj/item/device/analyzer/plant_analyzer(Tsec) - - if ( tank ) - tank.loc = Tsec - - for ( var/obj/item/nutrient/fert in contents ) - if ( prob(50) ) - fert.loc = Tsec - - if (prob(50)) - new /obj/item/robot_parts/l_arm(Tsec) - - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(3, 1, src) - s.start() - del(src) - return - -/obj/machinery/bot/farmbot/process() - set background = 1 - - if(!src.on) - return - - if ( emagged && prob(1) ) - flick("farmbot_broke", src) - - if ( mode == FARMBOT_MODE_WAITING ) - return - - if ( !mode || !target || !(target in view(7,src)) ) //Don't bother chasing down targets out of view - - mode = 0 - target = null - if ( !find_target() ) - // Couldn't find a target, wait a while before trying again. - mode = FARMBOT_MODE_WAITING - spawn(100) - mode = 0 - return - - if ( mode && target ) - if ( get_dist(target,src) <= 1 || ( emagged && mode == FARMBOT_MODE_FERTILIZE ) ) - // If we are in emagged fertilize mode, we throw the fertilizer, so distance doesn't matter - frustration = 0 - use_farmbot_item() - else - move_to_target() - return - -/obj/machinery/bot/farmbot/proc/use_farmbot_item() - if ( !target ) - mode = 0 - return 0 - - if ( emagged && !ismob(target) ) // Humans are plants! - mode = 0 - target = null - return 0 - - if ( !emagged && !istype(target,/obj/machinery/hydroponics) && !istype(target,/obj/structure/sink) ) // Humans are not plants! - mode = 0 - target = null - return 0 - - if ( mode == FARMBOT_MODE_FERTILIZE ) - //Find which fertilizer to use - var/obj/item/nutrient/fert - for ( var/obj/item/nutrient/nut in contents ) - fert = nut - break - if ( !fert ) - target = null - mode = 0 - return - fertilize(fert) - - if ( mode == FARMBOT_MODE_WEED ) - weed() - - if ( mode == FARMBOT_MODE_WATER ) - water() - - if ( mode == FARMBOT_MODE_REFILL ) - refill() - - - - -/obj/machinery/bot/farmbot/proc/find_target() - if ( emagged ) //Find a human and help them! - for ( var/mob/living/carbon/human/human in view(7,src) ) - if (human.stat == 2) - continue - - var list/options = list(FARMBOT_MODE_WEED) - if ( get_total_ferts() ) - options.Add(FARMBOT_MODE_FERTILIZE) - if ( tank && tank.reagents.total_volume >= 1 ) - options.Add(FARMBOT_MODE_WATER) - mode = pick(options) - target = human - return mode - return 0 - else - if ( setting_refill && tank && tank.reagents.total_volume < 100 ) - for ( var/obj/structure/sink/source in view(7,src) ) - target = source - mode = FARMBOT_MODE_REFILL - return 1 - for ( var/obj/machinery/hydroponics/tray in view(7,src) ) - var newMode = GetNeededMode(tray) - if ( newMode ) - mode = newMode - target = tray - return 1 - return 0 - -/obj/machinery/bot/farmbot/proc/GetNeededMode(obj/machinery/hydroponics/tray) - if ( !tray.planted || tray.dead ) - return 0 - if ( tray.myseed.plant_type == 1 && setting_ignoreWeeds ) - return 0 - if ( tray.myseed.plant_type == 2 && setting_ignoreMushrooms ) - return 0 - - if ( setting_water && tray.waterlevel <= 10 && tank && tank.reagents.total_volume >= 1 ) - return FARMBOT_MODE_WATER - - if ( setting_weed && tray.weedlevel >= 5 ) - return FARMBOT_MODE_WEED - - if ( setting_fertilize && tray.nutrilevel <= 2 && get_total_ferts() ) - return FARMBOT_MODE_FERTILIZE - - return 0 - -/obj/machinery/bot/farmbot/proc/move_to_target() - //Mostly copied from medibot code. - - if(src.frustration > 8) - target = null - mode = 0 - frustration = 0 - src.path = new() - if(src.target && (src.path.len) && (get_dist(src.target,src.path[src.path.len]) > 2)) - src.path = new() - if(src.target && src.path.len == 0 && (get_dist(src,src.target) > 1)) - spawn(0) - var/turf/dest = get_step_towards(target,src) //Can't pathfind to a tray, as it is dense, so pathfind to the spot next to the tray - - src.path = AStar(src.loc, dest, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 30,id=botcard) - src.path = reverselist(src.path) - if(src.path.len == 0) - for ( var/turf/spot in orange(1,target) ) //The closest one is unpathable, try the other spots - if ( spot == dest ) //We already tried this spot - continue - if ( spot.density ) - continue - src.path = AStar(src.loc, spot, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 30,id=botcard) - src.path = reverselist(src.path) - if ( src.path.len > 0 ) - break - - if ( src.path.len == 0 ) - target = null - mode = 0 - return - - if(src.path.len > 0 && src.target) - step_to(src, src.path[1]) - src.path -= src.path[1] - spawn(3) - if(src.path.len) - step_to(src, src.path[1]) - src.path -= src.path[1] - - if(src.path.len > 8 && src.target) - src.frustration++ - - -/obj/machinery/bot/farmbot/proc/fertilize(obj/item/nutrient/fert) - if ( !fert ) - target = null - mode = 0 - return 0 - - if ( emagged ) // Warning, hungry humans detected: throw fertilizer at them - spawn(0) - fert.loc = src.loc - fert.throw_at(target, 16, 3) - src.visible_message("\red [src] launches [fert.name] at [target.name]!") - flick("farmbot_broke", src) - spawn (FARMBOT_EMAG_DELAY) - mode = 0 - target = null - return 1 - - else // feed them plants~ - var /obj/machinery/hydroponics/tray = target - tray.nutrilevel = 10 - tray.yieldmod = fert.yieldmod - tray.mutmod = fert.mutmod - del fert - tray.updateicon() - icon_state = "farmbot_fertile" - mode = FARMBOT_MODE_WAITING - - spawn (FARMBOT_ACTION_DELAY) - mode = 0 - target = null - spawn (FARMBOT_ANIMATION_TIME) - icon_state = "farmbot[src.on]" - return 1 - -/obj/machinery/bot/farmbot/proc/weed() - icon_state = "farmbot_hoe" - spawn(FARMBOT_ANIMATION_TIME) - icon_state = "farmbot[src.on]" - - if ( emagged ) // Warning, humans infested with weeds! - mode = FARMBOT_MODE_WAITING - spawn(FARMBOT_EMAG_DELAY) - mode = 0 - - if ( prob(50) ) // better luck next time little guy - src.visible_message("\red [src] swings wildly at [target] with a minihoe, missing completely!") - - else // yayyy take that weeds~ - var/attackVerb = pick("slashed", "sliced", "cut", "clawed") - var /mob/living/carbon/human/human = target - - src.visible_message("\red [src] [attackVerb] [human]!") - var/damage = 5 - var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg") - var/datum/organ/external/affecting = human.get_organ(ran_zone(dam_zone)) - var/armor = human.run_armor_check(affecting, "melee") - human.apply_damage(damage,BRUTE,affecting,armor) - - else // warning, plants infested with weeds! - mode = FARMBOT_MODE_WAITING - spawn(FARMBOT_ACTION_DELAY) - mode = 0 - - var /obj/machinery/hydroponics/tray = target - tray.weedlevel = 0 - tray.updateicon() - -/obj/machinery/bot/farmbot/proc/water() - if ( !tank || tank.reagents.total_volume < 1 ) - mode = 0 - target = null - return 0 - - icon_state = "farmbot_water" - spawn(FARMBOT_ANIMATION_TIME) - icon_state = "farmbot[src.on]" - - if ( emagged ) // warning, humans are thirsty! - var splashAmount = min(70,tank.reagents.total_volume) - src.visible_message("\red [src] splashes [target] with a bucket of water!") - playsound(src.loc, 'sound/effects/slosh.ogg', 25, 1) - if ( prob(50) ) - tank.reagents.reaction(target, TOUCH) //splash the human! - else - tank.reagents.reaction(target.loc, TOUCH) //splash the human's roots! - spawn(5) - tank.reagents.remove_any(splashAmount) - - mode = FARMBOT_MODE_WAITING - spawn(FARMBOT_EMAG_DELAY) - mode = 0 - else - var /obj/machinery/hydroponics/tray = target - var/b_amount = tank.reagents.get_reagent_amount("water") - if(b_amount > 0 && tray.waterlevel < 100) - if(b_amount + tray.waterlevel > 100) - b_amount = 100 - tray.waterlevel - tank.reagents.remove_reagent("water", b_amount) - tray.waterlevel += b_amount - playsound(src.loc, 'sound/effects/slosh.ogg', 25, 1) - - // Toxicity dilutation code. The more water you put in, the lesser the toxin concentration. - tray.toxic -= round(b_amount/4) - if (tray.toxic < 0 ) // Make sure it won't go overboard - tray.toxic = 0 - - tray.updateicon() - mode = FARMBOT_MODE_WAITING - spawn(FARMBOT_ACTION_DELAY) - mode = 0 - -/obj/machinery/bot/farmbot/proc/refill() - if ( !tank || !tank.reagents.total_volume > 600 || !istype(target,/obj/structure/sink) ) - mode = 0 - target = null - return - - mode = FARMBOT_MODE_WAITING - playsound(src.loc, 'sound/effects/slosh.ogg', 25, 1) - src.visible_message("\blue [src] starts filling it's tank from [target].") - spawn(300) - src.visible_message("\blue [src] finishes filling it's tank.") - src.mode = 0 - tank.reagents.add_reagent("water", tank.reagents.maximum_volume - tank.reagents.total_volume ) - playsound(src.loc, 'sound/effects/slosh.ogg', 25, 1) - - -/obj/item/weapon/farmbot_arm_assembly - name = "water tank/robot arm assembly" - desc = "A water tank with a robot arm permanently grafted to it." - icon = 'aibots.dmi' - icon_state = "water_arm" - var/build_step = 0 - var/created_name = "Farmbot" //To preserve the name if it's a unique farmbot I guess - w_class = 3.0 - - New() - ..() - spawn(4) // If an admin spawned it, it won't have a watertank it, so lets make one for em! - var tank = locate(/obj/structure/reagent_dispensers/watertank) in contents - if( !tank ) - new /obj/structure/reagent_dispensers/watertank(src) - - -/obj/structure/reagent_dispensers/watertank/attackby(var/obj/item/robot_parts/S, mob/user as mob) - - if ((!istype(S, /obj/item/robot_parts/l_arm)) && (!istype(S, /obj/item/robot_parts/r_arm))) - ..() - return - - //Making a farmbot! - - var/obj/item/weapon/farmbot_arm_assembly/A = new /obj/item/weapon/farmbot_arm_assembly - - A.loc = src.loc - A.layer = 20 - user << "You add the robot arm to the [src]" - src.loc = A //Place the water tank into the assembly, it will be needed for the finished bot - - del(S) - -/obj/item/weapon/farmbot_arm_assembly/attackby(obj/item/weapon/W as obj, mob/user as mob) - ..() - if((istype(W, /obj/item/device/analyzer/plant_analyzer)) && (!src.build_step)) - src.build_step++ - user << "You add the plant analyzer to [src]!" - src.name = "farmbot assembly" - del(W) - - else if(( istype(W, /obj/item/weapon/reagent_containers/glass/bucket)) && (src.build_step == 1)) - src.build_step++ - user << "You add a bucket to [src]!" - src.name = "farmbot assembly with bucket" - del(W) - - else if(( istype(W, /obj/item/weapon/minihoe)) && (src.build_step == 2)) - src.build_step++ - user << "You add a minihoe to [src]!" - src.name = "farmbot assembly with bucket and minihoe" - del(W) - - else if((isprox(W)) && (src.build_step == 3)) - src.build_step++ - user << "You complete the Farmbot! Beep boop." - var/obj/machinery/bot/farmbot/S = new /obj/machinery/bot/farmbot - for ( var/obj/structure/reagent_dispensers/watertank/wTank in src.contents ) - wTank.loc = S - S.tank = wTank - S.loc = get_turf(src) - S.name = src.created_name - del(W) - del(src) - - else if(istype(W, /obj/item/weapon/pen)) - var/t = input(user, "Enter new robot name", src.name, src.created_name) as text - t = copytext(sanitize(t), 1, MAX_NAME_LEN) - if (!t) - return - if (!in_range(src, usr) && src.loc != usr) - return - - src.created_name = t From 4f93d392f4fa23433011eda7a0b3c82668be0213 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Sun, 6 Jan 2013 04:04:25 -0800 Subject: [PATCH 5/6] Added sprites and basic code for positronic brains. --- code/game/machinery/computer/ai_core.dm | 10 +++++----- code/game/mecha/mecha.dm | 4 ++-- code/game/objects/items/robot/robot_parts.dm | 14 +++++++------- code/modules/mob/living/carbon/brain/say.dm | 2 +- icons/obj/assemblies.dmi | Bin 17595 -> 24820 bytes 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/code/game/machinery/computer/ai_core.dm b/code/game/machinery/computer/ai_core.dm index 616a62c78b6..c3e0941b101 100644 --- a/code/game/machinery/computer/ai_core.dm +++ b/code/game/machinery/computer/ai_core.dm @@ -117,16 +117,16 @@ laws.add_inherent_law(M.newFreeFormLaw) usr << "Added a freeform law." - if(istype(P, /obj/item/device/mmi)) + if(istype(P, /obj/item/device/mmi) || istype(P, /obj/item/device/posibrain)) if(!P:brainmob) - user << "\red Sticking an empty MMI into the frame would sort of defeat the purpose." + user << "\red Sticking an empty [P] into the frame would sort of defeat the purpose." return if(P:brainmob.stat == 2) - user << "\red Sticking a dead brain into the frame would sort of defeat the purpose." + user << "\red Sticking a dead [P] into the frame would sort of defeat the purpose." return if(jobban_isbanned(P:brainmob, "AI")) - user << "\red This MMI does not seem to fit." + user << "\red This [P] does not seem to fit." return if(P:brainmob.mind) @@ -136,7 +136,7 @@ user.drop_item() P.loc = src brain = P - usr << "Added a brain." + usr << "Added [P]." icon_state = "3b" if(istype(P, /obj/item/weapon/crowbar) && brain) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 84fd6c7ae9f..f3e14d0b291 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -668,7 +668,7 @@ /obj/mecha/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(istype(W, /obj/item/device/mmi)) + if(istype(W, /obj/item/device/mmi) || istype(W, /obj/item/device/posibrain)) if(mmi_move_inside(W,user)) user << "[src]-MMI interface initialized successfuly" else @@ -1804,4 +1804,4 @@ //src.health = initial(src.health)/2.2 //src.check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) return -*/ +*/ diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index acd210f5ddc..189aad862a7 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -161,14 +161,14 @@ else user << "\blue You need to attach a flash to it first!" - if(istype(W, /obj/item/device/mmi)) + if(istype(W, /obj/item/device/mmi) || istype(W, /obj/item/device/posibrain)) var/obj/item/device/mmi/M = W if(check_completion()) if(!istype(loc,/turf)) - user << "\red You can't put the MMI in, the frame has to be standing on the ground to be perfectly precise." + user << "\red You can't put the [W] in, the frame has to be standing on the ground to be perfectly precise." return if(!M.brainmob) - user << "\red Sticking an empty MMI into the frame would sort of defeat the purpose." + user << "\red Sticking an empty [W] into the frame would sort of defeat the purpose." return if(!M.brainmob.key) var/ghost_can_reenter = 0 @@ -178,19 +178,19 @@ ghost_can_reenter = 1 break if(!ghost_can_reenter) - user << "The mmi indicates that their mind is completely unresponsive; there's no point." + user << "The [W] is completely unresponsive; there's no point." return if(M.brainmob.stat == DEAD) - user << "\red Sticking a dead brain into the frame would sort of defeat the purpose." + user << "\red Sticking a dead [W] into the frame would sort of defeat the purpose." return if(M.brainmob.mind in ticker.mode.head_revolutionaries) - user << "\red The frame's firmware lets out a shrill sound, and flashes 'Abnormal Memory Engram'. It refuses to accept the MMI." + user << "\red The frame's firmware lets out a shrill sound, and flashes 'Abnormal Memory Engram'. It refuses to accept the [W]." return if(jobban_isbanned(M.brainmob, "Cyborg")) - user << "\red This MMI does not seem to fit." + user << "\red This [W] does not seem to fit." return var/mob/living/silicon/robot/O = new /mob/living/silicon/robot(get_turf(loc)) diff --git a/code/modules/mob/living/carbon/brain/say.dm b/code/modules/mob/living/carbon/brain/say.dm index 4b8174cc21b..c4d9a865da2 100644 --- a/code/modules/mob/living/carbon/brain/say.dm +++ b/code/modules/mob/living/carbon/brain/say.dm @@ -2,7 +2,7 @@ if (silent) return - if(!(container && istype(container, /obj/item/device/mmi))) + if(!(container && (istype(container, /obj/item/device/mmi) || istype(container, /obj/item/device/posibrain)))) return //No MMI, can't speak, bucko./N else if(prob(emp_damage*4)) diff --git a/icons/obj/assemblies.dmi b/icons/obj/assemblies.dmi index a0c27d7816b3e745a5d4935d05a68c82305761f0..a4a72b0a3803fccd72d67526a99b40dd2d5bde68 100644 GIT binary patch literal 24820 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 Date: Sun, 6 Jan 2013 10:53:29 -0800 Subject: [PATCH 6/6] Forgot the actual positronic brain file. Yay. --- .../mob/living/carbon/brain/posibrain.dm | 118 ++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 code/modules/mob/living/carbon/brain/posibrain.dm diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm new file mode 100644 index 00000000000..aad1b6ef253 --- /dev/null +++ b/code/modules/mob/living/carbon/brain/posibrain.dm @@ -0,0 +1,118 @@ +/obj/item/device/posibrain + name = "positronic brain" + desc = "A cube of shining metal, four inches to a side and covered in shallow grooves." + icon = 'icons/obj/assemblies.dmi' + icon_state = "posibrain" + w_class = 3 + origin_tech = "engineering=4;materials=4;bluespace=2;programming=6" + + var/list/construction_cost = list("metal"=500,"glass"=500,"silver"=200,"gold"=200,"plasma"=100,"diamond"=10) + var/construction_time = 75 + var/searching = 0 + var/askDelay = 10 * 60 * 1 + + req_access = list(access_robotics) + var/locked = 0 + var/mob/living/carbon/brain/brainmob = null//The current occupant. + var/obj/mecha = null//This does not appear to be used outside of reference in mecha.dm. + + attack_self(mob/user as mob) + if(!brainmob && searching == 0) + //Start the process of searching for a new user. + user << "\blue You carefully locate the manual activation switch and start the positronic brain's boot process." + icon_state = "posibrain-searching" + src.searching = 1 + src.request_player() + + proc/request_player() + for(var/mob/dead/observer/O in player_list) + if(jobban_isbanned(O, "pAI")) + continue + if(O.client) + if(O.client.be_pai) + question(O.client) + + proc/question(var/client/C) + spawn(0) + if(!C) return + var/response = alert(C, "Someone is requesting a personality for a positronic brain. Would you like to play as one?", "Positronic brain request", "Yes", "No", "Never for this round") + if(!C || brainmob) return //handle logouts that happen whilst the alert is waiting for a response, and responses issued after a brain has been located. + if(response == "Yes") + transfer_personality(C.mob) + else if (response == "Never for this round") + C.be_pai = 0 + + + proc/transfer_personality(var/mob/candidate) + + var/mob/living/carbon/brain/B = new(src) + + src.searching = 0 + + src.brainmob = B + src.brainmob.mind = candidate.mind + + src.brainmob.name = "PBU-[rand(100, 999)]" + src.brainmob.real_name = "PBU-[rand(100, 999)]" + src.brainmob.loc = src + src.brainmob.container = src + src.brainmob.stat = 0 + src.brainmob.silent = 0 + src.brainmob.brain_op_stage = 4.0 + src.brainmob.key = candidate.key + + dead_mob_list -= src.brainmob + living_mob_list += src.brainmob + + var/turf/T = get_turf_or_move(src.loc) + for (var/mob/M in viewers(T)) + M.show_message("\blue The positronic brain chimes quietly.") + icon_state = "posibrain-occupied" + + proc/reset_search() //We give the players sixty seconds to decide, then reset the timer. + + if(brainmob) return + + src.searching = 0 + icon_state = "posibrain" + + var/turf/T = get_turf_or_move(src.loc) + for (var/mob/M in viewers(T)) + M.show_message("\blue The positronic brain buzzes quietly, and the golden lights fade away. Perhaps you could try again?") + +/obj/item/device/posibrain/examine() + + set src in oview() + + if(!usr || !src) return + if( (usr.sdisabilities & BLIND || usr.blinded || usr.stat) && !istype(usr,/mob/dead/observer) ) + usr << "Something is there but you can't see it." + return + + var/msg = "*---------*\nThis is \icon[src] \a [src]!\n[desc]\n" + msg += "" + + if(src.brainmob) + switch(src.brainmob.stat) + if(CONSCIOUS) + if(!src.brainmob.client) msg += "It appears to be in stand-by mode.\n" //afk + if(UNCONSCIOUS) msg += "It doesn't seem to be responsive.\n" + if(DEAD) msg += "It appears to be completely inactive.\n" + else + msg += "[desc]\n" + msg += "*---------*" + usr << msg + return + +/obj/item/device/posibrain/emp_act(severity) + if(!brainmob) + return + else + switch(severity) + if(1) + brainmob.emp_damage += rand(20,30) + if(2) + brainmob.emp_damage += rand(10,20) + if(3) + brainmob.emp_damage += rand(0,10) + ..() \ No newline at end of file