From 1cc3e3371464ae0c7258de587c8df55382fab3e4 Mon Sep 17 00:00:00 2001 From: AnturK Date: Mon, 4 Dec 2017 12:14:08 +0100 Subject: [PATCH 1/2] Holorecord disks. --- code/datums/holocall.dm | 128 ++++++++++++ code/game/machinery/hologram.dm | 195 +++++++++++++++++- .../research/designs/autolathe_designs.dm | 19 ++ icons/obj/module.dmi | Bin 15674 -> 16071 bytes 4 files changed, 339 insertions(+), 3 deletions(-) diff --git a/code/datums/holocall.dm b/code/datums/holocall.dm index abad0dba1d..75abc87080 100644 --- a/code/datums/holocall.dm +++ b/code/datums/holocall.dm @@ -1,5 +1,14 @@ #define HOLOPAD_MAX_DIAL_TIME 200 +#define HOLORECORD_DELAY "delay" +#define HOLORECORD_SAY "say" +#define HOLORECORD_SOUND "sound" +#define HOLORECORD_LANGUAGE "lang" +#define HOLORECORD_PRESET "preset" +#define HOLORECORD_RENAME "rename" + +#define HOLORECORD_MAX_LENGTH 200 + /mob/camera/aiEye/remote/holo/setLoc() . = ..() var/obj/machinery/holopad/H = origin @@ -184,3 +193,122 @@ /datum/action/innate/end_holocall/Activate() hcall.Disconnect(hcall.calling_holopad) + + +//RECORDS +/datum/holorecord + var/caller_name = "Unknown" //Caller name + var/image/caller_image + var/list/entries = list() + var/language = /datum/language/common //Initial language, can be changed by HOLORECORD_LANGUAGE entries + +/obj/item/disk/holodisk + name = "holorecord disk" + desc = "Stores recorder holocalls." + icon_state = "holodisk" + var/datum/holorecord/record + //Preset variables + var/preset_image_type + var/preset_record_text + +/obj/item/disk/holodisk/Initialize(mapload) + . = ..() + if(preset_record_text) + build_record() + +/obj/item/disk/holodisk/Destroy() + QDEL_NULL(record) + return ..() + +/obj/item/disk/holodisk/proc/build_record() + record = new + var/list/lines = splittext(preset_record_text,"\n") + for(var/line in lines) + var/prepared_line = trim(line) + if(!length(prepared_line)) + continue + var/splitpoint = findtext(prepared_line," ") + if(!splitpoint) + continue + var/command = copytext(prepared_line,1,splitpoint) + var/value = copytext(prepared_line,splitpoint+1) + switch(command) + if("DELAY") + var/delay_value = text2num(value) + if(!delay_value) + continue + record.entries += list(list(HOLORECORD_DELAY,delay_value)) + if("NAME") + if(!record.caller_name) + record.caller_name = value + else + record.entries += list(list(HOLORECORD_RENAME,value)) + if("SAY") + record.entries += list(list(HOLORECORD_SAY,value)) + if("SOUND") + record.entries += list(list(HOLORECORD_SOUND,value)) + if("LANGUAGE") + var/lang_type = text2path(value) + if(ispath(lang_type,/datum/language)) + record.entries += list(list(HOLORECORD_LANGUAGE,lang_type)) + if("PRESET") + var/preset_type = text2path(value) + if(ispath(preset_type,/datum/preset_holoimage)) + record.entries += list(list(HOLORECORD_PRESET,preset_type)) + if(!preset_image_type) + record.caller_image = image('icons/mob/animal.dmi',"old") + else + var/datum/preset_holoimage/H = new preset_image_type + record.caller_image = H.build_image() + +//These build caller image from outfit and some additional data, for use by mappers for ruin holorecords +/datum/preset_holoimage + var/nonhuman_mobtype //Fill this if you just want something nonhuman + var/outfit_type + var/species_type = /datum/species/human + +/datum/preset_holoimage/proc/build_image() + if(nonhuman_mobtype) + var/mob/living/L = nonhuman_mobtype + . = image(initial(L.icon),initial(L.icon_state)) + else + var/mob/living/carbon/human/dummy/mannequin = generate_or_wait_for_human_dummy("HOLODISK_PRESET") + if(species_type) + mannequin.set_species(species_type) + if(outfit_type) + mannequin.equipOutfit(outfit_type,TRUE) + mannequin.setDir(SOUTH) + COMPILE_OVERLAYS(mannequin) + . = getFlatIcon(mannequin) + unset_busy_human_dummy("HOLODISK_PRESET") + +/obj/item/disk/holodisk/example + preset_image_type = /datum/preset_holoimage/clown + preset_record_text = {" + NAME Clown + DELAY 10 + SAY Why did the chaplain cross the maint ? + DELAY 20 + SAY He wanted to get to the other side! + SOUND clownstep + DELAY 30 + LANGUAGE /datum/language/narsie + SAY Helped him get there! + DELAY 10 + SAY ALSO IM SECRETLY A GORILLA + DELAY 10 + PRESET /datum/preset_holoimage/gorilla + NAME Gorilla + LANGUAGE /datum/language/common + SAY OOGA + DELAY 20"} + +/datum/preset_holoimage/engineer + outfit_type = /datum/outfit/job/engineer/gloved/rig + +/datum/preset_holoimage/gorilla + nonhuman_mobtype = /mob/living/simple_animal/hostile/gorilla + +/datum/preset_holoimage/clown + outfit_type = /datum/outfit/job/clown + diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index afc463a60e..d6d8c93ed1 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -47,6 +47,12 @@ Possible to do for anyone motivated enough: var/temp = "" var/list/holo_calls //array of /datum/holocalls var/datum/holocall/outgoing_call //do not modify the datums only check and call the public procs + var/obj/item/disk/holodisk/disk //Record disk + var/replay_mode = FALSE //currently replaying a recording + var/record_mode = FALSE //currently recording + var/record_start = 0 //recording start time + var/record_user //user that inititiated the recording + var/obj/effect/overlay/holo_pad_hologram/replay_holo //replay hologram var/static/force_answer_call = FALSE //Calls will be automatically answered after a couple rings, here for debugging var/static/list/holopads = list() @@ -64,6 +70,14 @@ Possible to do for anyone motivated enough: for (var/I in masters) clear_holo(I) + + if(replay_mode) + replay_stop() + if(record_mode) + record_stop() + + QDEL_NULL(disk) + holopads -= src return ..() @@ -72,6 +86,10 @@ Possible to do for anyone motivated enough: stat &= ~NOPOWER else stat |= NOPOWER + if(replay_mode) + replay_stop() + if(record_mode) + record_stop() if(outgoing_call) outgoing_call.ConnectionFailure(src) @@ -101,6 +119,18 @@ Possible to do for anyone motivated enough: if(default_deconstruction_crowbar(P)) return + + if(istype(P,/obj/item/disk/holodisk)) + if(disk) + to_chat(user,"There's already a disk inside [src]") + return + if (!user.transferItemToLoc(P,src)) + return + to_chat(user,"You insert [P] into [src]") + disk = P + updateDialog() + return + return ..() /obj/machinery/holopad/AltClick(mob/living/carbon/human/user) @@ -122,6 +152,17 @@ Possible to do for anyone motivated enough: else dat = "Request an AI's presence.
" dat += "Call another holopad.
" + if(disk) + if(disk.record) + //Replay + dat += "Replay disk recording.
" + //Clear + dat += "Clear disk recording.
" + else + //Record + dat += "Start new recording.
" + //Eject + dat += "Eject disk.
" if(LAZYLEN(holo_calls)) dat += "=====================================================
" @@ -145,7 +186,7 @@ Possible to do for anyone motivated enough: dat += "Disconnect call from [HC.user].
" - var/datum/browser/popup = new(user, "holopad", name, 300, 130) + var/datum/browser/popup = new(user, "holopad", name, 300, 150) popup.set_content(dat) popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) popup.open() @@ -215,6 +256,22 @@ Possible to do for anyone motivated enough: temp = "" if(outgoing_call) outgoing_call.Disconnect() + + else if(href_list["disk_eject"]) + if(disk && !replay_mode) + disk.forceMove(drop_location()) + disk = null + + else if(href_list["replay_stop"]) + replay_stop() + else if(href_list["replay_start"]) + replay_start() + else if(href_list["record_start"]) + record_start(usr) + else if(href_list["record_stop"]) + record_stop() + else if(href_list["record_clear"]) + record_clear() updateDialog() @@ -269,6 +326,7 @@ Possible to do for anyone motivated enough: else playsound(src, 'sound/machines/twobeep.ogg', 100) //bring, bring! + /obj/machinery/holopad/proc/activate_holo(mob/living/user) var/mob/living/silicon/ai/AI = user if(!istype(AI)) @@ -321,15 +379,24 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ if(outgoing_call && speaker == outgoing_call.user) outgoing_call.hologram.say(raw_message) + if(record_mode && speaker == record_user) + record_message(speaker,raw_message,message_language) + /obj/machinery/holopad/proc/SetLightsAndPower() var/total_users = masters.len + LAZYLEN(holo_calls) use_power = total_users > 0 ? ACTIVE_POWER_USE : IDLE_POWER_USE active_power_usage = HOLOPAD_PASSIVE_POWER_USAGE + (HOLOGRAM_POWER_USAGE * total_users) - if(total_users) + if(total_users || replay_mode) set_light(2) - icon_state = "holopad1" else set_light(0) + update_icon() + +/obj/machinery/holopad/update_icon() + var/total_users = masters.len + LAZYLEN(holo_calls) + if(total_users || replay_mode) + icon_state = "holopad1" + else icon_state = "holopad0" /obj/machinery/holopad/proc/set_holo(mob/living/user, var/obj/effect/overlay/holo_pad_hologram/h) @@ -365,6 +432,128 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ clear_holo(user) return TRUE +// RECORDED MESSAGES + +/obj/machinery/holopad/proc/setup_replay_holo(datum/holorecord/record) + var/obj/effect/overlay/holo_pad_hologram/Hologram = new(loc)//Spawn a blank effect at the location. + Hologram.add_overlay(record.caller_image) + Hologram.alpha = 170 + Hologram.add_atom_colour("#77abff", FIXED_COLOUR_PRIORITY) + Hologram.dir = SOUTH //for now + Hologram.grant_all_languages(omnitongue=TRUE) + var/datum/language_holder/holder = Hologram.get_language_holder() + holder.selected_default_language = record.language + Hologram.mouse_opacity = MOUSE_OPACITY_TRANSPARENT//So you can't click on it. + Hologram.layer = FLY_LAYER//Above all the other objects/mobs. Or the vast majority of them. + Hologram.anchored = TRUE//So space wind cannot drag it. + Hologram.name = "[record.caller_name] (Hologram)"//If someone decides to right click. + Hologram.set_light(2) //hologram lighting + visible_message("A holographic image of [record.caller_name] flickers to life before your eyes!") + return Hologram + +/obj/machinery/holopad/proc/replay_start() + if(!replay_mode) + replay_mode = TRUE + replay_holo = setup_replay_holo(disk.record) + temp = "Replaying...
" + temp += "End replay." + SetLightsAndPower() + replay_entry(1) + return + +/obj/machinery/holopad/proc/replay_stop() + if(replay_mode) + replay_mode = FALSE + temp = null + QDEL_NULL(replay_holo) + SetLightsAndPower() + updateDialog() + +/obj/machinery/holopad/proc/record_start(mob/living/user) + if(!user || !disk || disk.record) + return + disk.record = new + record_mode = TRUE + record_start = world.time + record_user = user + disk.record.caller_image = get_record_icon(user) + temp = "Recording...
" + temp += "End recording." + +/obj/machinery/holopad/proc/get_record_icon(mob/living/user) + var/olddir = user.dir + user.setDir(SOUTH) + . = getFlatIcon(user) + user.setDir(olddir) + +/obj/machinery/holopad/proc/record_message(mob/living/speaker,message,language) + if(!record_mode) + return + //make this command so you can have multiple languages in single record + if(!disk.record.caller_name && istype(speaker)) + disk.record.caller_name = speaker.name + if(!disk.record.language) + disk.record.language = language + else if(language != disk.record.language) + disk.record.entries += list(list(HOLORECORD_LANGUAGE,language)) + + var/current_delay = 0 + for(var/E in disk.record.entries) + var/list/entry = E + if(entry[1] != HOLORECORD_DELAY) + continue + current_delay += entry[2] + + var/time_delta = world.time - record_start - current_delay + + if(time_delta >= 1) + disk.record.entries += list(list(HOLORECORD_DELAY,time_delta)) + disk.record.entries += list(list(HOLORECORD_SAY,message)) + if(disk.record.entries.len >= HOLORECORD_MAX_LENGTH) + record_stop() + +/obj/machinery/holopad/proc/replay_entry(entry_number) + if(!replay_mode) + return + if(disk.record.entries.len < entry_number) + replay_stop() + return + var/list/entry = disk.record.entries[entry_number] + var/command = entry[1] + switch(command) + if(HOLORECORD_SAY) + var/message = entry[2] + if(replay_holo) + replay_holo.say(message) + if(HOLORECORD_SOUND) + playsound(src,entry[2],50,1) + if(HOLORECORD_DELAY) + addtimer(CALLBACK(src,.proc/replay_entry,entry_number+1),entry[2]) + return + if(HOLORECORD_LANGUAGE) + var/datum/language_holder/holder = replay_holo.get_language_holder() + holder.selected_default_language = entry[2] + if(HOLORECORD_PRESET) + var/preset_type = entry[2] + var/datum/preset_holoimage/H = new preset_type + replay_holo.cut_overlays() + replay_holo.add_overlay(H.build_image()) + if(HOLORECORD_RENAME) + replay_holo.name = entry[2] + " (Hologram)" + .(entry_number+1) + +/obj/machinery/holopad/proc/record_stop() + if(record_mode) + record_mode = FALSE + temp = null + record_user = null + updateDialog() + +/obj/machinery/holopad/proc/record_clear() + if(disk && disk.record) + QDEL_NULL(disk.record) + updateDialog() + /obj/effect/overlay/holo_pad_hologram var/mob/living/Impersonation var/datum/holocall/HC diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index 03424346e8..1c0c12a02b 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -799,3 +799,22 @@ materials = list(MAT_METAL = 300, MAT_GLASS = 200) build_path = /obj/item/device/slime_scanner category = list("initial", "Misc") +<<<<<<< HEAD +======= + +/datum/design/miniature_power_cell + name = "Light Fixture Battery" + id = "miniature_power_cell" + build_type = AUTOLATHE + materials = list(MAT_GLASS = 20) + build_path = /obj/item/stock_parts/cell/emergency_light + category = list("initial", "Electronics") + +/datum/design/holodisk + name = "Holodisk" + id = "holodisk" + build_type = AUTOLATHE + materials = list(MAT_METAL = 1000) + build_path = /obj/item/disk/holodisk + category = list("initial", "Misc") +>>>>>>> 78fe2bc... Holorecord disks. (#32868) diff --git a/icons/obj/module.dmi b/icons/obj/module.dmi index c24f7c4c16c4fefddbb43a5faaa71c469fb45556..f5bd612c225e248c35ce085aae9c27cdddeb944b 100644 GIT binary patch literal 16071 zcmcJ$by!@@vo1O~1P>%=fItESf_w1b!9$P)hu{H1a2p0la0$WPg1ZNI*MZ7`2u-z5c@NHxSi{(LgPp(nFpWIxm+HV#V=m z^iM7WzMsiKM^%2e>0`Q;f(A#dYuzr?o-wfs z@O7ZpLb6Bqa8wWnl;`zSrA$=MMQca}(h}_@_TR~ z%1|*t^dg=t0q^r<&}*q!)(XQLI&&Ose=5$0?2@NnJ0JYya3eP?-ceY=>LPtFv{7av z$$0j{&nR1n&c6V~r6s9{k5?MrZz0jG%PZLs@eyoBHF#Ib`{U+?#k2F+4n>JDB}4Nh z){9YknT}~na++mNMb6)6Qlq_Ub-OMV8ttiyOgNLuFN#5hSv}b5& z*wjAI?Qz^A)3R~qzK}Xu8=$yQESn9Qa2Bf)mw;-Ke`5NeKLzIS6t?X(1H%jAgBkNK zO<1lqyi8KB$)&S@x<2j#Ea}f2W{?1eUypgDq)80IDYF=G%jF0(NHAv^u~~5g z>_{=lF+1xb-ne67n*N-q_fBpzH^(PbH3XF|mwL(idF+eYLN+%yoAPa}Q~H7kY2G4C zL)w}z9GedXpRAtt)2n~D$}p45Oiz_oR;CaUq2lLvy|6Q|Z%*88cBhGSRB|F}tl^#0 ztCuoo<$QT`&s&Bn8+xykv?@NFe+-H%lw!DaAEVEy^IaGfSDCJSYJ zaY23?gizRq$39&~Fz1I_eEj%%FxYrC&k5%?zVYmuz)18QgY)JDzr}3}=cARC^Snjk zDPq5ZrBuI478;Kw&mY4lN-?L<`Q!b@*ie>DCUouyMxbp=QNzth3|V?lRcg5Sv32|* zl)fGjNS#%{JS2avKxa!ZEfqR1{LpUubeCA34L-Uq`IhkJ`8$l`j|o(ZW1%k>6qzXI z^~$QhtMxWNdUwkJ!bB%YLbuqC>lD#|YMRD=K&_8^KX)8J*|d~G1%0_k9M3ieRnlL@ z^BIfw1t)%VdP*_5v@~)PEHSRUPV^%trc;@AV~E)5WSPqNTcF=+UU}fg_BNmA*~Zs8 z{iaH4*jDi}=u`QE>ggGJR;Yzt^T1#-R!7_8x!H-wh;h6nXLU|d!TO2G$=<$dEJVO_ z5fxSsw(=vBQiOQG-e#Fjh$O5tWR@tl{dTXScRH^+Z=><&b9@86K`hpzCH1ov59vs=wxV}Ty@QQo(J z09w0SKnCxM$bgymmcDN++#`yMcubvAd8WQbs`x&@voafQHLf!-I%;vgRWO-T!K$1j z?)~`DqpJcrzri1y2)#n9@ZZ%uYVKI;+XLg$`?hiO~yqsGDeMyfr+Ut zl20~b)&HE|ls=a-H~#|F;KxX*u_C(A+AqW9mLx~p+T4Wxs)6zJ`>jU`{aOvc z_W+I{kJDZXw3Az8Jqnwbmp4honfdnWc)P+&b8c$UhCj$tDwng$ z|AD#(fDwxVOy~q$WMQE6zUF>q(Zir3wQs1U4GX8a!G2zS97(^HzI}YoUkqkc{*egK z{QNwv@MnngxHttQ(HJaZhN6evLC9E|JW70Dn#g9WOWZtT*C|!}&}^351uTr1HWZT| zI*BFn)Hq%Hd*_!tj^Dz~zfc*>N5-kc)x2|6RnKkgq3V&~5z;I{-SBHC1zE6(U80o~ zlAJH8&GRk;6ld`YhIQ|s?{u5Qv$46Usot9B=;nWZc1A$9WJGxXW5+S+Ynz~M_u|Hr zTKogd!^1-Z@XclmV0O~Hj~f4;0|N#@auuS_dNt|KD8@b}aK&En5S-8GJJvl%f2p67 z!%Fp%eK;~i>H~GkTx;_;Hdl1O5NKOaEwu|a2%!%u8R^5da_PN^xIg+VhBs)z^)%Z_ zC6Aez#44u>b9M`Uv?09hR(CE3)+;VMMSqs#f0Bnxe|7ag&vq(k4J1aweNW&y@|+9k z-V{(jDoE>1-=tboQw62~Rso+~L1 zN#?*6R%<-hW`dDEt1VEXE~Q9ELivseYXN+ecJ(X_&}v7ZIrs~tXhz5xGCZ8{98hPX ziRM9NQn>^wPa)4+g#ba`(k~E!&+)V2^&)52%0ARC?_@JTuLD8f$a$^CX!$v+##s&8 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 literal 15674 zcmcJ$1ymeu*Dcscu;7H?kc0$?-~`uT!685(xFom+*T%h(kOcPtfuO;)8z;ECyK6Vn z(DYQ^?_2+TYwo?X=FZH|TD^*{?yh?3sq^f!&)%mZ)m7z*2xtjFAP|wlTbXwt5QZf1 zdW44q?CJVgd;$Vta(ip(y2^ZVG5>7s} zw^QQY7%_8vG(v7pk?<_|OX4RrXz>2)*}X_c-^xHH3BL!=Q!e-V$Lmnhb7IHQ6rX>r zXcyHoeeYUR=6_wRmF8Ay6~D(q#KbN2M!UEvxx^v3<>kZgg2nGjqq+ifx>ivFIzlJ% zWYz(nz8DHJN5B1o|K^iVVvzE9y~$m|NTHeOXq)V}y;D;+RI@_0WGeyex=WA3cWs6K z^U_Q{fx&+3FPc|FojSbN2xWiX#AS=?hyo)1R2==cAJ1f2aBvrFT&>7))mSWo?eIij zuJA|41-)7bti&>7AP)af56)U@eZ67~5uoQj`#PMr|11W_hupdHxIoX-&-{u-+5N4Y zx{XBux`RwQZSpc1od&NxV8dmHhG z2rihPWSt?-TAcAj{h-Q*6%WaEqk2Axcj)j))Wv-CH>3G;Tf+0@`uV4)=ZUbl;!z5Q zd0AG7K_+R~B=rNjMWMGFw%2b4yHpv*cfS?G__(=LCZPn%8oa4E^_i}o3@yI8?9o05 z_;1aoZNJm|ieK6zYK?-_K%hq;1sN$V&-B95Dr_+_9&i1+dKd1INu_U=&gF)#1sjqlO0-_Qc1 zwl*2IloNAdeiLTUBfQ-=gzBW&(@${N@Pcf~upVHy)kI(r1g+?Gg6>HbS~iAtCHn{tNmw`h*WUY>TDBHgkbAsQ~rqo-Fu00BVLl7A>L>5VYyin~^9rj*(Zn2qh|>;Mg*eVFWd}@XS=?{PE7%%#|=h zg!4(NseH}YN)nx*E)FEGa(+5Bv_8%hrL~i`4X&m=Q~HUs^yd}tMF!o6>IAv1dEL_A z@v2=ulv+2BK-ie1$vB_3zqd80k7}4E&cV)yeO^1xpskxrM*01?1|0V$ij=d&GpdXv zhUAkzI+Ib2E-Vb(3x~p#D2Njh655pL*ZSftP8UBI2TMcO^UI_+wzqlR_9jAV^cyQ^ zmuri~Kz6_8q)&@6vm?LJHTM2V!GZ-o6dW0Oh#Xc}a8cvcdTS%XG zo%iTNtM0H5EDFf|p3p_4h_nbQXFAg&y+MNM$P?G01@V5W+<17d#`Xi$-|uXVQ1rO3 zPf>O0GdUNBus;*_83d{I{{83A3C;t5E}<( zllE%o%PS7(?PsG^Nd_=;!MU|ZQKbI?XvNSdP?>UEb1`ua(D`QDv}%KC-#dT)P!UZ%Iw@&V@d<|YkGeHHEPvr%I%d_ViZu)04Y zAE{>W=jP`dZqNF?Rzs--kDJfyf&Ya(Pac7KVj0$z%*EH#(!1!5S(r?yw@T}lY?QEd zYYk*IcyvE}ry~oj=HsihRJ*Ue_Y?qv;y#{wu(X3Q_Ls!w+MPlkdA+OgK9?D^yB! zDNu$B_D?H3pqn#Deuk@?oAb$vRAXafvX~D)6FL`zAjmgh)Ub8s zgv!&lz%=%c*;aP;vx!3OGBA4*2vsgdB{&_j688k{qvO(8#es+e36Kr+=Ao32mk7a;xG}0}gVcFiV zgP4W|98&$-+Opti+<78SOcW3>O35!52=O)6(V_Ya#;qdzwzoSY$DY>h+-K+KURx=a z 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 From 7150e738e7587e267a9b10e97c58f57759cca9c0 Mon Sep 17 00:00:00 2001 From: deathride58 Date: Mon, 4 Dec 2017 16:08:49 -0500 Subject: [PATCH 2/2] Update autolathe_designs.dm --- code/modules/research/designs/autolathe_designs.dm | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index 1c0c12a02b..3aaebe55be 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -799,16 +799,6 @@ materials = list(MAT_METAL = 300, MAT_GLASS = 200) build_path = /obj/item/device/slime_scanner category = list("initial", "Misc") -<<<<<<< HEAD -======= - -/datum/design/miniature_power_cell - name = "Light Fixture Battery" - id = "miniature_power_cell" - build_type = AUTOLATHE - materials = list(MAT_GLASS = 20) - build_path = /obj/item/stock_parts/cell/emergency_light - category = list("initial", "Electronics") /datum/design/holodisk name = "Holodisk" @@ -817,4 +807,3 @@ materials = list(MAT_METAL = 1000) build_path = /obj/item/disk/holodisk category = list("initial", "Misc") ->>>>>>> 78fe2bc... Holorecord disks. (#32868)