diff --git a/code/datums/recipe.dm b/code/datums/recipe.dm index 093fc8f5fd3..d2c747dd5b8 100644 --- a/code/datums/recipe.dm +++ b/code/datums/recipe.dm @@ -8,35 +8,35 @@ * * reagents are reagents. Acid, milc, booze, etc. * * items are objects. Fruits, tools, circuit boards. * * result is type to create as new object - * * time is optional parameter, you shall use in in your machine, + * * time is optional parameter, you shall use in in your machine, default /datum/recipe/ procs does not rely on this parameter. * * Functions you need: * /datum/recipe/proc/make(var/obj/container as obj) * Creates result inside container, - * deletes prerequisite reagents, + * deletes prerequisite reagents, * transfers reagents from prerequisite objects, * deletes all prerequisite objects (even not needed for recipe at the moment). - * + * * /proc/select_recipe(list/datum/recipe/avaiable_recipes, obj/obj as obj, exact = 1) * Wonderful function that select suitable recipe for you. * obj is a machine (or magik hat) with prerequisites, * exact = 0 forces algorithm to ignore superfluous stuff. - * - * + * + * * Functions you do not need to call directly but could: * /datum/recipe/proc/check_reagents(var/datum/reagents/avail_reagents) * //1=precisely, 0=insufficiently, -1=superfluous - * + * * /datum/recipe/proc/check_items(var/obj/container as obj) * //1=precisely, 0=insufficiently, -1=superfluous - * + * * */ /datum/recipe var/list/reagents // example: = list("berryjuice" = 5) // do not list same reagent twice var/list/items // example: =list(/obj/item/weapon/crowbar, /obj/item/weapon/welder) // place /foo/bar before /foo - var/result //example: = /obj/item/weapon/reagent_containers/food/snacks/donut + var/result //example: = /obj/item/weapon/reagent_containers/food/snacks/donut/normal var/time = 100 // 1/10 part of second @@ -52,7 +52,7 @@ if ((reagents?(reagents.len):(0)) < avail_reagents.reagent_list.len) return -1 return . - + /datum/recipe/proc/check_items(var/obj/container as obj) //1=precisely, 0=insufficiently, -1=superfluous if (!items) if (locate(/obj/) in container) diff --git a/code/defines/obj/vending.dm b/code/defines/obj/vending.dm index 4b1e01c2f63..95643336645 100644 --- a/code/defines/obj/vending.dm +++ b/code/defines/obj/vending.dm @@ -176,7 +176,7 @@ icon_state = "sec" icon_deny = "sec-deny" req_access_txt = "1" - product_paths = "/obj/item/weapon/handcuffs;/obj/item/weapon/grenade/flashbang;/obj/item/device/flash;/obj/item/weapon/reagent_containers/food/snacks/donut;/obj/item/weapon/storage/box/evidence" + product_paths = "/obj/item/weapon/handcuffs;/obj/item/weapon/grenade/flashbang;/obj/item/device/flash;/obj/item/weapon/reagent_containers/food/snacks/donut/normal;/obj/item/weapon/storage/box/evidence" product_amounts = "8;4;5;12;6" product_hidden = "/obj/item/clothing/glasses/sunglasses;/obj/item/kitchen/donut_box" product_hideamt = "2;2" diff --git a/code/defines/procs/helpers.dm b/code/defines/procs/helpers.dm index 84a2d016ca4..762bd38cc8f 100644 --- a/code/defines/procs/helpers.dm +++ b/code/defines/procs/helpers.dm @@ -272,7 +272,9 @@ return (result + R.Copy(Ri, 0)) /proc/sortRecord(var/list/datum/data/record/L, var/field = "name", var/order = 1) - if(isnull(L) || L.len < 2) + if(isnull(L)) + return list() + if(L.len < 2) return L var/middle = L.len / 2 + 1 return mergeRecordLists(sortRecord(L.Copy(0, middle), field, order), sortRecord(L.Copy(middle), field, order), field, order) @@ -282,16 +284,23 @@ var/Li=1 var/Ri=1 var/list/result = new() - while(Li <= L.len && Ri <= R.len) - var/datum/data/record/rL = L[Li] - var/datum/data/record/rR = R[Ri] - if(sorttext(rL.fields[field], rR.fields[field]) == order) - result += L[Li++] - else - result += R[Ri++] + if(!isnull(L) && !isnull(R)) + while(Li <= L.len && Ri <= R.len) + var/datum/data/record/rL = L[Li] + if(isnull(rL)) + L -= rL + continue + var/datum/data/record/rR = R[Ri] + if(isnull(rR)) + R -= rR + continue + if(sorttext(rL.fields[field], rR.fields[field]) == order) + result += L[Li++] + else + result += R[Ri++] - if(Li <= L.len) - return (result + L.Copy(Li, 0)) + if(Li <= L.len) + return (result + L.Copy(Li, 0)) return (result + R.Copy(Ri, 0)) /proc/sortList(var/list/L) diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index 828a55d1f1f..9a291815580 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -45,9 +45,10 @@ "} if(2.0) dat += "Record List:
" - for(var/datum/data/record/R in sortRecord(data_core.general)) - dat += text("[]: []
", src, R, R.fields["id"], R.fields["name"]) - //Foreach goto(132) + if(!isnull(data_core.general)) + for(var/datum/data/record/R in sortRecord(data_core.general)) + dat += text("
[]: []
", src, R, R.fields["id"], R.fields["name"]) + //Foreach goto(132) dat += text("
Back", src) if(3.0) dat += text("Records Maintenance
\nBackup To Disk
\nUpload From disk
\nDelete All Records
\n
\nBack", src, src, src, src) diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index a77d9ed4779..fd73f4ac12c 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -69,32 +69,33 @@ Fingerprints Criminal Status "} - for(var/datum/data/record/R in sortRecord(data_core.general, sortBy, order)) - var/crimstat = "" - for(var/datum/data/record/E in data_core.security) - if ((E.fields["name"] == R.fields["name"] && E.fields["id"] == R.fields["id"])) - crimstat = E.fields["criminal"] - var/background - switch(crimstat) - if("*Arrest*") - background = "'background-color:#DC143C;'" - if("Incarcerated") - background = "'background-color:#CD853F;'" - if("Parolled") - background = "'background-color:#CD853F;'" - if("Released") - background = "'background-color:#3BB9FF;'" - if("None") - background = "'background-color:#00FF7F;'" - if("") - background = "'background-color:#FFFFFF;'" - crimstat = "No Record." - dat += text("[]", background, src, R, R.fields["name"]) - dat += text("[]", R.fields["id"]) - dat += text("[]", R.fields["rank"]) - dat += text("[]", R.fields["fingerprint"]) - dat += text("[]", crimstat) - dat += "
" + if(!isnull(data_core.general)) + for(var/datum/data/record/R in sortRecord(data_core.general, sortBy, order)) + var/crimstat = "" + for(var/datum/data/record/E in data_core.security) + if ((E.fields["name"] == R.fields["name"] && E.fields["id"] == R.fields["id"])) + crimstat = E.fields["criminal"] + var/background + switch(crimstat) + if("*Arrest*") + background = "'background-color:#DC143C;'" + if("Incarcerated") + background = "'background-color:#CD853F;'" + if("Parolled") + background = "'background-color:#CD853F;'" + if("Released") + background = "'background-color:#3BB9FF;'" + if("None") + background = "'background-color:#00FF7F;'" + if("") + background = "'background-color:#FFFFFF;'" + crimstat = "No Record." + dat += text("[]", background, src, R, R.fields["name"]) + dat += text("[]", R.fields["id"]) + dat += text("[]", R.fields["rank"]) + dat += text("[]", R.fields["fingerprint"]) + dat += text("[]", crimstat) + dat += "
" dat += text("Record Maintenance

", src) dat += text("{Log Out}",src) if(2.0) @@ -400,7 +401,7 @@ What a mess.*/ if("name") if (istype(active1, /datum/data/record)) var/t1 = input("Please input name:", "Secure. records", active1.fields["name"], null) as text - if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon)))) || active1 != a1) + if ((!( t1 ) || !length(trim(t1)) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon)))) || active1 != a1) return active1.fields["name"] = t1 if("id") diff --git a/code/game/objects/closets/janitor.dm b/code/game/objects/closets/janitor.dm index 7f4fddc71f2..fcc9c93999c 100644 --- a/code/game/objects/closets/janitor.dm +++ b/code/game/objects/closets/janitor.dm @@ -12,4 +12,5 @@ new /obj/item/weapon/caution(src) new /obj/item/weapon/caution(src) new /obj/item/weapon/trashbag(src) - new /obj/item/device/lightreplacer(src) \ No newline at end of file + new /obj/item/device/lightreplacer(src) + new /obj/item/clothing/head/soft/purple(src) \ No newline at end of file diff --git a/code/game/objects/closets/wardrobe.dm b/code/game/objects/closets/wardrobe.dm index 9640a359ae0..5ebfe08ed10 100644 --- a/code/game/objects/closets/wardrobe.dm +++ b/code/game/objects/closets/wardrobe.dm @@ -66,6 +66,9 @@ new /obj/item/clothing/shoes/black(src) new /obj/item/clothing/shoes/black(src) new /obj/item/clothing/shoes/black(src) + new /obj/item/clothing/head/soft/green(src) + new /obj/item/clothing/head/soft/green(src) + new /obj/item/clothing/head/soft/green(src) return /obj/structure/closet/wardrobe/orange/New() @@ -75,6 +78,9 @@ new /obj/item/clothing/shoes/orange(src) new /obj/item/clothing/shoes/orange(src) new /obj/item/clothing/shoes/orange(src) + new /obj/item/clothing/head/soft/orange(src) + new /obj/item/clothing/head/soft/orange(src) + new /obj/item/clothing/head/soft/orange(src) return /obj/structure/closet/wardrobe/yellow/New() @@ -84,6 +90,9 @@ new /obj/item/clothing/shoes/orange(src) new /obj/item/clothing/shoes/orange(src) new /obj/item/clothing/shoes/orange(src) + new /obj/item/clothing/head/soft/yellow(src) + new /obj/item/clothing/head/soft/yellow(src) + new /obj/item/clothing/head/soft/yellow(src) return /obj/structure/closet/wardrobe/atmospherics_yellow/New() @@ -93,6 +102,9 @@ new /obj/item/clothing/shoes/black(src) new /obj/item/clothing/shoes/black(src) new /obj/item/clothing/shoes/black(src) + new /obj/item/clothing/head/soft/yellow(src) + new /obj/item/clothing/head/soft/yellow(src) + new /obj/item/clothing/head/soft/yellow(src) return /obj/structure/closet/wardrobe/engineering_yellow/New() @@ -102,6 +114,9 @@ new /obj/item/clothing/shoes/orange(src) new /obj/item/clothing/shoes/orange(src) new /obj/item/clothing/shoes/orange(src) + new /obj/item/clothing/head/soft/yellow(src) + new /obj/item/clothing/head/soft/yellow(src) + new /obj/item/clothing/head/soft/yellow(src) return /obj/structure/closet/wardrobe/white/New() @@ -185,6 +200,13 @@ new /obj/item/clothing/shoes/black(src) new /obj/item/clothing/shoes/brown(src) new /obj/item/clothing/shoes/white(src) + new /obj/item/clothing/head/soft/mime(src) + new /obj/item/clothing/head/soft/blue(src) + new /obj/item/clothing/head/soft/yellow(src) + new /obj/item/clothing/head/soft/green(src) + new /obj/item/clothing/head/soft/orange(src) + new /obj/item/clothing/head/soft/purple(src) + if(prob(10)) new /obj/item/clothing/head/soft/rainbow(src) return /obj/structure/closet/lawcloset/New() diff --git a/code/game/objects/devices/PDA/cart.dm b/code/game/objects/devices/PDA/cart.dm index f2253bda569..cb91a4ee2c1 100644 --- a/code/game/objects/devices/PDA/cart.dm +++ b/code/game/objects/devices/PDA/cart.dm @@ -260,9 +260,9 @@ Code: menu = "

Crew Manifest

" menu += "Entries cannot be modified from this terminal.

" - - for (var/datum/data/record/t in sortRecord(data_core.general)) - menu += "[t.fields["name"]] - [t.fields["rank"]]
" + if(!isnull(data_core.general)) + for (var/datum/data/record/t in sortRecord(data_core.general)) + menu += "[t.fields["name"]] - [t.fields["rank"]]
" menu += "
" @@ -335,8 +335,9 @@ Code: if (44) //medical records //This thing only displays a single screen so it's hard to really get the sub-menu stuff working. menu = "

Medical Record List

" - for (var/datum/data/record/R in sortRecord(data_core.general)) - menu += "[R.fields["id"]]: [R.fields["name"]]
" + if(!isnull(data_core.general)) + for (var/datum/data/record/R in sortRecord(data_core.general)) + menu += "
[R.fields["id"]]: [R.fields["name"]]
" menu += "
" if(441) menu = "

Medical Record

" @@ -377,9 +378,9 @@ Code: menu += "
" if (45) //security records menu = "

Security Record List

" - - for (var/datum/data/record/R in sortRecord(data_core.general)) - menu += "
[R.fields["id"]]: [R.fields["name"]]
" + if(!isnull(data_core.general)) + for (var/datum/data/record/R in sortRecord(data_core.general)) + menu += "
[R.fields["id"]]: [R.fields["name"]]
" menu += "
" if(451) diff --git a/code/game/objects/items/food.dm b/code/game/objects/items/food.dm index 21f9750f2d3..d213f44e95c 100644 --- a/code/game/objects/items/food.dm +++ b/code/game/objects/items/food.dm @@ -10,62 +10,70 @@ MONKEY CUBE BOX /mob/living/carbon/var/last_eating = 0 /obj/item/kitchen/donut_box - var/amount = 6 + var/const/max_amount = 6 + var/list/obj/item/weapon/reagent_containers/food/snacks/donut/donuts = list() icon = 'food.dmi' - icon_state = "donutbox" + icon_state = "donutbox6" name = "donut box" + /obj/item/kitchen/egg_box var/amount = 12 icon = 'food.dmi' icon_state = "eggbox" name = "egg box" +/obj/item/kitchen/donut_box/New() + for(var/i = 0; i < max_amount; i++) + donuts += new /obj/item/weapon/reagent_containers/food/snacks/donut/normal(src) + update() + ..() + /obj/item/kitchen/donut_box/proc/update() - src.icon_state = text("donutbox[]", src.amount) + src.icon_state = text("donutbox[]", src.donuts.len) return -/* -/obj/item/kitchen/donut_box/attackby(obj/item/weapon/W as obj, mob/user as mob) - if (istype(W, /obj/item/weapon/reagent_containers/food/snacks/donut) && (amount < 6)) +/obj/item/kitchen/donut_box/attackby(obj/item/weapon/W as obj, mob/living/user as mob) + if (istype(W, /obj/item/weapon/reagent_containers/food/snacks/donut) && (donuts.len < max_amount)) user.drop_item() W.loc = src + donuts += W usr << "You place a donut back into the box." - src.update() + src.update() return -*/ -/obj/item/kitchen/donut_box/MouseDrop(mob/user as mob) +/obj/item/kitchen/donut_box/MouseDrop(mob/living/user as mob) if ((user == usr && (!( usr.restrained() ) && (!( usr.stat ) && (usr.contents.Find(src) || in_range(src, usr)))))) if(!istype(user, /mob/living/carbon/metroid)) if( !usr.get_active_hand() ) src.attack_hand(usr, usr.hand, 1) return -/obj/item/kitchen/donut_box/attack_paw(mob/user as mob) +/obj/item/kitchen/donut_box/attack_paw(mob/living/user as mob) return src.attack_hand(user) -/obj/item/kitchen/donut_box/attack_hand(mob/user as mob, unused, flag) +/obj/item/kitchen/donut_box/attack_hand(mob/living/user as mob, unused, flag) if (flag) return ..() src.add_fingerprint(user) - var/obj/item/weapon/reagent_containers/food/snacks/donut/P = locate() in src - if(!P && (amount >= 1)) - P = new /obj/item/weapon/reagent_containers/food/snacks/donut( src ) + var/last = donuts.len + if(last <= 0) + user << "Oh no! No donuts left!" + return + //world.log << last + var/obj/item/weapon/reagent_containers/food/snacks/donut/P = donuts[last] // Get the last donut. if(P) - usr.put_in_hands(P) - usr << "You take a donut out of the box." - src.amount-- + P.loc = user.loc + user.put_in_hands(P) + donuts -= P + user << "You take a donut out of the box." src.update() return /obj/item/kitchen/donut_box/examine() set src in oview(1) - src.amount = round(src.amount) - var/n = src.amount - for(var/obj/item/weapon/reagent_containers/food/snacks/donut/P in src) - n++ + var/n = src.donuts.len if (n <= 0) n = 0 usr << "There are no donuts left in the box." diff --git a/code/game/objects/storage/belt.dm b/code/game/objects/storage/belt.dm index 9265e3b07d2..cc5cb63cb63 100644 --- a/code/game/objects/storage/belt.dm +++ b/code/game/objects/storage/belt.dm @@ -110,8 +110,8 @@ "/obj/item/clothing/glasses", "/obj/item/ammo_casing/shotgun", "/obj/item/ammo_magazine", - "/obj/item/weapon/reagent_containers/food/snacks/donut", - "/obj/item/weapon/reagent_containers/food/snacks/jellydonut" + "/obj/item/weapon/reagent_containers/food/snacks/donut/normal", + "/obj/item/weapon/reagent_containers/food/snacks/donut/jelly" ) /obj/item/weapon/storage/belt/soulstone diff --git a/code/modules/food/food.dm b/code/modules/food/food.dm index 44f504201a3..c40eb1a4920 100644 --- a/code/modules/food/food.dm +++ b/code/modules/food/food.dm @@ -104,6 +104,11 @@ name = "donut" desc = "Goes great with Robust Coffee." icon_state = "donut1" + +/obj/item/weapon/reagent_containers/food/snacks/donut/normal + name = "donut" + desc = "Goes great with Robust Coffee." + icon_state = "donut1" New() ..() reagents.add_reagent("nutriment", 3) @@ -114,12 +119,12 @@ src.name = "frosted donut" reagents.add_reagent("sprinkles", 2) -/obj/item/weapon/reagent_containers/food/snacks/chaosdonut +/obj/item/weapon/reagent_containers/food/snacks/donut/chaos name = "Chaos Donut" desc = "Like life, it never quite tastes the same." icon_state = "donut1" New() - ..() + reagents.add_reagent("nutriment", 2) reagents.add_reagent("sprinkles", 1) bitesize = 10 @@ -150,7 +155,8 @@ src.name = "Frosted Chaos Donut" reagents.add_reagent("sprinkles", 2) -/obj/item/weapon/reagent_containers/food/snacks/jellydonut + +/obj/item/weapon/reagent_containers/food/snacks/donut/jelly name = "Jelly Donut" desc = "You jelly?" icon_state = "jdonut1" diff --git a/code/modules/food/recipes_microwave.dm b/code/modules/food/recipes_microwave.dm index f8c4a34a8af..c3e97e99ab2 100644 --- a/code/modules/food/recipes_microwave.dm +++ b/code/modules/food/recipes_microwave.dm @@ -45,14 +45,14 @@ /obj/item/weapon/reagent_containers/food/snacks/flour, /obj/item/weapon/reagent_containers/food/snacks/egg ) - result = /obj/item/weapon/reagent_containers/food/snacks/jellydonut + result = /obj/item/weapon/reagent_containers/food/snacks/donut/jelly /datum/recipe/donut items = list( /obj/item/weapon/reagent_containers/food/snacks/flour, /obj/item/weapon/reagent_containers/food/snacks/egg ) - result = /obj/item/weapon/reagent_containers/food/snacks/donut + result = /obj/item/weapon/reagent_containers/food/snacks/donut/normal /datum/recipe/human //invalid recipe @@ -414,7 +414,7 @@ /obj/item/weapon/reagent_containers/food/snacks/flour, /obj/item/weapon/reagent_containers/food/snacks/egg ) - result = /obj/item/weapon/reagent_containers/food/snacks/chaosdonut + result = /obj/item/weapon/reagent_containers/food/snacks/donut/chaos /datum/recipe/human/kabob items = list( diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm index 0793154c607..4845d77efa3 100644 --- a/code/modules/mob/living/silicon/pai/software.dm +++ b/code/modules/mob/living/silicon/pai/software.dm @@ -413,9 +413,10 @@ var/dat = "" dat += "

Crew Manifest



" var/list/L = list() - for (var/datum/data/record/t in sortRecord(data_core.general)) - var/R = t.fields["name"] + " - " + t.fields["rank"] - L += R + if(!isnull(data_core.general)) + for (var/datum/data/record/t in sortRecord(data_core.general)) + var/R = t.fields["name"] + " - " + t.fields["rank"] + L += R for(var/R in sortList(L)) dat += "[R]
" dat += "" @@ -426,8 +427,9 @@ var/dat = "" if(src.subscreen == 0) dat += "

Medical Records


" - for(var/datum/data/record/R in sortRecord(data_core.general)) - dat += text("
[]: []
", src, R, R.fields["id"], R.fields["name"]) + if(!isnull(data_core.general)) + for(var/datum/data/record/R in sortRecord(data_core.general)) + dat += text("
[]: []
", src, R, R.fields["id"], R.fields["name"]) //dat += text("
Back", src) if(src.subscreen == 1) dat += "
Medical Record

" @@ -448,8 +450,9 @@ var/dat = "" if(src.subscreen == 0) dat += "

Security Records


" - for(var/datum/data/record/R in sortRecord(data_core.general)) - dat += text("[]: []
", src, R, R.fields["id"], R.fields["name"]) + if(!isnull(data_core.general)) + for(var/datum/data/record/R in sortRecord(data_core.general)) + dat += text("
[]: []
", src, R, R.fields["id"], R.fields["name"]) if(src.subscreen == 1) dat += "

Security Record

" if ((istype(src.securityActive1, /datum/data/record) && data_core.general.Find(src.securityActive1))) diff --git a/icons/obj/food.dmi b/icons/obj/food.dmi index ae2b2091c25..bb38afed7f1 100644 Binary files a/icons/obj/food.dmi and b/icons/obj/food.dmi differ