diff --git a/Makefile b/Makefile index d3df1dcf22f7..3f0d3837e283 100644 --- a/Makefile +++ b/Makefile @@ -652,7 +652,7 @@ ifeq ($(TARGETSYSTEM),WINDOWS) RSRC = $(wildcard $(SRC_DIR)/*.rc) _OBJS += $(RSRC:$(SRC_DIR)/%.rc=%.o) endif -OBJS = $(patsubst %,$(ODIR)/%,$(_OBJS)) +OBJS = $(sort $(patsubst %,$(ODIR)/%,$(_OBJS))) ifdef LANGUAGES L10N = localization diff --git a/data/json/construction.json b/data/json/construction.json index f24ec313b44f..4d85a2076b22 100644 --- a/data/json/construction.json +++ b/data/json/construction.json @@ -126,7 +126,7 @@ "required_skills" : [ [ "survival", 2 ] ], "time" : 60, "qualities": [ [ - { "id": "AXE", "level": 2 }, { "id": "SAW_W", "level": 2 } + { "id": "AXE", "level": 2 }, { "id": "SAW_W", "level": 1 } ] ], "pre_terrain" : "t_trunk", "post_terrain" : "t_dirt", diff --git a/data/json/harvest.json b/data/json/harvest.json index 010d92f52362..59a78b18358e 100644 --- a/data/json/harvest.json +++ b/data/json/harvest.json @@ -77,5 +77,16 @@ { "drop": "acidchitin_piece", "base_num": [ 2, 6 ], "scale_num": [ 0.3, 0.6 ], "max": 10 }, { "drop": "fat", "base_num": [ 5, 8 ], "scale_num": [ 0.6, 0.8 ], "max": 18 } ] + }, + { + "id": "fungaloid_mass", + "type": "harvest", + "message": "You laboriously hack and dig through the remains of the fungal mass.", + "entries": [ + { "drop": "veggy", "base_num": [ 6, 10 ], "scale_num": [ 0.6, 0.8 ], "max": 20 }, + { "drop": "veggy_tainted", "base_num": [ 16, 25 ], "scale_num": [ 0.6, 0.8 ], "max": 50 }, + { "drop": "plant_sac", "base_num": [ 3, 6 ], "scale_num": [ 0.7, 0.9 ], "max": 10 }, + { "drop": "plant_fibre", "base_num": [ 4, 8 ], "scale_num": [ 0.5, 0.7 ], "max": 10 } + ] } ] diff --git a/data/json/item_actions.json b/data/json/item_actions.json index 60a26ec53fcf..85d686d5b59c 100644 --- a/data/json/item_actions.json +++ b/data/json/item_actions.json @@ -459,6 +459,10 @@ "type" : "item_action", "id" : "MP3_ON", "name" : "Turn off" + },{ + "type" : "item_action", + "id" : "GASMASK", + "name" : "Prepare to use" },{ "type" : "item_action", "id" : "MULTICOOKER", @@ -742,7 +746,7 @@ }, { "type" : "item_action", - "id" : "FEEDCATTLE", + "id" : "CATTLEFODDER", "name" : "Place" }, { diff --git a/data/json/items/ammo.json b/data/json/items/ammo.json index da9a63ca4ce4..0a15c20c5a69 100644 --- a/data/json/items/ammo.json +++ b/data/json/items/ammo.json @@ -749,6 +749,48 @@ "ammo_type" : "rebreather_filter", "count" : 30 }, + { + "type": "AMMO", + "id": "gasfilter_s", + "category": "spare_parts", + "price": 2500, + "name": "filter mask cartridge", + "symbol": "=", + "color": "light_gray", + "description": "Small replacement filter cartridge for air filtration masks.", + "volume": 1, + "weight": 1, + "ammo_type": "gasfilter_s", + "count": 100 + }, + { + "type": "AMMO", + "id": "gasfilter_m", + "category": "spare_parts", + "price": 2500, + "name": "gas mask cartridge", + "symbol": "=", + "color": "light_gray", + "description": "Medium replacement filter cartridge for air filtration masks", + "volume": 1, + "weight": 2, + "ammo_type": "gasfilter_m", + "count": 100 + }, + { + "type": "AMMO", + "id": "gasfilter_l", + "category": "spare_parts", + "price": 2500, + "name": "hazmat mask cartridge", + "symbol": "=", + "color": "light_gray", + "description": "Heavy replacement filter cartridge for air filtration masks", + "volume": 1, + "weight": 3, + "ammo_type": "gasfilter_l", + "count": 100 + }, { "type" : "AMMO", "id" : "nicotine_liquid", "category" : "spare_parts", diff --git a/data/json/items/ammo_types.json b/data/json/items/ammo_types.json index 7d4775fe43f6..22689135d070 100644 --- a/data/json/items/ammo_types.json +++ b/data/json/items/ammo_types.json @@ -371,6 +371,24 @@ "name" : "rebreather filter", "default" : "rebreather_filter" }, + { + "type": "ammunition_type", + "id": "gasfilter_s", + "name": "filter mask cartridge", + "default": "gasfilter_s" + }, + { + "type": "ammunition_type", + "id": "gasfilter_m", + "name": "gas mask cartridge", + "default": "gasfilter_m" + }, + { + "type": "ammunition_type", + "id": "gasfilter_l", + "name": "hazmat mask cartridge", + "default": "gasfilter_l" + }, { "type" : "ammunition_type", "id" : "300", diff --git a/data/json/items/armor.json b/data/json/items/armor.json index 2c7a00183b3f..acfcb02824a0 100644 --- a/data/json/items/armor.json +++ b/data/json/items/armor.json @@ -4068,7 +4068,7 @@ { "id": "hat_noise_cancelling", "type": "ARMOR", - "name": "noise cancelling headgear", + "name": "noise canceling headgear", "description": "Padding over your ears kept in place by some string. Blocks incoming sounds.", "weight": 72, "volume": 2, @@ -6241,106 +6241,6 @@ "material_thickness": 1, "environmental_protection": 2 }, - { - "id": "mask_filter", - "type": "ARMOR", - "name": "filter mask", - "description": "A mask that straps over your mouth and nose and filters air. Protects from smoke, dust, and other contaminants quite well.", - "weight": 260, - "volume": 2, - "price": 3500, - "to_hit": 1, - "material": [ "plastic" ], - "symbol": "[", - "color": "light_gray", - "covers": [ "MOUTH" ], - "coverage": 100, - "encumbrance": 20, - "warmth": 10, - "material_thickness": 2, - "environmental_protection": 7 - }, - { - "id": "mask_fsurvivor", - "type": "ARMOR", - "category": "armor", - "name": "survivor firemask", - "description": "A custom-built, Nomex-insulated gas mask that covers the face and eyes. It provides excellent protection from heat, smoke, teargas, and shrapnel.", - "weight": 708, - "volume": 5, - "price": 24000, - "to_hit": -3, - "material": [ "kevlar", "nomex" ], - "symbol": "[", - "color": "light_gray", - "covers": [ "MOUTH", "EYES" ], - "coverage": 100, - "encumbrance": 30, - "warmth": 15, - "material_thickness": 3, - "environmental_protection": 15, - "flags": [ "VARSIZE", "STURDY" ] - }, - { - "id": "mask_fsurvivorxl", - "type": "ARMOR", - "category": "armor", - "name": "XL survivor firemask", - "description": "A custom-built, Nomex-insulated gas mask that covers the face and eyes regardless of your state of mutation. It provides excellent protection from heat, smoke, teargas, and shrapnel.", - "weight": 1108, - "volume": 5, - "price": 24000, - "to_hit": -3, - "material": [ "kevlar", "nomex" ], - "symbol": "[", - "color": "light_gray", - "covers": [ "MOUTH", "EYES" ], - "coverage": 100, - "encumbrance": 35, - "warmth": 15, - "material_thickness": 3, - "environmental_protection": 15, - "flags": [ "VARSIZE", "STURDY", "OVERSIZE" ] - }, - { - "id": "mask_gas", - "type": "ARMOR", - "name": "gas mask", - "description": "A full gas mask that covers the face and eyes. Provides excellent protection from smoke, teargas, and other contaminants.", - "weight": 897, - "volume": 4, - "price": 4900, - "to_hit": -3, - "material": [ "plastic" ], - "symbol": "[", - "color": "dark_gray", - "covers": [ "MOUTH", "EYES" ], - "coverage": 100, - "encumbrance": 30, - "warmth": 20, - "material_thickness": 2, - "environmental_protection": 16 - }, - { - "id": "mask_gas_xl", - "type": "ARMOR", - "name": "XL gas mask", - "description": "A rather roomy mask with filters attached, designed to accommodate exotic anatomy. Provides excellent protection from smoke, teargas, and other contaminants.", - "weight": 1397, - "volume": 6, - "price": 25000, - "to_hit": -3, - "material": [ "plastic" ], - "symbol": "[", - "color": "dark_gray", - "covers": [ "MOUTH", "EYES" ], - "coverage": 100, - "encumbrance": 30, - "warmth": 20, - "material_thickness": 2, - "environmental_protection": 16, - "flags": [ "OVERSIZE" ] - }, { "id": "mask_guy_fawkes", "type": "ARMOR", @@ -6384,50 +6284,6 @@ "environmental_protection": 1, "flags": [ "WATER_FRIENDLY", "STURDY" ] }, - { - "id": "mask_hsurvivor", - "type": "ARMOR", - "category": "armor", - "name": "heavy survivor mask", - "description": "A custom-built, steel reinforced gas mask that covers the face and eyes. Provides excellent protection from smoke, teargas, and shrapnel.", - "weight": 858, - "volume": 5, - "price": 24000, - "to_hit": -3, - "material": [ "kevlar", "steel" ], - "symbol": "[", - "color": "dark_gray", - "covers": [ "MOUTH", "EYES" ], - "coverage": 100, - "encumbrance": 30, - "warmth": 15, - "material_thickness": 3, - "environmental_protection": 15, - "qualities": [ [ "GLARE", 1 ] ], - "flags": [ "VARSIZE", "STURDY" ] - }, - { - "id": "mask_lsurvivor", - "type": "ARMOR", - "category": "armor", - "name": "light survivor mask", - "description": "A custom-built, reinforced gas mask that covers the face and eyes. Provides excellent protection from smoke, teargas, and shrapnel.", - "weight": 466, - "volume": 5, - "price": 24000, - "to_hit": -3, - "material": [ "kevlar", "cotton" ], - "symbol": "[", - "color": "dark_gray", - "covers": [ "MOUTH", "EYES" ], - "coverage": 100, - "encumbrance": 20, - "warmth": 15, - "material_thickness": 3, - "environmental_protection": 15, - "qualities": [ [ "GLARE", 1 ] ], - "flags": [ "VARSIZE", "STURDY" ] - }, { "id": "mask_rioter", "type": "ARMOR", @@ -6448,94 +6304,6 @@ "environmental_protection": 1, "flags": [ "HELMET_COMPAT" ] }, - { - "id": "mask_survivor", - "type": "ARMOR", - "category": "armor", - "name": "survivor mask", - "description": "A custom-built, leather reinforced gas mask that covers the face and eyes. Provides excellent protection from smoke, teargas, and shrapnel.", - "weight": 682, - "volume": 5, - "price": 24000, - "to_hit": -3, - "material": [ "kevlar", "leather" ], - "symbol": "[", - "color": "dark_gray", - "covers": [ "MOUTH", "EYES" ], - "coverage": 100, - "encumbrance": 25, - "warmth": 15, - "material_thickness": 3, - "environmental_protection": 15, - "qualities": [ [ "GLARE", 1 ] ], - "flags": [ "VARSIZE", "STURDY" ] - }, - { - "id": "mask_survivorxl", - "type": "ARMOR", - "category": "armor", - "name": "XL survivor mask", - "description": "A custom-built, reinforced gas mask that covers the face and eyes regardless of your state of mutation. Provides excellent protection from smoke, teargas, and shrapnel.", - "weight": 982, - "volume": 5, - "price": 24000, - "to_hit": -3, - "material": [ "kevlar", "plastic" ], - "symbol": "[", - "color": "dark_gray", - "covers": [ "MOUTH", "EYES" ], - "coverage": 100, - "encumbrance": 30, - "warmth": 15, - "material_thickness": 3, - "environmental_protection": 15, - "qualities": [ [ "GLARE", 1 ] ], - "flags": [ "VARSIZE", "STURDY", "OVERSIZE" ] - }, - { - "id": "mask_wsurvivor", - "type": "ARMOR", - "category": "armor", - "name": "winter survivor mask", - "description": "A custom-built, fur-trimmed gas mask that covers the face and eyes. Quite warm, it still provides excellent protection from smoke, teargas, and shrapnel.", - "weight": 682, - "volume": 5, - "price": 24000, - "to_hit": -3, - "material": [ "kevlar", "fur" ], - "symbol": "[", - "color": "light_gray", - "covers": [ "MOUTH", "EYES" ], - "coverage": 100, - "encumbrance": 30, - "warmth": 75, - "material_thickness": 3, - "environmental_protection": 15, - "qualities": [ [ "GLARE", 1 ] ], - "flags": [ "VARSIZE", "STURDY" ] - }, - { - "id": "mask_wsurvivorxl", - "type": "ARMOR", - "category": "armor", - "name": "XL winter survivor mask", - "description": "A custom-built, fur-trimmed gas mask that covers the face and eyes regardless of your state of mutation. Quite warm, it still provides excellent protection from smoke, teargas, and shrapnel.", - "weight": 1062, - "volume": 5, - "price": 24000, - "to_hit": -3, - "material": [ "kevlar", "fur" ], - "symbol": "[", - "color": "light_gray", - "covers": [ "MOUTH", "EYES" ], - "coverage": 100, - "encumbrance": 35, - "warmth": 75, - "material_thickness": 3, - "environmental_protection": 15, - "qualities": [ [ "GLARE", 1 ] ], - "flags": [ "VARSIZE", "STURDY", "OVERSIZE" ] - }, { "id": "mbag", "type": "ARMOR", diff --git a/data/json/items/tool_armor.json b/data/json/items/tool_armor.json index a2b6d0f03c52..5c5fa80508a7 100644 --- a/data/json/items/tool_armor.json +++ b/data/json/items/tool_armor.json @@ -526,74 +526,6 @@ "coverage" : 20, "material_thickness" : 1 }, - { - "id": "mask_bunker", - "type": "TOOL_ARMOR", - "category" : "armor", - "symbol": "[", - "color": "light_gray", - "name": "firefighter PBA mask", - "description": "A full-face mask commonly used by firefighters. The battery-powered protective breathing apparatus provides excellent protection from smoke, flame, and other dangers. Use it to turn it on.", - "flags" : ["VARSIZE", "WATERPROOF", "STURDY"], - "price": 100000, - "material": ["plastic", "nomex"], - "weight" : 1260, - "volume": 6, - "to_hit" : -3, - "max_charges": 100, - "initial_charges": 100, - "charges_per_use": 1, - "ammo": "battery", - "use_action": { - "type": "transform", - "msg": "You activate your %s.", - "target": "mask_bunker_on", - "active": true, - "need_charges": 1, - "need_charges_msg": "The %s's batteries are dead." - }, - "covers" : ["MOUTH", "EYES"], - "warmth" : 30, - "environmental_protection" : 7, - "encumbrance" : 40, - "coverage" : 100, - "qualities" : [["GLARE", 2]], - "material_thickness" : 3 - }, - { - "id": "mask_bunker_on", - "type": "TOOL_ARMOR", - "category" : "armor", - "symbol": "[", - "color": "light_gray", - "name": "firefighter PBA mask (on)", - "name_plural": "firefighter PBA masks (on)", - "description": "A full-face mask commonly used by firefighters. The battery-powered protective breathing apparatus provides excellent protection from smoke, flame, and other dangers. It is turned on, and continually draining batteries. Use it to turn it off.", - "flags" : ["VARSIZE", "WATERPROOF", "STURDY", "TRADER_AVOID"], - "price": 100000, - "material": ["plastic", "nomex"], - "weight" : 1260, - "volume": 6, - "to_hit" : -3, - "max_charges": 100, - "initial_charges": 100, - "turns_per_charge": 10, - "ammo": "battery", - "revert_to": "mask_bunker", - "use_action": { - "type": "transform", - "menu_text": "Turn off", - "msg": "Your %s deactivates.", - "target": "mask_bunker" - }, - "covers" : ["MOUTH", "EYES"], - "warmth" : 15, - "environmental_protection" : 30, - "encumbrance" : 20, - "coverage" : 100, - "qualities" : [["GLARE", 2]], - "material_thickness" : 3 - }, { "id": "rm13_armor", "type": "TOOL_ARMOR", @@ -778,6 +710,370 @@ "coverage" : 75, "material_thickness" : 1 }, +{ + "id": "mask_filter", + "type": "TOOL_ARMOR", + "name": "filter mask", + "description": "A mask that straps over your mouth and nose and filters air. Protects from smoke, dust, and other contaminants quite well. It must be prepared before use.", + "weight": 260, + "volume": 2, + "price": 3500, + "to_hit": 1, + "material": [ "plastic" ], + "symbol": "[", + "color": "light_gray", + "covers": [ "MOUTH" ], + "coverage": 100, + "encumbrance": 20, + "warmth": 10, + "material_thickness": 2, + "environmental_protection": 1, + "environmental_protection_with_filter": 7, + "max_charges": 100, + "initial_charges": 100, + "ammo": "gasfilter_s", + "use_action": "GASMASK" + }, + { + "id": "mask_gas", + "type": "TOOL_ARMOR", + "name": "gas mask", + "description": "A full gas mask that covers the face and eyes. Provides excellent protection from smoke, teargas, and other contaminants. It must be prepared before use.", + "weight": 897, + "volume": 4, + "price": 4900, + "to_hit": -3, + "material": [ "plastic" ], + "symbol": "[", + "color": "dark_gray", + "covers": [ "MOUTH", "EYES" ], + "coverage": 100, + "encumbrance": 30, + "warmth": 20, + "material_thickness": 2, + "environmental_protection": 1, + "environmental_protection_with_filter": 16, + "max_charges": 100, + "initial_charges": 100, + "ammo": "gasfilter_m", + "use_action": "GASMASK" + }, + { + "id": "mask_gas_xl", + "type": "TOOL_ARMOR", + "name": "XL gas mask", + "description": "A rather roomy mask with filters attached, designed to accommodate exotic anatomy. Provides excellent protection from smoke, teargas, and other contaminants. It must be prepared before use.", + "weight": 1397, + "volume": 6, + "price": 25000, + "to_hit": -3, + "material": [ "plastic" ], + "symbol": "[", + "color": "dark_gray", + "covers": [ "MOUTH", "EYES" ], + "coverage": 100, + "encumbrance": 30, + "warmth": 20, + "material_thickness": 2, + "environmental_protection": 1, + "environmental_protection_with_filter": 16, + "max_charges": 100, + "initial_charges": 100, + "ammo": "gasfilter_m", + "use_action": "GASMASK", + "flags": [ "OVERSIZE" ] + }, + { + "id": "mask_fsurvivor", + "type": "TOOL_ARMOR", + "category": "armor", + "name": "survivor firemask", + "description": "A custom-built, Nomex-insulated gas mask that covers the face and eyes. It provides excellent protection from heat, smoke, teargas, and shrapnel. It must be prepared before use.", + "weight": 708, + "volume": 5, + "price": 24000, + "to_hit": -3, + "material": [ "kevlar", "nomex" ], + "symbol": "[", + "color": "light_gray", + "covers": [ "MOUTH", "EYES" ], + "coverage": 100, + "encumbrance": 30, + "warmth": 15, + "material_thickness": 3, + "environmental_protection": 1, + "environmental_protection_with_filter": 15, + "max_charges": 100, + "initial_charges": 100, + "ammo": "gasfilter_m", + "use_action": "GASMASK", + "flags": [ "VARSIZE", "STURDY" ] + }, + { + "id": "mask_fsurvivorxl", + "type": "TOOL_ARMOR", + "category": "armor", + "name": "XL survivor firemask", + "description": "A custom-built, Nomex-insulated gas mask that covers the face and eyes regardless of your state of mutation. It provides excellent protection from heat, smoke, teargas, and shrapnel. It must be prepared before use.", + "weight": 1108, + "volume": 5, + "price": 24000, + "to_hit": -3, + "material": [ "kevlar", "nomex" ], + "symbol": "[", + "color": "light_gray", + "covers": [ "MOUTH", "EYES" ], + "coverage": 100, + "encumbrance": 35, + "warmth": 15, + "material_thickness": 3, + "environmental_protection": 1, + "environmental_protection_with_filter": 15, + "max_charges": 100, + "initial_charges": 100, + "ammo": "gasfilter_m", + "use_action": "GASMASK", + "flags": [ "VARSIZE", "STURDY", "OVERSIZE" ] + }, + { + "id": "mask_bunker", + "type": "TOOL_ARMOR", + "category": "armor", + "symbol": "[", + "color": "light_gray", + "name": "firefighter PBA mask", + "description": "A full-face mask commonly used by firefighters. The protective breathing apparatus provides excellent protection from smoke, flame, and other dangers. It must be prepared before use.", + "flags": [ "VARSIZE", "WATERPROOF", "STURDY" ], + "price": 100000, + "material": [ "plastic", "nomex" ], + "weight": 1260, + "volume": 6, + "to_hit": -3, + "max_charges": 100, + "initial_charges": 100, + "ammo": "gasfilter_m", + "use_action": "GASMASK", + "covers": [ "MOUTH", "EYES" ], + "warmth": 30, + "environmental_protection": 1, + "environmental_protection_with_filter": 16, + "encumbrance": 20, + "coverage": 100, + "qualities": [ [ "GLARE", 2 ] ], + "material_thickness": 3 + }, + { + "id": "mask_hsurvivor", + "type": "TOOL_ARMOR", + "category": "armor", + "name": "heavy survivor mask", + "description": "A custom-built, steel reinforced gas mask that covers the face and eyes. Provides excellent protection from smoke, teargas, and shrapnel. It must be prepared before use.", + "weight": 858, + "volume": 5, + "price": 24000, + "to_hit": -3, + "max_charges": 100, + "initial_charges": 100, + "ammo": "gasfilter_m", + "use_action": "GASMASK", + "material": [ "kevlar", "steel" ], + "symbol": "[", + "color": "dark_gray", + "covers": [ "MOUTH", "EYES" ], + "coverage": 100, + "encumbrance": 30, + "warmth": 15, + "material_thickness": 3, + "environmental_protection": 1, + "environmental_protection_with_filter": 15, + "qualities": [ [ "GLARE", 1 ] ], + "flags": [ "VARSIZE", "STURDY" ] + }, + { + "id": "mask_lsurvivor", + "type": "TOOL_ARMOR", + "category": "armor", + "name": "light survivor mask", + "description": "A custom-built, reinforced gas mask that covers the face and eyes. Provides excellent protection from smoke, teargas, and shrapnel. It must be prepared before use.", + "weight": 466, + "volume": 5, + "price": 24000, + "to_hit": -3, + "max_charges": 100, + "initial_charges": 100, + "charges_per_use": 1, + "ammo": "gasfilter_m", + "use_action": "GASMASK", + "material": [ "kevlar", "cotton" ], + "symbol": "[", + "color": "dark_gray", + "covers": [ "MOUTH", "EYES" ], + "coverage": 100, + "encumbrance": 20, + "warmth": 15, + "material_thickness": 3, + "environmental_protection": 1, + "environmental_protection_with_filter": 15, + "qualities": [ [ "GLARE", 1 ] ], + "flags": [ "VARSIZE", "STURDY" ] + }, + { + "id": "mask_survivor", + "type": "TOOL_ARMOR", + "category": "armor", + "name": "survivor mask", + "description": "A custom-built, leather reinforced gas mask that covers the face and eyes. Provides excellent protection from smoke, teargas, and shrapnel. It must be prepared before use.", + "weight": 682, + "volume": 5, + "price": 24000, + "to_hit": -3, + "max_charges": 100, + "initial_charges": 100, + "ammo": "gasfilter_m", + "use_action": "GASMASK", + "material": [ "kevlar", "leather" ], + "symbol": "[", + "color": "dark_gray", + "covers": [ "MOUTH", "EYES" ], + "coverage": 100, + "encumbrance": 25, + "warmth": 15, + "material_thickness": 3, + "environmental_protection": 1, + "environmental_protection_with_filter": 15, + "qualities": [ [ "GLARE", 1 ] ], + "flags": [ "VARSIZE", "STURDY" ] + }, + { + "id": "mask_survivorxl", + "type": "TOOL_ARMOR", + "category": "armor", + "name": "XL survivor mask", + "description": "A custom-built, reinforced gas mask that covers the face and eyes regardless of your state of mutation. Provides excellent protection from smoke, teargas, and shrapnel. It must be prepared before use.", + "weight": 982, + "volume": 5, + "price": 24000, + "to_hit": -3, + "max_charges": 100, + "initial_charges": 100, + "ammo": "gasfilter_m", + "use_action": "GASMASK", + "material": [ "kevlar", "plastic" ], + "symbol": "[", + "color": "dark_gray", + "covers": [ "MOUTH", "EYES" ], + "coverage": 100, + "encumbrance": 30, + "warmth": 15, + "material_thickness": 3, + "environmental_protection": 1, + "environmental_protection_with_filter": 15, + "qualities": [ [ "GLARE", 1 ] ], + "flags": [ "VARSIZE", "STURDY", "OVERSIZE" ] + }, + { + "id": "mask_wsurvivor", + "type": "TOOL_ARMOR", + "category": "armor", + "name": "winter survivor mask", + "description": "A custom-built, fur-trimmed gas mask that covers the face and eyes. Quite warm, it still provides excellent protection from smoke, teargas, and shrapnel. It must be prepared before use.", + "weight": 682, + "volume": 5, + "price": 24000, + "to_hit": -3, + "max_charges": 100, + "initial_charges": 100, + "ammo": "gasfilter_m", + "use_action": "GASMASK", + "material": [ "kevlar", "fur" ], + "symbol": "[", + "color": "light_gray", + "covers": [ "MOUTH", "EYES" ], + "coverage": 100, + "encumbrance": 30, + "warmth": 75, + "material_thickness": 3, + "environmental_protection": 1, + "environmental_protection_with_filter": 15, + "qualities": [ [ "GLARE", 1 ] ], + "flags": [ "VARSIZE", "STURDY" ] + }, + { + "id": "mask_wsurvivorxl", + "type": "TOOL_ARMOR", + "category": "armor", + "name": "XL winter survivor mask", + "description": "A custom-built, fur-trimmed gas mask that covers the face and eyes regardless of your state of mutation. Quite warm, it still provides excellent protection from smoke, teargas, and shrapnel. It must be prepared before use.", + "weight": 1062, + "volume": 5, + "price": 24000, + "to_hit": -3, + "max_charges": 100, + "initial_charges": 100, + "ammo": "gasfilter_m", + "use_action": "GASMASK", + "material": [ "kevlar", "fur" ], + "symbol": "[", + "color": "light_gray", + "covers": [ "MOUTH", "EYES" ], + "coverage": 100, + "encumbrance": 35, + "warmth": 75, + "material_thickness": 3, + "environmental_protection": 1, + "environmental_protection_with_filter": 15, + "qualities": [ [ "GLARE", 1 ] ], + "flags": [ "VARSIZE", "STURDY", "OVERSIZE" ] + }, + { + "id": "hazmat_suit", + "type": "TOOL_ARMOR", + "name": "hazmat suit", + "description": "An impermeable whole-body garment worn as protection against hazardous materials. Though very restrictive and fragile, wearing it will provide complete protection against ambient radiation. It must be prepared before use.", + "weight": 5000, + "volume": 68, + "price": 117500, + "max_charges": 100, + "initial_charges": 100, + "ammo": "gasfilter_l", + "use_action": "GASMASK", + "material": [ "plastic" ], + "symbol": "[", + "color": "yellow", + "covers": [ "HEAD", "MOUTH", "EYES", "TORSO", "ARMS", "HANDS", "LEGS", "FEET" ], + "coverage": 100, + "encumbrance": 37, + "warmth": 40, + "material_thickness": 2, + "environmental_protection": 1, + "environmental_protection_with_filter": 20, + "flags": [ "VARSIZE", "WATERPROOF", "RAINPROOF", "RAD_PROOF", "ELECTRIC_IMMUNE", "OUTER" ] + }, + { + "id": "anbc_suit", + "type": "TOOL_ARMOR", + "category": "armor", + "name": "ANBC suit", + "description": "An armored, impermeable full-body suit that functions as body armor, as well as protecting from nuclear, biological, and chemical hazards. It must be prepared before use.", + "weight": 8700, + "volume": 80, + "price": 400000, + "max_charges": 100, + "initial_charges": 100, + "ammo": "gasfilter_l", + "use_action": "GASMASK", + "material": [ "kevlar", "plastic" ], + "symbol": "[", + "color": "light_red", + "covers": [ "HEAD", "MOUTH", "EYES", "TORSO", "ARMS", "HANDS", "LEGS", "FEET" ], + "coverage": 100, + "encumbrance": 45, + "warmth": 50, + "material_thickness": 3, + "environmental_protection": 1, + "environmental_protection_with_filter": 20, + "flags": [ "VARSIZE", "WATERPROOF", "RAINPROOF", "STURDY", "RAD_PROOF", "ELECTRIC_IMMUNE", "OUTER" ] + }, { "id": "goggles_nv", "type": "TOOL_ARMOR", diff --git a/data/json/items/tools.json b/data/json/items/tools.json index 88401f2e7fba..96e1edd1b380 100644 --- a/data/json/items/tools.json +++ b/data/json/items/tools.json @@ -8301,7 +8301,7 @@ "material": "veggy", "symbol": ";", "color": "brown", - "use_action": "FEEDCATTLE" + "use_action": "CATTLEFODDER" }, { "id": "link_sheet", diff --git a/data/json/items/vehicle_parts.json b/data/json/items/vehicle_parts.json index 8a8e3feae8b0..e970a5bbef5b 100644 --- a/data/json/items/vehicle_parts.json +++ b/data/json/items/vehicle_parts.json @@ -68,32 +68,50 @@ "id" : "basket", "name" : "wire basket", "description" : "A large wire basket from a shopping cart.", - "weight" : 3000, + "weight" : 6000, "to_hit" : -5, "color" : "cyan", "symbol" : "]", "material" : ["steel"], "techniques" : ["DEF_DISARM"], - "volume" : 60, + "volume" : 90, "bashing" : 20, "category" : "veh_parts", - "price" : 5500 - },{ + "price" : 10000 + }, + { "type":"GENERIC", "id" : "folding_basket", "name" : "folding wire basket", "description" : "A large wire basket from a shopping cart, modified to be foldable.", - "weight" : 4000, + "weight" : 7000, "to_hit" : -5, "color" : "cyan", "symbol" : "]", "material" : ["steel"], "techniques" : ["DEF_DISARM"], - "volume" : 60, + "volume" : 90, "bashing" : 20, "category" : "veh_parts", - "price" : 5500 - },{ + "price" : 10000 + }, + { + "type":"GENERIC", + "id" : "bike_basket", + "name" : "bike basket", + "description" : "A simple bike basket. It is small and foldable.", + "weight" : 1200, + "to_hit" : -5, + "color" : "cyan", + "symbol" : "]", + "material" : ["steel"], + "techniques" : ["DEF_DISARM"], + "volume" : 20, + "bashing" : 20, + "category" : "veh_parts", + "price" : 3500 + }, + { "type":"GENERIC", "id" : "frame_wood", "name" : "wooden frame", diff --git a/data/json/mapgen/basement/basement_bionic.json b/data/json/mapgen/basement/basement_bionic.json new file mode 100644 index 000000000000..f75de6513b1e --- /dev/null +++ b/data/json/mapgen/basement/basement_bionic.json @@ -0,0 +1,146 @@ +[ + { + "type": "monstergroup", + "name": "GROUP_BROKEN_CYBORG", + "default": "mon_broken_cyborg", + "monsters": [ { "monster": "mon_broken_cyborg", "freq": 75, "cost_multiplier": 1 } ] + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "basement" ], + "weight": 250, + "object": { + "rotation": [ 0, 3 ], + "rows": [ + " |---------- ", + " |?..i|..LL| ", + " |/...+L...| ", + " |.ccc|L...| ", + "|-------------+---------", + "|{{{{{|bbbbbb|...rrccrr|", + "|.....|s....b|ff.......|", + "|___..|s.t..b|...cccccc|", + "|.....|a....b|.........|", + "|^..!.............s.t..|", + "|.................s.t..|", + "|%..@.............s.t..|", + "|................|-----|", + "|.........|++|...|&...i|", + "|.........|..|...+....C|", + "|..}......|<<|...|.cc.*|", + "------------------------", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "palettes": [ "basement_game" ], + "furniture": { + "}": "f_pinball_machine", + "*": "f_shower", + "!": "f_ergometer", + "@": "f_treadmill", + "^": "f_exercise", + "%": "f_floor_canvas", + "C": "f_cupboard", + "{": "f_bigmirror", + "_": "f_bench", + "L": "f_locker", + "?": "f_autodoc", + "/": "f_autodoc_couch" + }, + "place_loot": [ + { "group": "alcohol", "x": [ 14, 15 ], "y": 6, "chance": 96, "repeat": [ 1, 2 ] }, + { "group": "fridgesnacks", "x": [ 14, 15 ], "y": 6, "chance": 80, "repeat": [ 1, 2 ] }, + { "group": "homebooks", "x": [ 7, 12 ], "y": 5, "chance": 70, "repeat": [ 1, 2 ] }, + { "group": "homebooks", "x": 12, "y": [ 6, 8 ], "chance": 70, "repeat": [ 1, 2 ] }, + { "group": "magazines", "x": 20, "y": [ 10, 12 ], "chance": 30 }, + { "group": "magazines", "x": 9, "y": 7, "chance": 30 }, + { "group": "snacks", "x": [ 17, 22 ], "y": 5, "chance": 40, "repeat": [ 1, 2 ] }, + { "group": "snacks", "x": [ 17, 22 ], "y": 7, "chance": 40, "repeat": [ 1, 2 ] }, + { "group": "softdrugs", "x": 22, "y": 14, "chance": 75, "repeat": [ 1, 2 ] }, + { "group": "cleaning", "x": 11, "y": [ 2, 3 ], "chance": 70, "repeat": [ 1, 2 ] }, + { "group": "cleaning", "x": [ 13, 14 ], "y": 1, "chance": 70, "repeat": [ 1, 2 ] }, + { "group": "surgery", "x": [ 8, 9 ], "y": 3, "chance": 70, "repeat": [ 1, 2 ] }, + { "group": "bionics_common", "x": 7, "y": 3 }, + { "item": "television", "x": 22, "y": 10, "chance": 95 }, + { "item": "soap", "x": 19, "y": 15, "chance": 80 }, + { "item": "towel", "x": 20, "y": 15, "chance": 80 }, + { "item": "towel", "x": 2, "y": 7, "chance": 60 }, + { "item": "stereo", "x": 1, "y": 7, "chance": 50 } + ], + "place_monsters": [ { "monster": "GROUP_BROKEN_CYBORG", "x": 11, "y": 10, "chance": 1 } ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "basement" ], + "weight": 250, + "object": { + "rotation": [ 0, 3 ], + "rows": [ + " ------ ", + " |..LL| ", + " |L...| ", + " |L...| ", + "|-------------+---------", + "|{{{{{|bbbbbb|...rrccrr|", + "|.....|s....b|ff.......|", + "|___..|s.t..b|...cccccc|", + "|.....|a....b|.........|", + "|^..!.............s.t..|", + "|.................s.t..|", + "|%..@.............s.t..|", + "|................|-----|", + "|.........|++|...|&...i|", + "|.........|..|...+....C|", + "|..}......|<<|...|.cc.*|", + "------------------------", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "palettes": [ "basement_game" ], + "furniture": { + "}": "f_pinball_machine", + "*": "f_shower", + "!": "f_ergometer", + "@": "f_treadmill", + "^": "f_exercise", + "%": "f_floor_canvas", + "C": "f_cupboard", + "{": "f_bigmirror", + "_": "f_bench", + "L": "f_locker" + }, + "place_loot": [ + { "group": "alcohol", "x": [ 14, 15 ], "y": 6, "chance": 96, "repeat": [ 1, 2 ] }, + { "group": "fridgesnacks", "x": [ 14, 15 ], "y": 6, "chance": 80, "repeat": [ 1, 2 ] }, + { "group": "homebooks", "x": [ 7, 12 ], "y": 5, "chance": 70, "repeat": [ 1, 2 ] }, + { "group": "homebooks", "x": 12, "y": [ 6, 8 ], "chance": 70, "repeat": [ 1, 2 ] }, + { "group": "magazines", "x": 20, "y": [ 10, 12 ], "chance": 30 }, + { "group": "magazines", "x": 9, "y": 7, "chance": 30 }, + { "group": "snacks", "x": [ 17, 22 ], "y": 5, "chance": 40, "repeat": [ 1, 2 ] }, + { "group": "snacks", "x": [ 17, 22 ], "y": 7, "chance": 40, "repeat": [ 1, 2 ] }, + { "group": "softdrugs", "x": 22, "y": 14, "chance": 75, "repeat": [ 1, 2 ] }, + { "group": "cleaning", "x": 11, "y": [ 2, 3 ], "chance": 70, "repeat": [ 1, 2 ] }, + { "group": "cleaning", "x": [ 13, 14 ], "y": 1, "chance": 70, "repeat": [ 1, 2 ] }, + { "item": "television", "x": 22, "y": 10, "chance": 95 }, + { "item": "soap", "x": 19, "y": 15, "chance": 80 }, + { "item": "towel", "x": 20, "y": 15, "chance": 80 }, + { "item": "towel", "x": 2, "y": 7, "chance": 60 }, + { "item": "stereo", "x": 1, "y": 7, "chance": 50 } + ], + "place_monsters": [ { "monster": "GROUP_ZOMBIE", "x": [ 5, 17 ], "y": [ 9, 11 ], "chance": 2 } ] + } + } +] diff --git a/data/json/mapgen_palettes/basement.json b/data/json/mapgen_palettes/basement.json index 06d8669e0f52..2ce5ca07c067 100644 --- a/data/json/mapgen_palettes/basement.json +++ b/data/json/mapgen_palettes/basement.json @@ -9,6 +9,16 @@ ".": "t_rock_floor", "<": "t_stairs_up", "&": "t_rock_floor", + "*": "t_rock_floor", + "%": "t_rock_floor", + "}": "t_rock_floor", + "@": "t_rock_floor", + "!": "t_rock_floor", + "^": "t_rock_floor", + "{": "t_rock_floor", + "_": "t_rock_floor", + "?": "t_rock_floor", + "/": "t_rock_floor", "a": "t_rock_floor", "b": "t_rock_floor", "c": "t_rock_floor", @@ -20,6 +30,8 @@ "s": "t_rock_floor", "t": "t_rock_floor", "w": "t_rock_floor", + "C": "t_rock_floor", + "L": "t_rock_floor", "|": "t_wall" }, "furniture": { diff --git a/data/json/monsters.json b/data/json/monsters.json index 124fbefea38e..0e4a8d0feda3 100644 --- a/data/json/monsters.json +++ b/data/json/monsters.json @@ -1289,7 +1289,7 @@ "melee_cut": 6, "dodge": 2, "armor_bash": 2, - "starting_ammo": { "milk": 4 }, + "starting_ammo": { "milk": 10 }, "path_settings": { "max_dist": 10 }, "anger_triggers": [ "HURT" ], "fear_triggers": [ "PLAYER_CLOSE" ], @@ -1301,7 +1301,7 @@ }, "death_function": [ "NORMAL" ], "harvest": "animal_large", - "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "MILKABLE", "PET_WONT_FOLLOW" ] + "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "CATTLEFODDER", "MILKABLE", "PET_WONT_FOLLOW", "BONES", "FAT", "LEATHER" ] }, { "id": "mon_coyote", @@ -2300,6 +2300,7 @@ "armor_cut": 10, "special_attacks": [ [ "FUNGUS_SPROUT", 10 ] ], "death_function": [ "FUNGUS", "NORMAL" ], + "harvest": "fungaloid_mass", "flags": [ "NOHEAD", "POISON", "IMMOBILE", "NO_BREATHE", "QUEEN" ] }, { @@ -2324,6 +2325,7 @@ "luminance": 200, "special_attacks": [ [ "FUNGUS_BIG_BLOSSOM", 10 ] ], "death_function": [ "FUNGUS", "NORMAL" ], + "harvest": "fungaloid_mass", "flags": [ "NOHEAD", "POISON", "IMMOBILE", "NO_BREATHE", "QUEEN" ] }, { @@ -2352,6 +2354,7 @@ "special_attacks": [ [ "FUNGUS_FORTIFY", 10 ] ], "death_drops": "marloss_yellow_drops", "death_function": [ "FUNGUS", "NORMAL" ], + "harvest": "fungaloid_mass", "flags": [ "NOHEAD", "POISON", "IMMOBILE", "HARDTOSHOOT", "NO_BREATHE", "QUEEN" ] }, { @@ -2867,7 +2870,7 @@ "placate_triggers": [ "PLAYER_WEAK" ], "death_function": [ "NORMAL" ], "harvest": "animal_large", - "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM" ] + "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "CATTLEFODDER", "PET_WONT_FOLLOW", "PATH_AVOID_DANGER_1", "WARM", "BONES", "FAT", "LEATHER" ] }, { "id": "mon_human_snail", @@ -3888,11 +3891,12 @@ "melee_dice_sides": 6, "melee_cut": 2, "dodge": 2, + "starting_ammo": { "milk": 2 }, "anger_triggers": [], "fear_triggers": [ "SOUND", "PLAYER_CLOSE", "FRIEND_ATTACKED" ], "placate_triggers": [ "PLAYER_WEAK" ], "death_function": [ "NORMAL" ], - "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "WOOL", "BONES", "FAT" ] + "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "WOOL", "BONES", "FAT", "CATTLEFODDER", "MILKABLE", "PET_WONT_FOLLOW" ] }, { "id": "mon_shia", diff --git a/data/json/recipes/armor/other.json b/data/json/recipes/armor/other.json index b4ba4abf2c51..2fdd6e28632b 100644 --- a/data/json/recipes/armor/other.json +++ b/data/json/recipes/armor/other.json @@ -190,6 +190,62 @@ [ [ "scrap", 2 ], [ "can_food_unsealed", 1 ], [ "can_drink_unsealed", 1 ], [ "canister_empty", 1 ] ] ] }, + { + "result": "gasfilter_s", + "type": "recipe", + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_OTHER", + "skill_used": "fabrication", + "difficulty": 2, + "skills_required": [ "fabrication", 2 ], + "time": 5000, + "reversible": true, + "decomp_learn": 2, + "autolearn": true, + "components": [ [ [ "charcoal", 5 ] ], [ [ "paper", 2 ] ], [ [ "bag_plastic", 1 ] ] ] + }, + { + "result": "gasfilter_m", + "type": "recipe", + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_OTHER", + "skill_used": "fabrication", + "difficulty": 2, + "skills_required": [ "fabrication", 2 ], + "time": 10000, + "reversible": true, + "decomp_learn": 2, + "autolearn": true, + "components": [ [ [ "charcoal", 10 ] ], [ [ "paper", 2 ] ], [ [ "bag_plastic", 1 ] ] ] + }, + { + "result": "gasfilter_l", + "type": "recipe", + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_OTHER", + "skill_used": "fabrication", + "difficulty": 5, + "skills_required": [ "cooking", 1 ], + "time": 60000, + "reversible": true, + "decomp_learn": 4, + "book_learn": [ + [ "textbook_fireman", 4 ], + [ "atomic_survival", 4 ], + [ "adv_chemistry", 4 ], + [ "textbook_chemistry", 4 ], + [ "emergency_book", 3 ], + [ "textbook_gaswarfare", 4 ] + ], + "using": [ [ "soldering_standard", 10 ] ], + "qualities": [ { "id": "SCREW", "level": 1 } ], + "components": [ + [ [ "oxy_powder", 50 ] ], + [ [ "charcoal", 5 ], [ "coal_lump", 5 ] ], + [ [ "superglue", 1 ] ], + [ [ "scrap", 2 ], [ "can_food_unsealed", 1 ], [ "can_drink_unsealed", 1 ], [ "canister_empty", 1 ] ] + ] + }, { "result": "sleeping_bag", "type": "recipe", diff --git a/data/json/recipes/recipe_others.json b/data/json/recipes/recipe_others.json index 5b916c2ff041..16b5261545be 100644 --- a/data/json/recipes/recipe_others.json +++ b/data/json/recipes/recipe_others.json @@ -1148,13 +1148,12 @@ "category": "CC_OTHER", "subcategory": "CSC_OTHER_PARTS", "skill_used": "fabrication", - "difficulty": 1, - "time": 8000, + "difficulty": 2, + "time": 50000, "reversible": true, "autolearn": true, - "qualities": [ { "id": "GLARE", "level": 2 } ], - "tools": [ [ [ "welder", 50 ], [ "welder_crude", 75 ], [ "toolset", 75 ], [ "oxy_torch", 10 ] ] ], - "components": [ [ [ "wire", 6 ] ] ] + "using": [ [ "welding_standard", 5 ], [ "cutting_wire_standard", 1 ] ], + "components": [ [ [ "wire", 40 ] ] ] }, { "type": "recipe", @@ -1162,13 +1161,25 @@ "category": "CC_OTHER", "subcategory": "CSC_OTHER_PARTS", "skill_used": "fabrication", + "difficulty": 2, + "time": 60000, + "reversible": true, + "autolearn": true, + "using": [ [ "welding_standard", 5 ], [ "cutting_wire_standard", 1 ] ], + "components": [ [ [ "wire", 40 ], [ "basket", 1 ] ], [ [ "scrap", 8 ] ] ] + }, + { + "type": "recipe", + "result": "bike_basket", + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_PARTS", + "skill_used": "fabrication", "difficulty": 1, - "time": 8000, + "time": 35000, "reversible": true, "autolearn": true, - "qualities": [ { "id": "GLARE", "level": 2 } ], - "tools": [ [ [ "welder", 50 ], [ "welder_crude", 75 ], [ "toolset", 75 ], [ "oxy_torch", 10 ] ] ], - "components": [ [ [ "wire", 6 ], [ "basket", 1 ] ], [ [ "scrap", 8 ] ] ] + "using": [ [ "welding_standard", 2 ], [ "cutting_wire_standard", 1 ] ], + "components": [ [ [ "wire", 8 ] ] ] }, { "type": "recipe", diff --git a/data/json/requirements/toolsets.json b/data/json/requirements/toolsets.json index dc8d88ec9f5c..1c6e6db0d791 100644 --- a/data/json/requirements/toolsets.json +++ b/data/json/requirements/toolsets.json @@ -40,5 +40,11 @@ "type": "requirement", "//": "Soldering metal items", "tools": [ [ [ "soldering_iron", 1 ], [ "toolset", 1 ] ] ] + }, + { + "id": "cutting_wire_standard", + "type": "requirement", + "//": "Cutting wires", + "tools": [ [ [ "hacksaw", -1 ], [ "multitool", -1 ], [ "boltcutters", -1 ], [ "toolset", -1 ] ] ] } ] diff --git a/data/json/terrain.json b/data/json/terrain.json index cc71cd6d4451..f06b9ff3c924 100644 --- a/data/json/terrain.json +++ b/data/json/terrain.json @@ -43,7 +43,10 @@ "sound": "crash!", "sound_fail": "bash!", "ter_set": "t_null", - "items": [ { "item": "rock", "count": [6, 10] } ] + "items": [ + { "item": "rock", "count": [5, 8] }, + { "item": "brick", "count": [1, 3] } + ] } },{ "type" : "terrain", @@ -61,7 +64,8 @@ "sound_fail": "bash!", "ter_set": "t_null", "items": [ - { "item": "rock", "count": [10, 20] } + { "item": "rock", "count": [8, 15] }, + { "item": "brick", "count": [2, 6] } ] } },{ diff --git a/data/json/vehicle_parts.json b/data/json/vehicle_parts.json index 406a0447aa84..a47586f9f546 100644 --- a/data/json/vehicle_parts.json +++ b/data/json/vehicle_parts.json @@ -776,12 +776,16 @@ "broken_color": "brown", "damage_modifier": 60, "durability": 75, - "folded_volume": 4, - "size": 60, - "item": "wire", + "folded_volume": 6, + "size": 80, + "item": "bike_basket", "difficulty": 1, "location": "center", - "flags": [ "CARGO", "TOOL_SCREWDRIVER", "BOARDABLE", "FOLDABLE" ] + "flags": [ "CARGO", "TOOL_SCREWDRIVER", "BOARDABLE", "FOLDABLE" ], + "requirements": { + "install": { "time": 15000, "skills": [ [ "mechanics", 1 ] ], "qualities": [ { "id": "SCREW", "level": 1 } ] }, + "repair": { "skills": [ [ "mechanics", 1 ], [ "fabrication", 1 ] ], "time": 25000, "using": [ [ "welding_standard", 1 ] ] }, + "removal": { "skills": [ [ "mechanics", 1 ] ], "qualities": [ { "id": "SCREW", "level": 1 } ] } } }, { "type": "vehicle_part", @@ -793,11 +797,15 @@ "broken_color": "brown", "damage_modifier": 60, "durability": 75, - "size": 200, + "size": 600, "item": "basket", "difficulty": 1, "location": "center", - "flags": [ "CARGO", "OBSTACLE" ] + "flags": [ "CARGO", "OBSTACLE" ], + "requirements": { + "install": { "time": 45000, "skills": [ [ "mechanics", 1 ] ], "using": [ [ "welding_standard", 2 ] ] }, + "repair": { "skills": [ [ "mechanics", 1 ], [ "fabrication", 2 ] ], "time": 35000, "using": [ [ "welding_standard", 2 ] ] }, + "removal": { "skills": [ [ "mechanics", 1 ] ], "qualities": [ { "id": "SAW_M", "level": 1 } ] } } }, { "type": "vehicle_part", @@ -809,12 +817,16 @@ "broken_color": "brown", "damage_modifier": 60, "durability": 75, - "size": 200, + "size": 600, + "folded_volume": 24, "item": "folding_basket", "difficulty": 1, "location": "center", "flags": [ "CARGO", "OBSTACLE", "FOLDABLE" ], - "folded_volume": 12 + "requirements": { + "install": { "time": 45000, "skills": [ [ "mechanics", 1 ] ], "using": [ [ "welding_standard", 2 ] ] }, + "repair": { "skills": [ [ "mechanics", 1 ], [ "fabrication", 2 ] ], "time": 35000, "using": [ [ "welding_standard", 2 ] ] }, + "removal": { "skills": [ [ "mechanics", 1 ] ], "qualities": [ { "id": "SAW_M", "level": 1 } ] } } }, { "type": "vehicle_part", diff --git a/doc/JSON_FLAGS.md b/doc/JSON_FLAGS.md index b972b70f68a4..d62b60f4e7cf 100755 --- a/doc/JSON_FLAGS.md +++ b/doc/JSON_FLAGS.md @@ -219,6 +219,7 @@ Flags used to describe monsters and define their properties and abilities. - ```BORES``` Tunnels through just about anything (15x bash multiplier: dark wyrms' bash skill 12->180) - ```CAN_DIG``` Can dig _and_ walk. - ```CATFOOD``` Becomes friendly / tamed with cat food. +- ```CATTLEFODDER``` Becomes friendly / tamed with cattle fodder. - ```CBM_CIV``` May produce a common CBM a power CBM when butchered. - ```CBM_OP``` May produce a CBM or two from 'bionics_op' item group when butchered. - ```CBM_POWER``` May produce a power CBM when butchered, independent of CBM. @@ -255,6 +256,7 @@ Flags used to describe monsters and define their properties and abilities. - ```KEENNOSE``` Keen sense of smell. - ```LARVA``` Creature is a larva. Currently used for gib and blood handling. - ```LEATHER``` May produce leather when butchered. +- ```MILKABLE``` Produces milk when milked. - ```NIGHT_INVISIBILITY``` Monster becomes invisible if it's more than one tile away and the lighting on its tile is LL_LOW or less. Visibility is not affected by night vision. - ```NOHEAD``` Headshots not allowed! - ```NOGIB``` Does not leave gibs / meat chunks when killed with huge damage. @@ -752,6 +754,7 @@ Some armor flags, such as `WATCH` and `ALARMCLOCK` are compatible with other ite - ```BLECH``` Causes vomiting. - ```CAFF``` Reduces fatigue. - ```CATFOOD``` Makes a cat friendly. +- ```CATTLEFODDER``` Makes a large herbivore friendly. - ```CHEW``` Displays message "You chew your %s", but otherwise does nothing. - ```CIG``` Alleviates nicotine cravings. Adds disease `cig`. - ```COKE``` Decreases hunger. Adds disease `high`. diff --git a/lang/po/cataclysm-dda.pot b/lang/po/cataclysm-dda.pot index b6e34e380a89..c78680dd7b25 100644 --- a/lang/po/cataclysm-dda.pot +++ b/lang/po/cataclysm-dda.pot @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: cataclysm-dda 0.C\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-06-09 21:55+0800\n" +"POT-Creation-Date: 2018-06-15 19:51+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -21202,7 +21202,7 @@ msgstr[1] "" #: lang/json/COMESTIBLE_from_json.py msgid "" "A tasty collection of wild herbs including violet, sassafras, mint, clover, " -"purslane, and burdock." +"purslane, fireweed, and burdock." msgstr "" #: lang/json/COMESTIBLE_from_json.py @@ -36405,6 +36405,7 @@ msgid "chicken" msgstr "" #. ~ Description for chicken +#. ~ Description for chicken chick #: lang/json/MONSTER_from_json.py msgid "" "A domesticated descendant of junglefowl, it may still be the most numerous " @@ -36702,6 +36703,19 @@ msgid "" "mayhem around it." msgstr "" +#: lang/json/MONSTER_from_json.py +msgid "zombie burner" +msgstr "" + +#. ~ Description for zombie burner +#: lang/json/MONSTER_from_json.py +msgid "" +"Realizing that bullets weren't enough, the army dispatched flamethrower " +"units to burn the walking dead. Unfortunately, there were too many zombies " +"and not enough flamers. It seems that the tank of the undead soldier you " +"see before you is damaged." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "flaming eye" msgstr "" @@ -38440,6 +38454,50 @@ msgid "" "and its eyes bulge with black goo." msgstr "" +#: lang/json/MONSTER_from_json.py +msgid "skittering plague" +msgstr "" + +#. ~ Description for skittering plague +#: lang/json/MONSTER_from_json.py +msgid "A giant infected roach, it has been feeding on the undead." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "plague nymph" +msgstr "" + +#. ~ Description for plague nymph +#: lang/json/MONSTER_from_json.py +msgid "An infected mutant cockroach about the size of a rat." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "plague vector" +msgstr "" + +#. ~ Description for plague vector +#: lang/json/MONSTER_from_json.py +msgid "" +"This infected roach has been feeding on the undead and started to mutate " +"chaotically. Extra limbs and growths sprout from its thorax." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "triffid sprig" +msgstr "" + +#. ~ Description for triffid sprig +#: lang/json/MONSTER_from_json.py +msgid "" +"A teeny-tiny triffid that has recently germinated. Like a house cat, you " +"know it wants to eat you but it just can't figure out how." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "chicken chick" +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "security bot" msgstr "" @@ -52107,6 +52165,10 @@ msgstr "" msgid "You lie down to go to sleep..." msgstr "" +#: lang/json/effects_from_json.py src/player_hardcoded_effects.cpp +msgid "You fall asleep." +msgstr "" + #: lang/json/effects_from_json.py msgid "You wake up." msgstr "" @@ -53153,12 +53215,15 @@ msgid "A road barricade. For barricading roads." msgstr "" #: lang/json/furniture_from_json.py +#: lang/json/furniture_from_json.py lang/json/terrain_from_json.py #: lang/json/terrain_from_json.py -#: src/map.cpp src/mapdata.cpp +#: lang/json/terrain_from_json.py src/map.cpp +#: src/mapdata.cpp msgid "smash!" msgstr "" #: lang/json/furniture_from_json.py +#: lang/json/furniture_from_json.py lang/json/terrain_from_json.py #: lang/json/terrain_from_json.py msgid "whump." msgstr "" @@ -53195,8 +53260,9 @@ msgid "Pin some notes for other survivors to read." msgstr "" #: lang/json/furniture_from_json.py +#: lang/json/furniture_from_json.py lang/json/terrain_from_json.py #: lang/json/terrain_from_json.py -#: lang/json/terrain_from_json.py src/iuse.cpp +#: src/iuse.cpp msgid "crunch!" msgstr "" @@ -53558,6 +53624,7 @@ msgid "glass breaking" msgstr "" #: lang/json/furniture_from_json.py +#: lang/json/furniture_from_json.py lang/json/terrain_from_json.py #: lang/json/terrain_from_json.py msgid "whack!" msgstr "" @@ -54071,6 +54138,24 @@ msgstr "" msgid "thunk!" msgstr "" +#: lang/json/furniture_from_json.py +msgid "autodoc" +msgstr "" + +#. ~ Description for autodoc +#: lang/json/furniture_from_json.py +msgid "A medical apparatus for automated diagnosis and healing." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "autodoc couch" +msgstr "" + +#. ~ Description for autodoc couch +#: lang/json/furniture_from_json.py +msgid "A special medical couch connected with the adjacent autodoc." +msgstr "" + #: lang/json/furniture_from_json.py msgid "mutated cactus" msgstr "" @@ -54489,6 +54574,16 @@ msgstr[1] "" msgid "Fake gun that fires acid globs." msgstr "" +#: lang/json/gun_from_json.py +msgid "reach bow" +msgid_plural "reach bows" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "A test item that is both a ranged weapon and a reach weapon" +msgstr "" + #: lang/json/gun_from_json.py msgid "BB gun" msgid_plural "BB guns" @@ -78423,8 +78518,8 @@ msgstr "" #: lang/json/skill_from_json.py msgid "" "Your skill in using bow weapons, from hand-carved self bows to complex " -"hunting crossbows. Quiet and effective, they require strength of body and " -"sight to wield, and are not terribly accurate over a long distance." +"compound bows. Quiet and effective, they require strength of body and sight " +"to wield, and are not terribly accurate over a long distance." msgstr "" #: lang/json/skill_from_json.py @@ -78487,7 +78582,7 @@ msgid "" "immense destructive power, but they are cumbersome and hard to manage." msgstr "" -#: lang/json/skill_from_json.py +#: lang/json/skill_from_json.py src/item_factory.cpp msgid "melee" msgstr "" @@ -97151,11 +97246,13 @@ msgstr[1] "" #: src/crafting.cpp src/game.cpp #: src/game.cpp #: src/iexamine.cpp +#: src/iexamine.cpp src/iuse.cpp #: src/iuse.cpp #: src/iuse.cpp src/iuse_actor.cpp #: src/iuse_actor.cpp +#: src/iuse_actor.cpp src/npctalk.cpp #: src/npctalk.cpp -#: src/npctalk.cpp src/pickup.cpp src/player.cpp +#: src/npctalk.cpp src/pickup.cpp #: src/player.cpp #: src/player.cpp src/veh_interact.cpp msgid "Never mind." @@ -106703,6 +106800,42 @@ msgstr "" msgid "You may have problems climbing back up. Climb down?" msgstr "" +#: src/iexamine.cpp +msgid "Autodoc Mk. XI. Status: Online. Please choose operation." +msgstr "" + +#: src/iexamine.cpp +msgid "Choose Compact Bionic Module to install." +msgstr "" + +#: src/iexamine.cpp +msgid "Do nothing." +msgstr "" + +#: src/iexamine.cpp +msgid "No connected couches found. Operation impossible. Exiting." +msgstr "" + +#: src/iexamine.cpp +msgid "" +"No patient found located on the connected couches. Operation impossible. " +"Exiting." +msgstr "" + +#: src/iexamine.cpp +msgid "Choose CBM to install" +msgstr "" + +#: src/iexamine.cpp +msgid "You type data into the console, configuring Autodoc to install a CBM." +msgstr "" + +#: src/iexamine.cpp +msgid "" +"Autodoc injected you with anesthesia, and while you were sleeping conducted " +"a medical operation on you." +msgstr "" + #: src/iexamine.cpp msgid "Use electrohack?" msgstr "" @@ -113864,6 +113997,16 @@ msgstr "" msgid "You fail to disarm the trap, and you set it off!" msgstr "" +#: src/map.cpp +#, c-format +msgid "Something has crawled out of the %s plants!" +msgstr "" + +#: src/map.cpp +#, c-format +msgid "Something has crawled out of the %s!" +msgstr "" + #: src/map_extras.cpp msgid "DANGER! MINEFIELD!" msgstr "" @@ -116954,6 +117097,15 @@ msgstr "" msgid "A cockroach nymph crawls out of the pregnant giant cockroach corpse." msgstr "" +#: src/mondeath.cpp +#, c-format +msgid "an explosion of tank of the %s's flamethrower!" +msgstr "" + +#: src/mondeath.cpp +msgid "I love the smell of burning zed in the morning." +msgstr "" + #: src/mondefense.cpp #, c-format msgid "Striking the %1$s shocks %2$s!" @@ -121354,6 +121506,16 @@ msgid "" "scenario requiring a city start." msgstr "" +#: src/options.cpp +msgid "Carrion spawn rate scaling factor" +msgstr "" + +#: src/options.cpp +msgid "" +"A scaling factor that determines how often creatures spawn from rotting " +"material." +msgstr "" + #: src/options.cpp msgid "( WIP feature ) Determines terrain, shops, plants, and more." msgstr "" @@ -124658,10 +124820,6 @@ msgctxt "memorial_female" msgid "Succumbed to the infection." msgstr "" -#: src/player_hardcoded_effects.cpp -msgid "You fall asleep." -msgstr "" - #: src/player_hardcoded_effects.cpp msgid "You nestle your pile of clothes for warmth." msgstr "" diff --git a/lang/po/de.po b/lang/po/de.po index 24f886af9482..91470b728a9a 100644 --- a/lang/po/de.po +++ b/lang/po/de.po @@ -15,7 +15,7 @@ msgid "" msgstr "" "Project-Id-Version: cataclysm-dda 0.C\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-06-01 19:14-0400\n" +"POT-Creation-Date: 2018-06-09 21:55+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Nico Brandt , 2018\n" "Language-Team: German (https://www.transifex.com/cataclysm-dda-translators/teams/2217/de/)\n" @@ -123215,8 +123215,19 @@ msgstr "Dort ist ein Holzkohleofen." #: src/iexamine.cpp #, c-format -msgid "It should take %d minutes to finish burning." -msgstr "Es sollte %d Minuten brauchen, bis es mit Brennen fertig ist." +msgid "It will finish burning in about %d hour." +msgid_plural "It will finish burning in about %d hours." +msgstr[0] "Es wird mit dem Brennen in ungefähr %d Stunde fertig sein." +msgstr[1] "Es wird mit dem Brennen in ungefähr %d Stunden fertig sein." + +#: src/iexamine.cpp +msgid "It will finish burning in less than an hour." +msgstr "Es wird mit dem Brennen in weniger als einer Stunde fertig sein." + +#: src/iexamine.cpp +#, c-format +msgid "It should take about %d minutes to finish burning." +msgstr "Es sollte etwa %d Minuten brauchen, bis es mit Brennen fertig ist." #: src/iexamine.cpp msgid "You have no brew to ferment." @@ -124438,8 +124449,8 @@ msgid "Compatible magazines: " msgstr "Kompatible Magazine: " #: src/item.cpp -msgid "Mods: " -msgstr "Mods: " +msgid "Mods: " +msgstr "Mods: " #: src/item.cpp #, c-format @@ -124761,8 +124772,8 @@ msgid "Contains items with qualities:" msgstr "Enthält Gegenstände mit Eigenschaften:" #: src/item.cpp -msgid "Techniques: " -msgstr "Techniken: " +msgid "Techniques when wielded: " +msgstr "Techniken, wenn getragen: " #: src/item.cpp msgid "* This item can be used to make long reach attacks." @@ -125278,6 +125289,10 @@ msgstr "kann %s nicht haben" msgid "isn't big enough to use that mod" msgstr "ist nicht groß genug, um diese Modifikation zu verwenden" +#: src/item.cpp +msgid "can only accept small mods on that slot" +msgstr "unterstützt nur kleine Mods in diesem Slot" + #. ~ %1$s - name of the gunmod, %2$s - name of the ammo #: src/item.cpp #, c-format diff --git a/lang/po/es_AR.po b/lang/po/es_AR.po index a4724f6d2736..d727d54e9802 100644 --- a/lang/po/es_AR.po +++ b/lang/po/es_AR.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: cataclysm-dda 0.C\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-06-01 19:14-0400\n" +"POT-Creation-Date: 2018-06-09 21:55+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Brett Dong , 2018\n" "Language-Team: Spanish (Argentina) (https://www.transifex.com/cataclysm-dda-translators/teams/2217/es_AR/)\n" @@ -22754,8 +22754,8 @@ msgid "" "Salted chips made from corn tortillas, could really use some cheese, maybe " "some beef." msgstr "" -"Son papas fritas saladas hechas con tortilla de maíz, a las que les vendría " -"bien un poco de queso, y carne también." +"Son nachos de maíz salados, a las que les vendría bien un poco de queso, y " +"carne también." #: lang/json/COMESTIBLE_from_json.py msgid "nachos with cheese" @@ -22769,8 +22769,8 @@ msgid "" "Salted chips made from corn tortillas, now with cheese. Could stand to have" " some meat." msgstr "" -"Son papas fritas saladas hechas con tortilla de maíz, ahora con queso. Le " -"vendría bien un poco de carne." +"Son nachos de maíz salados, ahora con queso. Le vendría bien un poco de " +"carne." #: lang/json/COMESTIBLE_from_json.py msgid "nachos with meat" @@ -22784,8 +22784,8 @@ msgid "" "Salted chips made from corn tortillas, now with meat. Could probably use " "some cheese, though." msgstr "" -"Son papas fritas saladas hechas con tortilla de maíz, ahora con carne. Le " -"vendría bien un poco de queso." +"Son nachos de maíz salados, ahora con carne. Le vendría bien un poco de " +"queso." #: lang/json/COMESTIBLE_from_json.py msgid "niño nachos" @@ -22799,6 +22799,8 @@ msgid "" "Salted chips made from corn tortillas, with human flesh. Some cheese might " "make it even better." msgstr "" +"Son nachos de maíz salados, con carne humana. Un poco de queso les quedaría " +"muy bien." #: lang/json/COMESTIBLE_from_json.py msgid "nachos with meat and cheese" @@ -22812,6 +22814,7 @@ msgid "" "Salted chips made from corn tortillas with ground meat and smothered in " "cheese. Delicious." msgstr "" +"Son nachos de maíz salados con carne picada y queso cremoso. Delicioso." #: lang/json/COMESTIBLE_from_json.py msgid "niño nachos with cheese" @@ -22825,6 +22828,7 @@ msgid "" "Salted chips made from corn tortillas with human flesh and smothered in " "cheese. Delicious." msgstr "" +"Son nachos de maíz salados con carne humana y queso cremoso. Delicioso." #: lang/json/COMESTIBLE_from_json.py msgid "popcorn kernels" @@ -30269,6 +30273,11 @@ msgid "" "flowers, holding gift baskets, containing a fruit basket and herbs, loose " "item storage or as an ice bucket." msgstr "" +"Es un balde galvanizado para llevar maní, vino frío, cerveza helada, " +"langostinos, patas de cangrejo, papas fritas, comida para animales, usar en " +"la granja, choripaneadas, fabricaciones, plantar flores, llevar canastas de " +"regalos, llevar canastas de fruta e hierbas, almacenar varios objetos o para" +" usar como balde de hielo." #: lang/json/CONTAINER_from_json.py msgid "hydration pack" @@ -44528,6 +44537,8 @@ msgstr "salmón" #: lang/json/MONSTER_from_json.py msgid "A salmon. A very fatty, nutritious fish. Tastes great smoked." msgstr "" +"Es un salmón. Es un pez bastante gordo y nutritivo. Ahumado tiene muy buen " +"sabor." #: lang/json/MONSTER_from_json.py msgid "sunfish" @@ -44611,7 +44622,7 @@ msgstr "" #: lang/json/MONSTER_from_json.py msgid "lobster" -msgstr "" +msgstr "langosta" #. ~ Description for lobster #: lang/json/MONSTER_from_json.py @@ -44626,7 +44637,7 @@ msgstr "" #: lang/json/MONSTER_from_json.py msgid "crayfish" -msgstr "" +msgstr "cangrejo de río" #. ~ Description for crayfish #: lang/json/MONSTER_from_json.py @@ -47310,6 +47321,9 @@ msgid "" "guard and a tassel attached to the pommel. One of the four major weapons in" " folklore, alongside the dao sabre, qiang spear, and gun staff." msgstr "" +"Es una antigua espada china recta de doble filo, con la guarda ornamentada y" +" una borla unida al pomo. Una de las cuatro armas principales de su " +"tradición, junto con el sable dao, la lanza qiang y el bastón gun." #. ~ Description for jian #: lang/json/TOOL_from_json.py @@ -48036,8 +48050,8 @@ msgstr "" #: lang/json/TOOL_from_json.py msgid "inactive anti-materiel turret" msgid_plural "inactive anti-materiel turrets" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "torreta anti-material inactiva" +msgstr[1] "torretas anti-material inactivas" #. ~ Description for inactive anti-materiel turret #: lang/json/TOOL_from_json.py @@ -48050,6 +48064,12 @@ msgid "" "turret will identify you as a friendly, and attack all enemies with a built-" "in rifle." msgstr "" +"Es una torreta anti-material inactiva. Usarla incluye cargar la unidad con " +"las balas .50 BMG que haya en tu inventario (si querés dividir tu munición, " +"dejá las .50 BMG que NO quieras ponerle a la torreta), después prenderla y " +"ubicarla en el suelo, donde se desplegará sola. Si se la reprograma e " +"instala correctamente, la torreta te identificará como aliado y atacará a " +"todos tus enemigos con su rifle incorporado." #: lang/json/TOOL_from_json.py msgid "inactive manhack" @@ -120839,8 +120859,19 @@ msgstr "Acá hay una fosa de carbonización." #: src/iexamine.cpp #, c-format -msgid "It should take %d minutes to finish burning." -msgstr "Debería tardar %d minutos en terminar la combustión." +msgid "It will finish burning in about %d hour." +msgid_plural "It will finish burning in about %d hours." +msgstr[0] "" +msgstr[1] "" + +#: src/iexamine.cpp +msgid "It will finish burning in less than an hour." +msgstr "" + +#: src/iexamine.cpp +#, c-format +msgid "It should take about %d minutes to finish burning." +msgstr "" #: src/iexamine.cpp msgid "You have no brew to ferment." @@ -122061,8 +122092,8 @@ msgid "Compatible magazines: " msgstr "Cargadores compatibles: " #: src/item.cpp -msgid "Mods: " -msgstr "Mods: " +msgid "Mods: " +msgstr "" #: src/item.cpp #, c-format @@ -122387,8 +122418,8 @@ msgid "Contains items with qualities:" msgstr "Contiene objetos con calidades:" #: src/item.cpp -msgid "Techniques: " -msgstr "Técnicas: " +msgid "Techniques when wielded: " +msgstr "" #: src/item.cpp msgid "* This item can be used to make long reach attacks." @@ -122905,6 +122936,10 @@ msgstr "no puede tener un/a %s" msgid "isn't big enough to use that mod" msgstr "no es suficientemente grande para usar esa modificación" +#: src/item.cpp +msgid "can only accept small mods on that slot" +msgstr "" + #. ~ %1$s - name of the gunmod, %2$s - name of the ammo #: src/item.cpp #, c-format diff --git a/lang/po/es_ES.po b/lang/po/es_ES.po index 69f84fd4a1c1..310c91145daf 100644 --- a/lang/po/es_ES.po +++ b/lang/po/es_ES.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: cataclysm-dda 0.C\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-06-01 19:14-0400\n" +"POT-Creation-Date: 2018-06-09 21:55+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Da WhatTheFox , 2018\n" "Language-Team: Spanish (Spain) (https://www.transifex.com/cataclysm-dda-translators/teams/2217/es_ES/)\n" @@ -119217,8 +119217,19 @@ msgstr "Aquí hay una fosa de carbonización." #: src/iexamine.cpp #, c-format -msgid "It should take %d minutes to finish burning." -msgstr "Debería tardar %d minutos en terminar la combustión." +msgid "It will finish burning in about %d hour." +msgid_plural "It will finish burning in about %d hours." +msgstr[0] "" +msgstr[1] "" + +#: src/iexamine.cpp +msgid "It will finish burning in less than an hour." +msgstr "" + +#: src/iexamine.cpp +#, c-format +msgid "It should take about %d minutes to finish burning." +msgstr "" #: src/iexamine.cpp msgid "You have no brew to ferment." @@ -120439,8 +120450,8 @@ msgid "Compatible magazines: " msgstr "Cargadores compatibles: " #: src/item.cpp -msgid "Mods: " -msgstr "Mods: " +msgid "Mods: " +msgstr "" #: src/item.cpp #, c-format @@ -120763,8 +120774,8 @@ msgid "Contains items with qualities:" msgstr "Contiene objetos con calidades:" #: src/item.cpp -msgid "Techniques: " -msgstr "Técnicas: " +msgid "Techniques when wielded: " +msgstr "" #: src/item.cpp msgid "* This item can be used to make long reach attacks." @@ -121275,6 +121286,10 @@ msgstr "no puedes tener un/a %s" msgid "isn't big enough to use that mod" msgstr "no es lo suficientemente grande como para usar esa modificación" +#: src/item.cpp +msgid "can only accept small mods on that slot" +msgstr "" + #. ~ %1$s - name of the gunmod, %2$s - name of the ammo #: src/item.cpp #, c-format diff --git a/lang/po/fr.po b/lang/po/fr.po index 909e26c5729f..638c6419abae 100644 --- a/lang/po/fr.po +++ b/lang/po/fr.po @@ -1,17 +1,17 @@ # Translators: # Mickaël Falck , 2018 -# Julien Maitre , 2018 -# Brett Dong , 2018 -# Argasm Voragz , 2018 # Jazz , 2018 # _hickop, 2018 +# Brett Dong , 2018 +# Argasm Voragz , 2018 +# Julien Maitre , 2018 # Réouven Assouly , 2018 # master zu, 2018 msgid "" msgstr "" "Project-Id-Version: cataclysm-dda 0.C\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-06-01 19:14-0400\n" +"POT-Creation-Date: 2018-06-09 21:55+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: master zu, 2018\n" "Language-Team: French (https://www.transifex.com/cataclysm-dda-translators/teams/2217/fr/)\n" @@ -5551,7 +5551,7 @@ msgstr "" #: lang/json/AMMO_from_json.py msgid "makeshift shotgun shot" -msgstr "balle de fusil de chasse de fortune" +msgstr "balle de fusil à pompe de fortune" #. ~ Description for makeshift shotgun shot #: lang/json/AMMO_from_json.py @@ -7452,7 +7452,7 @@ msgid "" "travels. It has a lot of storage space." msgstr "" "Une tenue de fortune faite de vêtements pré-cataclysme conçue pour de longs " -"voyages." +"voyages. Elle a beaucoup de poches." #: lang/json/ARMOR_from_json.py msgid "plated leather armor" @@ -33794,6 +33794,8 @@ msgid "" "A telescoping baton that collapses for easy storage. Makes an excellent " "melee weapon. Activate to expand." msgstr "" +"Une matraque télescopique qui se réduit pour un rangement plus facile. Fait " +"une excellente arme de mêlée. Activer pour développer" #: lang/json/GENERIC_from_json.py msgid "expandable baton (extended)" @@ -33817,6 +33819,8 @@ msgid "" "A telescoping baton that collapses for easy storage. Makes an excellent " "melee weapon. Activate to collapse." msgstr "" +"Une matraque télescopique qui se réduit pour un rangement plus facile. Fait " +"une excellente arme de mêlée. Activer pour réduire." #: lang/json/GENERIC_from_json.py msgid "bee sting" @@ -33828,17 +33832,18 @@ msgstr[1] "dards d'abeille" #: lang/json/GENERIC_from_json.py msgid "A six-inch stinger from a giant bee. Makes a mediocre melee weapon." msgstr "" +"Un dard de 6 pouces d'une abeille géante. Fait une arme médiocre de mêlée" #: lang/json/GENERIC_from_json.py msgid "fungal fighter sting" msgid_plural "fungal fighter stings" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Dard d'un guerrier fongique" +msgstr[1] "dards d'un guerrier fongique" #. ~ Description for fungal fighter sting #: lang/json/GENERIC_from_json.py msgid "A short dart from a fungal fighter. Makes an poor melee weapon." -msgstr "" +msgstr "Un petit dard d'un guerrier fongique. Fait une pauvre arme de Mélée." #: lang/json/GENERIC_from_json.py msgid "wasp sting" @@ -37037,8 +37042,8 @@ msgstr "" #: lang/json/GENERIC_from_json.py msgid "makeshift air filter" msgid_plural "makeshift air filters" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "filtre à air de fortune" +msgstr[1] "filtres à air de fortune" #. ~ Description for makeshift air filter #: lang/json/GENERIC_from_json.py @@ -37061,8 +37066,8 @@ msgstr "" #: lang/json/GENERIC_from_json.py msgid "makeshift automotive filter" msgid_plural "makeshift automotive filters" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "filtre pour voiture de fortune" +msgstr[1] "filtres pour voiture de fortune" #. ~ Description for makeshift automotive filter #: lang/json/GENERIC_from_json.py @@ -37200,8 +37205,8 @@ msgstr "" #: lang/json/GENERIC_from_json.py msgid "makeshift bayonet" msgid_plural "makeshift bayonets" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "baïonnette de fortune" +msgstr[1] "baïonnettes de fortune" #. ~ Description for makeshift bayonet #: lang/json/GENERIC_from_json.py @@ -37209,6 +37214,8 @@ msgid "" "A makeshift version of a bayonet that consists of a mere spike with some " "string." msgstr "" +"Une baïonnettes de fortune faite à partir d'une simple pointe et de " +"ficelles." #: lang/json/GENERIC_from_json.py msgid "aluminum ingot" @@ -37336,6 +37343,8 @@ msgid "" "A makeshift pallet lifter. If attached to a frame it could be used to lift " "up to 0.5 metric tonnes." msgstr "" +"Un porte palettes de fortune. Attachée à un cadre il peut être utilisé pour " +"lever jusqu’à une demi tonne." #: lang/json/GENERIC_from_json.py msgid "vehicle crafting rig" @@ -38004,8 +38013,8 @@ msgstr "" #: lang/json/GENERIC_from_json.py msgid "makeshift pot" msgid_plural "makeshift pots" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "pot de fortune" +msgstr[1] "pots de fortune" #. ~ Description for makeshift pot #: lang/json/GENERIC_from_json.py @@ -40106,7 +40115,7 @@ msgstr "Pas de monstres fongiques" #. ~ Description for No Fungal Monsters #: lang/json/MOD_INFO_from_json.py msgid "Removes fungal monsters and regions from the game." -msgstr "" +msgstr "Retire les monstres et les régions fongiques du jeux." #: lang/json/MOD_INFO_from_json.py msgid "No Medieval Items" @@ -77585,7 +77594,7 @@ msgstr "" #: lang/json/mutation_from_json.py msgid "Bee" -msgstr "" +msgstr "Abeille" #. ~ Description for Bee #: lang/json/mutation_from_json.py @@ -77593,6 +77602,8 @@ msgid "" "NPC trait that makes monsters see it as a bee. It is a bug (heh) if you " "have it." msgstr "" +"Trait d'un NPC faisant voir les monstres comme des abailles. C'est un bug " +"(eheh) si vous l'avez." #: lang/json/mutation_from_json.py msgid "mute" @@ -114436,8 +114447,19 @@ msgstr "Il y a un four à charbon ici." #: src/iexamine.cpp #, c-format -msgid "It should take %d minutes to finish burning." -msgstr "Il faut %d minutes pour que tout soit brûlé." +msgid "It will finish burning in about %d hour." +msgid_plural "It will finish burning in about %d hours." +msgstr[0] "" +msgstr[1] "" + +#: src/iexamine.cpp +msgid "It will finish burning in less than an hour." +msgstr "" + +#: src/iexamine.cpp +#, c-format +msgid "It should take about %d minutes to finish burning." +msgstr "" #: src/iexamine.cpp msgid "You have no brew to ferment." @@ -115628,7 +115650,7 @@ msgid "Compatible magazines: " msgstr "Chargeurs compatibles: " #: src/item.cpp -msgid "Mods: " +msgid "Mods: " msgstr "" #: src/item.cpp @@ -115946,8 +115968,8 @@ msgid "Contains items with qualities:" msgstr "Contient des objets avec les qualités:" #: src/item.cpp -msgid "Techniques: " -msgstr "Techniques: " +msgid "Techniques when wielded: " +msgstr "" #: src/item.cpp msgid "* This item can be used to make long reach attacks." @@ -116430,6 +116452,10 @@ msgstr "" msgid "isn't big enough to use that mod" msgstr "" +#: src/item.cpp +msgid "can only accept small mods on that slot" +msgstr "" + #. ~ %1$s - name of the gunmod, %2$s - name of the ammo #: src/item.cpp #, c-format diff --git a/lang/po/it_IT.po b/lang/po/it_IT.po index 9cfd627188b6..95fbb12f8e0e 100644 --- a/lang/po/it_IT.po +++ b/lang/po/it_IT.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: cataclysm-dda 0.C\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-06-01 19:14-0400\n" +"POT-Creation-Date: 2018-06-09 21:55+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: F D , 2018\n" "Language-Team: Italian (Italy) (https://www.transifex.com/cataclysm-dda-translators/teams/2217/it_IT/)\n" @@ -108877,8 +108877,19 @@ msgstr "C'è una carbonaia lì." #: src/iexamine.cpp #, c-format -msgid "It should take %d minutes to finish burning." -msgstr "Dovrebbe impiegare %d minuti per finire di bruciare." +msgid "It will finish burning in about %d hour." +msgid_plural "It will finish burning in about %d hours." +msgstr[0] "" +msgstr[1] "" + +#: src/iexamine.cpp +msgid "It will finish burning in less than an hour." +msgstr "" + +#: src/iexamine.cpp +#, c-format +msgid "It should take about %d minutes to finish burning." +msgstr "" #: src/iexamine.cpp msgid "You have no brew to ferment." @@ -110052,7 +110063,7 @@ msgid "Compatible magazines: " msgstr "" #: src/item.cpp -msgid "Mods: " +msgid "Mods: " msgstr "" #: src/item.cpp @@ -110368,8 +110379,8 @@ msgid "Contains items with qualities:" msgstr "" #: src/item.cpp -msgid "Techniques: " -msgstr "Tecniche:" +msgid "Techniques when wielded: " +msgstr "" #: src/item.cpp msgid "* This item can be used to make long reach attacks." @@ -110850,6 +110861,10 @@ msgstr "" msgid "isn't big enough to use that mod" msgstr "" +#: src/item.cpp +msgid "can only accept small mods on that slot" +msgstr "" + #. ~ %1$s - name of the gunmod, %2$s - name of the ammo #: src/item.cpp #, c-format diff --git a/lang/po/ja.po b/lang/po/ja.po index 69cbb0601580..52b151da3664 100644 --- a/lang/po/ja.po +++ b/lang/po/ja.po @@ -13,7 +13,7 @@ msgid "" msgstr "" "Project-Id-Version: cataclysm-dda 0.C\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-06-01 19:14-0400\n" +"POT-Creation-Date: 2018-06-09 21:55+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: AkAset , 2018\n" "Language-Team: Japanese (https://www.transifex.com/cataclysm-dda-translators/teams/2217/ja/)\n" @@ -74431,7 +74431,7 @@ msgstr "" #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "Fisher" -msgstr "釣師" +msgstr "釣り人" #. ~ Profession (male Fisher) description #: lang/json/professions_from_json.py @@ -74448,7 +74448,7 @@ msgstr "" #: lang/json/professions_from_json.py msgctxt "profession_female" msgid "Fisher" -msgstr "釣師" +msgstr "釣り人" #. ~ Profession (female Fisher) description #: lang/json/professions_from_json.py @@ -94043,7 +94043,7 @@ msgid "" "%s: %i more slot(s) needed." msgstr "" "\n" -"%s: %iスロット不足しています。" +"%s: あと%iのスロットが必要です。" #: src/bionics.cpp #, c-format @@ -105632,8 +105632,18 @@ msgstr "そこには炭焼窯があります。" #: src/iexamine.cpp #, c-format -msgid "It should take %d minutes to finish burning." -msgstr "燃焼を終えるまで%d分掛かります。" +msgid "It will finish burning in about %d hour." +msgid_plural "It will finish burning in about %d hours." +msgstr[0] "あと%d時間ほどで完全に燃え尽きます。" + +#: src/iexamine.cpp +msgid "It will finish burning in less than an hour." +msgstr "あと1時間ほどで完全に燃え尽きます。" + +#: src/iexamine.cpp +#, c-format +msgid "It should take about %d minutes to finish burning." +msgstr "あと%d分ほどで完全に燃え尽きます。" #: src/iexamine.cpp msgid "You have no brew to ferment." @@ -106801,8 +106811,8 @@ msgid "Compatible magazines: " msgstr "互換弾倉 : " #: src/item.cpp -msgid "Mods: " -msgstr "MOD: " +msgid "Mods: " +msgstr "MOD: " #: src/item.cpp #, c-format @@ -107113,8 +107123,8 @@ msgid "Contains items with qualities:" msgstr "収納されている道具の性能: " #: src/item.cpp -msgid "Techniques: " -msgstr "技術: " +msgid "Techniques when wielded: " +msgstr "装備時の技術: " #: src/item.cpp msgid "* This item can be used to make long reach attacks." @@ -107600,6 +107610,10 @@ msgstr "%sは取付不可" msgid "isn't big enough to use that mod" msgstr "空間不足" +#: src/item.cpp +msgid "can only accept small mods on that slot" +msgstr "MODが大きすぎて取り付けられない" + #. ~ %1$s - name of the gunmod, %2$s - name of the ammo #: src/item.cpp #, c-format diff --git a/lang/po/ko.po b/lang/po/ko.po index 37b9cee698da..e06f995cd823 100644 --- a/lang/po/ko.po +++ b/lang/po/ko.po @@ -1,4 +1,5 @@ # Translators: +# fenjo , 2018 # indejeC , 2018 # Brett Dong , 2018 # 탯새 , 2018 @@ -6,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: cataclysm-dda 0.C\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-06-01 19:14-0400\n" +"POT-Creation-Date: 2018-06-09 21:55+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: 탯새 , 2018\n" "Language-Team: Korean (https://www.transifex.com/cataclysm-dda-translators/teams/2217/ko/)\n" @@ -1548,13 +1549,13 @@ msgstr "" #: lang/extra/android/options.cpp msgid "Default gameplay shortcuts" -msgstr "" +msgstr "기본 게임플레이 단축키" #: lang/extra/android/options.cpp msgid "" "The default set of gameplay shortcuts to show. Used on starting a new game " "and whenever all gameplay shortcuts are removed." -msgstr "" +msgstr "화면 밑에 기본으로 표시되는 단축키를 설정합니다. 새로운 시작 혹은 기존 단축키가 삭제될 경우에 사용됩니다." #: lang/extra/android/options.cpp msgid "Add shortcuts for action menu selections" @@ -1577,11 +1578,11 @@ msgstr "" #: lang/extra/android/options.cpp msgid "Tap key (in-game)" -msgstr "" +msgstr "탭키 (게임 내)" #: lang/extra/android/options.cpp msgid "The key to press when tapping during gameplay." -msgstr "" +msgstr "게임 플레이 도중 화면을 두번 터치했을때 사용할 키를 설정합니다." #: lang/extra/android/options.cpp msgid "Two-finger tap key (in-game)" @@ -2435,7 +2436,7 @@ msgstr "목재 화살-그을림" msgid "" "This simple arrow has a fire-hardened point and fletching. Stands a below " "average chance of remaining intact once fired." -msgstr "촉 부분을 뾰족하게 깎아 불로 그을려 단단하게 만들고 깃을 붙인 단순한 화살. 재사용 확률 평균." +msgstr "촉 부분을 뾰족하게 깎아 불로 그을려 단단하게 만들고 깃을 붙인 단순한 화살. 재사용 확률 평균 이하." #: lang/json/AMMO_from_json.py msgid "field point wooden arrow" @@ -5997,8 +5998,7 @@ msgid "" "large amounts of damage, but isn't particularly accurate. Stands a good " "chance of remaining intact once fired." msgstr "" -"목재를 깎아 날카롭게 만든 쇠뇌 볼트. 꽤 무겁기 때문에, 상당한 살상력을 낼수 있지만, 정확하지 못합니다. 사용후 재사용할 수 있는 " -"확률 높음." +"목재를 깎아 날카롭게 만든 쇠뇌 볼트. 꽤 무겁기 때문에, 상당한 살상력을 낼수 있지만, 정확하지 못합니다. 재사용 확률 높음." #: lang/json/AMMO_from_json.py msgid "lead ball" @@ -40188,7 +40188,9 @@ msgstr[0] "투시막대" msgid "" "Item to test aep_clairvoyance_plus flag. If this spawns randomly, then it's " "a bug." -msgstr "aep_clairvoyance_plus 플래그 시험용. 이것이 평범하게 생성된다면 버그입니다." +msgstr "" +"Item to test aep_clairvoyance_plus flag. If this spawns randomly, then it's " +"a bug." #: lang/json/TOOL_from_json.py msgid "boulder anvil" @@ -46596,7 +46598,7 @@ msgstr[0] "케라틴 덩어리 (성장중)" #. ~ Use action msg for growing electrified mass. #: lang/json/TOOL_from_json.py msgid "The blob balloons to full size." -msgstr "" +msgstr "블럽이 최대 크기로 부풀어 올랐다." #. ~ Use action not_ready_msg for growing keratinous mass. #. ~ Use action not_ready_msg for growing beaded mass. @@ -46620,7 +46622,7 @@ msgstr "" #. ~ Use action not_ready_msg for growing electrified mass. #: lang/json/TOOL_from_json.py msgid "Whatever it's doing, it's not done yet." -msgstr "" +msgstr "이게 뭘 하는건진 몰라도, 끝난게 아니다." #. ~ Description for growing keratinous mass #. ~ Description for growing beaded mass @@ -46645,7 +46647,7 @@ msgstr "" #: lang/json/TOOL_from_json.py msgid "" "Not quite fully grown, this blob requires nourishment to fully develop." -msgstr "" +msgstr "이 블럽은 다 자라려면 영양분이 필요하다." #: lang/json/TOOL_from_json.py msgid "growing beaded mass" @@ -46700,7 +46702,7 @@ msgstr[0] "젤라틴 덩어리 (증식중)" #. ~ Use action hostile_msg for multiplying oozing mass. #: lang/json/TOOL_from_json.py msgid "A blob splits and bounces away!" -msgstr "" +msgstr "블럽이 나뉘어 튀어올랐다!" #. ~ Description for multiplying gelatinous mass #. ~ Description for multiplying gray mass @@ -50804,7 +50806,7 @@ msgstr "가려움" #: lang/json/effects_from_json.py msgid "Writhing skin" -msgstr "" +msgstr "피부 뒤틀림" #: lang/json/effects_from_json.py msgid "Bugs in skin" @@ -51182,7 +51184,7 @@ msgstr "다투라 즐김" #. ~ Description of effect 'Experiencing Datura'. #: lang/json/effects_from_json.py msgid "Buy the ticket, take the ride. The datura has you now." -msgstr "" +msgstr "표를 사서 올라타세요. 이젠 다투라에 사로잡히셨네요." #: lang/json/effects_from_json.py msgid "Grabbed" @@ -51318,7 +51320,7 @@ msgstr "식사에 철분이 부족해서 빈혈이 점차 심해질 것이다." #. ~ Apply message for effect(s) 'Iron deficiency, Early anemia, Anemia'. #: lang/json/effects_from_json.py msgid "You begin feeling increasingly tired and listless." -msgstr "" +msgstr "점점 피곤해지고 힘이 빠지는 것 같다." #. ~ Remove message for effect(s) 'Iron deficiency, Early anemia, Anemia'. #: lang/json/effects_from_json.py @@ -51356,7 +51358,7 @@ msgstr "식사에 비타민 A가 부족해서 시력이 점차 나빠질 것이 #. blindness'. #: lang/json/effects_from_json.py msgid "You start struggling to make out the finer details." -msgstr "" +msgstr "눈이 침침해서 정교한 작업을 하기 어려워졌다." #. ~ Remove message for effect(s) 'VitA deficiency, Poor vision, Night #. blindness'. @@ -51438,7 +51440,7 @@ msgstr "괴혈병 증상이 진행되기 시작했다." #. ~ Remove message for effect(s) 'Early scurvy, Scurvy, Bad Scurvy'. #: lang/json/effects_from_json.py msgid "Your scurvy has resolved." -msgstr "괴혈병이 낫았습니다." +msgstr "괴혈병이 나았다." #. ~ Decay message for effect(s) 'Early scurvy, Scurvy, Bad Scurvy'. #: lang/json/effects_from_json.py @@ -51492,7 +51494,7 @@ msgstr "거의 회복됨" #: lang/json/effects_from_json.py msgid "This damaged limb is slowly regaining its functions." -msgstr "" +msgstr "이 부위는 서서히 기능을 되찾아가고 있다." #: lang/json/effects_from_json.py msgid "Disabled" @@ -51501,7 +51503,7 @@ msgstr "불구" #. ~ Description of effect 'Disabled'. #: lang/json/effects_from_json.py msgid "This limb is damaged beyond use and may require a splint to recover." -msgstr "" +msgstr "이 부위는 사용하기 어려울 정도로 손상되어 회복하려면 부목이 필요하다." #. ~ Apply message for effect(s) 'Disabled'. #: lang/json/effects_from_json.py @@ -52339,7 +52341,7 @@ msgstr "노란 실내 조경식물" #. ~ Description for yellow indoor plant #: lang/json/furniture_from_json.py msgid "A variety of plant for decoration. It's yellow." -msgstr "" +msgstr "장식을 위한 식물. 노랗다." #: lang/json/furniture_from_json.py lang/json/vehicle_part_from_json.py msgid "bed" @@ -52348,7 +52350,7 @@ msgstr "침대" #. ~ Description for bed #: lang/json/furniture_from_json.py msgid "Quite comfortable to sleep in." -msgstr "" +msgstr "잠들기에 편하다." #: lang/json/furniture_from_json.py msgid "toilet" @@ -52361,7 +52363,7 @@ msgstr "" #: lang/json/furniture_from_json.py msgid "porcelain breaking!" -msgstr "도자기가 깨졌습니다!" +msgstr "도자기 깨짐!" #: lang/json/furniture_from_json.py msgid "whunk!" @@ -80312,6 +80314,9 @@ msgid "" "Someone used a blue pen to write \"who gives a shit\" across the slogan and " "put X's over the eyes of all the animals." msgstr "" +"유명 제조사의 태양광 차량 포스터. 수풀이 우거진 시골가를 가로지르는 차를 보는 작은 동물이 그려져 있습니다. \"연료통 하나씩 줄여 " +"세상을 바꿔나갑니다\" 라는 슬로건이 위에 적혀있고, 누가 파란 펜으로 슬로건 위에 \"조또\" 라고 쓰고 동물 눈알 마다 엑스표시를 " +"해놨습니다." #: lang/json/snippet_from_json.py msgid "" @@ -86037,7 +86042,7 @@ msgstr "너를 고용하려면 얼마나 필요하지?" #: lang/json/talk_topic_from_json.py msgid "" "I'm just a hired hand. Someone pays me and I do what needs to be done." -msgstr "" +msgstr "난 그냥 돈받고 하는거야. 하라고 돈을 받았으니까, 하라고 한 걸 하는거야." #: lang/json/talk_topic_from_json.py msgid "" @@ -86094,7 +86099,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "Pack your bags, . We're going on a trip." -msgstr "" +msgstr "가방 챙겨, . 떠날거야." #: lang/json/technique_from_json.py msgid "Not at technique at all" @@ -86107,7 +86112,7 @@ msgstr "막기" #. ~ Description for Block #: lang/json/technique_from_json.py msgid "Medium blocking ability" -msgstr "중등 막기 능력" +msgstr "중급 방어기능" #: lang/json/technique_from_json.py #, python-format @@ -86121,17 +86126,17 @@ msgstr "이(가) %s을(를) 막았다." #: lang/json/technique_from_json.py msgid "Parry" -msgstr "쳐내기" +msgstr "받아내기" #. ~ Description for Parry #: lang/json/technique_from_json.py msgid "High blocking ability" -msgstr "고급 막기 능력" +msgstr "상급 방어기능" #: lang/json/technique_from_json.py #, python-format msgid "You parry %s" -msgstr "%s을(를) 쳐냈다." +msgstr "%s을(를) 받아냈다" #: lang/json/technique_from_json.py #, python-format @@ -86145,12 +86150,12 @@ msgstr "방패" #. ~ Description for Shield #: lang/json/technique_from_json.py msgid "Very high blocking ability" -msgstr "매우 고급 막기 능력" +msgstr "최상급 방어기능" #: lang/json/technique_from_json.py #, python-format msgid "You shield against %s" -msgstr "%s을(를) 받아냈다." +msgstr "%s을(를) 막아냈다." #: lang/json/technique_from_json.py #, python-format @@ -86355,12 +86360,12 @@ msgstr "무장해제" #: lang/json/technique_from_json.py #, python-format msgid "You disarm %s using your whip" -msgstr "" +msgstr "채찍으로 %s의 무장을 해제시켰다" #: lang/json/technique_from_json.py #, python-format msgid " disarms %s using their whip" -msgstr "" +msgstr "이(가) 채찍으로 %s의 무장을 해제시켰다" #: lang/json/technique_from_json.py msgid "Counterattack" @@ -86443,7 +86448,7 @@ msgstr "크로스 카운터" #: lang/json/technique_from_json.py #, python-format msgid "You cross-counter %s" -msgstr "" +msgstr "%s에게 크로스 카운터를 먹였다." #: lang/json/technique_from_json.py #, python-format @@ -86892,12 +86897,12 @@ msgstr "햄스트링" #: lang/json/technique_from_json.py #, python-format msgid "You ground %s with a low blow" -msgstr "" +msgstr "%s의 고간을 쳐서 넘어트렸다" #: lang/json/technique_from_json.py #, python-format msgid " grounds %s with a low blow" -msgstr "이(가) %s의 고간을 쳐서 넘어트렸다!" +msgstr "이(가) %s의 고간을 쳐서 넘어트렸다" #: lang/json/technique_from_json.py msgid "Vicious Precision" @@ -86929,12 +86934,12 @@ msgstr "고간 타격" #: lang/json/technique_from_json.py #, python-format msgid "You hit %s with a dirty blow" -msgstr "" +msgstr "%s의 고간을 타격했다" #: lang/json/technique_from_json.py #, python-format msgid " delivers a dirty blow to %s" -msgstr "" +msgstr "이(가) %s의 고간을 타격했다" #: lang/json/technique_from_json.py msgid "Viper Hiss" @@ -95206,13 +95211,13 @@ msgstr "%s을(를) 완벽히 제거했다." #, c-format msgctxt "memorial_male" msgid "Failed to remove bionic: %s." -msgstr "" +msgstr "바이오닉 제거 실패: %s." #: src/bionics.cpp #, c-format msgctxt "memorial_female" msgid "Failed to remove bionic: %s." -msgstr "" +msgstr "바이오닉 제거 실패: %s." #. ~ : more slot(s) needed. #: src/bionics.cpp @@ -97571,7 +97576,7 @@ msgstr "분해할 수 없다." #: src/crafting.cpp msgid "It's rotten, I'm not taking that apart." -msgstr "" +msgstr "썩어있어서 손대고 싶지 않다." #: src/crafting.cpp #, c-format @@ -97600,7 +97605,7 @@ msgstr[0] "%d 이상 충전된 %s이(가) 필요하다." #: src/npctalk.cpp src/pickup.cpp src/player.cpp src/player.cpp src/player.cpp #: src/veh_interact.cpp msgid "Never mind." -msgstr "아무것도 하지 않았다." +msgstr "아무것도 하지 않음." #: src/crafting.cpp #, c-format @@ -97610,6 +97615,10 @@ msgid "" "Really disassemble?\n" "You feel you may be able to understand this object's construction.\n" msgstr "" +"%s 분해시 획득:\n" +"%s\n" +"정말로 분해합니까?\n" +"이것의 구조를 이해할 수 있을지도 모릅니다.\n" #: src/crafting.cpp #, c-format @@ -97624,12 +97633,12 @@ msgstr "" #: src/crafting.cpp msgid "The item has vanished." -msgstr "그 물품은 사라져 버렸다. " +msgstr "물품이 사라졌다." #: src/crafting.cpp msgid "" "The item might be gone, at least it is not at the expected position anymore." -msgstr "" +msgstr "물품이 사라졌다. 적어도 제자리에 없는 건 확실하다." #: src/crafting.cpp #, c-format @@ -103897,7 +103906,7 @@ msgstr "숨을 쉬어야 하지만 수영을 할 수 없다! 뭍으로 올라가 #: src/game.cpp msgid "No hostile creature in reach. Waiting a turn." -msgstr "" +msgstr "사거리 내에 적 없음. 턴 넘김." #: src/game.cpp msgid "You dive into water." @@ -106801,8 +106810,18 @@ msgstr "그곳에는 목탄 가마가 없다." #: src/iexamine.cpp #, c-format -msgid "It should take %d minutes to finish burning." -msgstr "불이 꺼지기까지 %d분 정도 걸린다." +msgid "It will finish burning in about %d hour." +msgid_plural "It will finish burning in about %d hours." +msgstr[0] "" + +#: src/iexamine.cpp +msgid "It will finish burning in less than an hour." +msgstr "" + +#: src/iexamine.cpp +#, c-format +msgid "It should take about %d minutes to finish burning." +msgstr "" #: src/iexamine.cpp msgid "You have no brew to ferment." @@ -107970,8 +107989,8 @@ msgid "Compatible magazines: " msgstr "사용 탄창: " #: src/item.cpp -msgid "Mods: " -msgstr "개조: " +msgid "Mods: " +msgstr "" #: src/item.cpp #, c-format @@ -108282,8 +108301,8 @@ msgid "Contains items with qualities:" msgstr "담긴 물품 품질:" #: src/item.cpp -msgid "Techniques: " -msgstr "테크닉: " +msgid "Techniques when wielded: " +msgstr "" #: src/item.cpp msgid "* This item can be used to make long reach attacks." @@ -108768,6 +108787,10 @@ msgstr "%s 부착 불가능" msgid "isn't big enough to use that mod" msgstr "작아서 부품을 부착할 수 없다." +#: src/item.cpp +msgid "can only accept small mods on that slot" +msgstr "" + #. ~ %1$s - name of the gunmod, %2$s - name of the ammo #: src/item.cpp #, c-format @@ -110074,7 +110097,7 @@ msgstr "지레질을 해봤지만, 문을 열지 못했다." #: src/iuse.cpp msgid "You notice the door is unlocked, so you simply open it." -msgstr "" +msgstr "문이 잠겨있지 않았기에 그대로 열었다." #: src/iuse.cpp msgid "You lift the manhole cover." @@ -118088,7 +118111,7 @@ msgstr "%s이(가) 눈에 보일 정도로 빠르게 재생한다!" #: src/monster.cpp #, c-format msgid "The %s seems a little healthier." -msgstr "%s은(는) 조금 건강해보인다." +msgstr "%s은(는) 조금 회복된 것 같다." #: src/monster.cpp #, c-format diff --git a/lang/po/pl.po b/lang/po/pl.po index 3972a4ba06b4..4dbadc59cb3b 100644 --- a/lang/po/pl.po +++ b/lang/po/pl.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: cataclysm-dda 0.C\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-06-01 19:14-0400\n" +"POT-Creation-Date: 2018-06-09 21:55+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Przemek Orechwa , 2018\n" "Language-Team: Polish (https://www.transifex.com/cataclysm-dda-translators/teams/2217/pl/)\n" @@ -9825,6 +9825,10 @@ msgid "" "with a layer of aluminum coating. They allow safely staring at extremely " "bright and harmful sources of light like the sun during a solar eclipse." msgstr "" +"Para okularów z kartonową oprawa z soczewkami złożonymi z filtrów UV i " +"podczerwieni, pokryte warstwą aluminium. Pozwalają na bezpieczne patrzenie " +"na ekstremalnie jasne źródła światła, jak na przykład słońce podczas " +"zaćmienia." #: lang/json/ARMOR_from_json.py msgid "pair of bifocal glasses" @@ -11883,10 +11887,10 @@ msgstr "Żaden poważany Szkot nie wychodzi z domu bez kiltu." #: lang/json/ARMOR_from_json.py msgid "leather kilt" msgid_plural "leather kilts" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" +msgstr[0] "skórzany kilt" +msgstr[1] "skórzany kilt" +msgstr[2] "skórzany kilt" +msgstr[3] "skórzany kilt" #: lang/json/ARMOR_from_json.py msgid "kimono" @@ -24624,7 +24628,7 @@ msgstr "" #. ~ Description for potato chips #: lang/json/COMESTIBLE_from_json.py msgid "Some plain, salted potato chips." -msgstr "" +msgstr "Nieco prostych, solonych czipsów ziemniaczanych." #. ~ Description for potato chips #: lang/json/COMESTIBLE_from_json.py @@ -24634,10 +24638,10 @@ msgstr "O człowieku, uwielbiasz te czipsy. Wypas!" #: lang/json/COMESTIBLE_from_json.py msgid "tortilla chips" msgid_plural "tortilla chips" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" +msgstr[0] "czipsy tortilla" +msgstr[1] "czipsy tortilla" +msgstr[2] "czipsy tortilla" +msgstr[3] "czipsy tortilla" #. ~ Description for tortilla chips #: lang/json/COMESTIBLE_from_json.py @@ -24645,6 +24649,8 @@ msgid "" "Salted chips made from corn tortillas, could really use some cheese, maybe " "some beef." msgstr "" +"Solone czipsy z kukurydzianej tortilli, którym przydałoby się nieco sera, " +"może też trochę wołowiny." #: lang/json/COMESTIBLE_from_json.py msgid "nachos with cheese" @@ -24660,6 +24666,8 @@ msgid "" "Salted chips made from corn tortillas, now with cheese. Could stand to have" " some meat." msgstr "" +"Solone czipsy z kukurydzianej tortilli, teraz wzbogacone o trochę sera. Może" +" nieco mięsa dopełniłoby kompozycję." #: lang/json/COMESTIBLE_from_json.py msgid "nachos with meat" @@ -24675,6 +24683,8 @@ msgid "" "Salted chips made from corn tortillas, now with meat. Could probably use " "some cheese, though." msgstr "" +"Solone czipsy z kukurydzianej tortilli, teraz z dodatkiem mięsa. Może nieco " +"sera dopełniłoby kompozycję." #: lang/json/COMESTIBLE_from_json.py msgid "niño nachos" @@ -24690,6 +24700,8 @@ msgid "" "Salted chips made from corn tortillas, with human flesh. Some cheese might " "make it even better." msgstr "" +"Solone czipsy z kukurydzianej tortilli teraz z dodatkiem ludzkiego mięsa. " +"Może nieco sera dopełniłoby kompozycję." #: lang/json/COMESTIBLE_from_json.py msgid "nachos with meat and cheese" @@ -24705,6 +24717,8 @@ msgid "" "Salted chips made from corn tortillas with ground meat and smothered in " "cheese. Delicious." msgstr "" +"Solone czipsy z kukurydzianej tortilli z mielonym mięsem i zatopione w " +"serze. Doskonałe." #: lang/json/COMESTIBLE_from_json.py msgid "niño nachos with cheese" @@ -24720,6 +24734,8 @@ msgid "" "Salted chips made from corn tortillas with human flesh and smothered in " "cheese. Delicious." msgstr "" +"Solone czipsy z kukurydzianej tortilli z mielonym ludzkim mięsem i zatopione" +" w serze. Doskonałe." #: lang/json/COMESTIBLE_from_json.py msgid "popcorn kernels" @@ -32650,6 +32666,10 @@ msgid "" "flowers, holding gift baskets, containing a fruit basket and herbs, loose " "item storage or as an ice bucket." msgstr "" +"Galwanizowane wiadro na orzeszki, chłodzone wino, zimne piwo, homary, krabie" +" odnóża, paszę dla zwierząt, do zastosowań farmerskich, piknikowania, " +"wytwarzania, sadzenia, na koszyk z prezentami, owocami, ziołami, lub innymi " +"drobnymi rzeczami, takoż jako wiadro z lodem." #: lang/json/CONTAINER_from_json.py msgid "hydration pack" @@ -47856,7 +47876,7 @@ msgstr "łosoś" #. ~ Description for salmon #: lang/json/MONSTER_from_json.py msgid "A salmon. A very fatty, nutritious fish. Tastes great smoked." -msgstr "" +msgstr "Łosoś to bardzo tłusta, pożywna ryba. Doskonała po uwędzeniu." #: lang/json/MONSTER_from_json.py msgid "sunfish" @@ -47944,7 +47964,7 @@ msgstr "" #: lang/json/MONSTER_from_json.py msgid "lobster" -msgstr "" +msgstr "homar" #. ~ Description for lobster #: lang/json/MONSTER_from_json.py @@ -47959,7 +47979,7 @@ msgstr "" #: lang/json/MONSTER_from_json.py msgid "crayfish" -msgstr "" +msgstr "rak" #. ~ Description for crayfish #: lang/json/MONSTER_from_json.py @@ -50792,6 +50812,9 @@ msgid "" "guard and a tassel attached to the pommel. One of the four major weapons in" " folklore, alongside the dao sabre, qiang spear, and gun staff." msgstr "" +"Starożytny chiński miecz, z ozdobnym jelcem i z przyłączonym frędzlem. Jedna" +" z czterech podstawowych broni w folklorze, razem z szablą dao, włócznią " +"qiang, i laską gun." #. ~ Description for jian #: lang/json/TOOL_from_json.py @@ -51566,10 +51589,10 @@ msgstr "" #: lang/json/TOOL_from_json.py msgid "inactive anti-materiel turret" msgid_plural "inactive anti-materiel turrets" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" +msgstr[0] "nieaktywna wieżyczka przeciwsprzętowa" +msgstr[1] "nieaktywna wieżyczka przeciwsprzętowa" +msgstr[2] "nieaktywna wieżyczka przeciwsprzętowa" +msgstr[3] "nieaktywna wieżyczka przeciwsprzętowa" #. ~ Description for inactive anti-materiel turret #: lang/json/TOOL_from_json.py @@ -51582,6 +51605,12 @@ msgid "" "turret will identify you as a friendly, and attack all enemies with a built-" "in rifle." msgstr "" +"To nieaktywna wieżyczka przeciwsprzętowa. Użycie jej zakłada napełnienie " +"pojemników fabrycznymi nabojami .50 BMG kulowymi z twojego ekwipunku (więc " +"jak chcesz zostawić nieco sobie to rozdziel amunicję i odłóż na bok TWOJĄ " +"cześć), włączenie, postawienie na ziemi, gdzie się zagnieździ. Jeżeli " +"zostanie skutecznie przeprogramowana i przekablowana rozpozna cię jako " +"przyjaciela, i będzie atakować wrogów wbudowanym karabinem." #: lang/json/TOOL_from_json.py msgid "inactive manhack" @@ -65217,7 +65246,7 @@ msgstr "pompa diesla" #. ~ Description for diesel pump #: lang/json/fault_from_json.py msgid "Required to pump and pressurize diesel from a vehicles tank." -msgstr "" +msgstr "Potrzebna do pompowania i sprężania diesla ze zbiornika paliwa." #. ~ Description for air filter #: lang/json/fault_from_json.py @@ -70530,6 +70559,8 @@ msgid "" "This is a cheap laser rifle made from common components. Weak, but can be " "powered with rechargeable batteries." msgstr "" +"Tani laserowy karabin zrobiony z powszechnych komponentów. Słaby, ale może " +"być zasilany z ładowanych baterii." #: lang/json/gun_from_json.py msgid "pipe rifle: .45" @@ -76473,6 +76504,8 @@ msgid "" "Sport of the true gentleman, modern boxing has evolved from the prizefights " "of the Victorian era." msgstr "" +"Sport prawdziwych gentlemanów. Współczesny boks wyewoluował z walko o " +"nagrody z ery wiktoriańskiej." #. ~ Description of buff for martial art 'Boxing' #: lang/json/martial_art_from_json.py @@ -78084,6 +78117,9 @@ msgid "" "You give up? This country fell apart because no one could find a good man " "to rely on... might as well give up, I guess." msgstr "" +"Poddajesz się? Ten kraj się rozpadł bo nikt nie mógł znaleźć dobrego " +"człowieka, na którym można polegać... więc pewnie można się poddać, jak " +"sądzę." #: lang/json/mission_def_from_json.py msgid "Find Corporate Accounts" @@ -78978,6 +79014,12 @@ msgid "" "unfortunately be ignored for now, without a dedicated emergency power system" " they won't be useful for some time." msgstr "" +"Większość niezbędnego sprzętu jest już z powrotem przywrócona do działania, " +"więc czas najwyższy żebyś zainstalował twój pierwszy mod wzmacniaka. Udaj " +"się na powierzchnię i zlokalizuj najbliższą stację radiową. Zainstaluj mod " +"na zapasowym terminalu i wróć do mnie żebym mógł zweryfikować czy wszystko " +"działa. Wieże radiowe niestety będą na razie pominięte, bo bez dedykowanego " +"zasilania awaryjnego przez pewien czas nie będą zdatne do użycia." #: lang/json/mission_def_from_json.py msgid "I'll be standing by down here once you are done." @@ -79212,6 +79254,14 @@ msgid "" "charge, I'm sure he could use your skills. Don't forget to wear your badge " "when meeting with them. Thank you once again marshal." msgstr "" +"Marszalu, nie przestajesz imponować. Jeśli jesteś zainteresowany, to " +"otrzymałem wieść że oddział został rozlokowany na naszym terytorium. Nie mam" +" dokładnych namiarów, ale powiedzieli, że zabezpieczają podziemną instalację" +" i mogą potrzebować pomocy. Niewiele więcej będę w stanie powiedzieć. Śmigło" +" podrzuciło ich do stacji pomp. Gdyby udało ci się zlokalizować kapitana " +"dowodzącego, to jestem pewien że skorzysta z twojej pomocy. Nie zapomnij " +"nosić odznaki jak wyjdziesz im naprzeciw. Jeszcze raz wyrazy wdzięczności " +"marszalu." #: lang/json/mission_def_from_json.py msgid "Make 2 Stills" @@ -114332,7 +114382,7 @@ msgstr[3] "%d lat" #: src/calendar.cpp msgid "for ever" -msgstr "" +msgstr "na zawsze" #. ~ %1$s - greater units of time (e.g. 3 hours), %2$s - lesser units of time #. (e.g. 11 minutes). @@ -125476,7 +125526,20 @@ msgstr "Jest tu piec do wypalania węgla drzewnego." #: src/iexamine.cpp #, c-format -msgid "It should take %d minutes to finish burning." +msgid "It will finish burning in about %d hour." +msgid_plural "It will finish burning in about %d hours." +msgstr[0] "Koniec wypalania nastąpi za około %d godzinę." +msgstr[1] "Koniec wypalania nastąpi za około %d godzin." +msgstr[2] "Koniec wypalania nastąpi za około %d godzin." +msgstr[3] "Koniec wypalania nastąpi za około %d godzin." + +#: src/iexamine.cpp +msgid "It will finish burning in less than an hour." +msgstr "Koniec wypalania nastąpi za mniej niż godzinę." + +#: src/iexamine.cpp +#, c-format +msgid "It should take about %d minutes to finish burning." msgstr "Koniec wypalania powinien nastąpić za %d minut." #: src/iexamine.cpp @@ -126686,7 +126749,7 @@ msgid "Compatible magazines: " msgstr "Kompatybilne magazynki: " #: src/item.cpp -msgid "Mods: " +msgid "Mods: " msgstr "Mody: " #: src/item.cpp @@ -127024,8 +127087,8 @@ msgid "Contains items with qualities:" msgstr "Zawiera przedmioty z cechami:" #: src/item.cpp -msgid "Techniques: " -msgstr "Techniki:" +msgid "Techniques when wielded: " +msgstr "Techniki gdy władany: " #: src/item.cpp msgid "* This item can be used to make long reach attacks." @@ -127537,6 +127600,10 @@ msgstr "nie może mieć %s" msgid "isn't big enough to use that mod" msgstr "nie jest wystarczająco duży by używać tego moda" +#: src/item.cpp +msgid "can only accept small mods on that slot" +msgstr "akceptuje tylko małe mody na tym slocie" + #. ~ %1$s - name of the gunmod, %2$s - name of the ammo #: src/item.cpp #, c-format diff --git a/lang/po/pt_BR.po b/lang/po/pt_BR.po index 1e0b9da78861..3af9e28875f7 100644 --- a/lang/po/pt_BR.po +++ b/lang/po/pt_BR.po @@ -12,7 +12,7 @@ msgid "" msgstr "" "Project-Id-Version: cataclysm-dda 0.C\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-06-01 19:14-0400\n" +"POT-Creation-Date: 2018-06-09 21:55+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Marco Przybysz , 2018\n" "Language-Team: Portuguese (Brazil) (https://www.transifex.com/cataclysm-dda-translators/teams/2217/pt_BR/)\n" @@ -14886,6 +14886,9 @@ msgid "" "will be regularly counteracted by increasing hunger. Can be toggled on and " "off at will." msgstr "" +"Seu sistema digestivo e suprimento de energia são interconectados. Drenos de" +" energia serão regularmente combatidos aumentando a fome. Pode ser ligado e " +"desligado à vontade." #: lang/json/BIONIC_ITEM_from_json.py msgid "Weather Reader CBM" @@ -61019,11 +61022,11 @@ msgstr "" #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py msgid "This clothing is very fancy." -msgstr "" +msgstr "Esta roupa é muito chique." #: lang/json/json_flag_from_json.py msgid "Allows you to see much further under water." -msgstr "" +msgstr "Permite você ver muito além debaixo d'água." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py @@ -61045,16 +61048,16 @@ msgstr "" #: lang/json/json_flag_from_json.py msgid "Can be made to fit via tailoring." -msgstr "" +msgstr "Pode ser feito caber via costura." #: lang/json/json_flag_from_json.py msgid "Layer for belts and other things worn on the waist." -msgstr "" +msgstr "Camada para cintos e outras coisas vestidas na cintura." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py msgid "This gear is worn on or around your waist." -msgstr "" +msgstr "Este equipamento é vestido ao redor ou na cintura." #: lang/json/json_flag_from_json.py msgid "Acts as a watch and allows the player to see actual time." @@ -61063,7 +61066,7 @@ msgstr "" #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py msgid "This gear allows to see actual time." -msgstr "" +msgstr "Este equipamento permite ver o horário atual." #: lang/json/json_flag_from_json.py msgid "" @@ -107120,7 +107123,18 @@ msgstr "" #: src/iexamine.cpp #, c-format -msgid "It should take %d minutes to finish burning." +msgid "It will finish burning in about %d hour." +msgid_plural "It will finish burning in about %d hours." +msgstr[0] "" +msgstr[1] "" + +#: src/iexamine.cpp +msgid "It will finish burning in less than an hour." +msgstr "" + +#: src/iexamine.cpp +#, c-format +msgid "It should take about %d minutes to finish burning." msgstr "" #: src/iexamine.cpp @@ -108289,7 +108303,7 @@ msgid "Compatible magazines: " msgstr "" #: src/item.cpp -msgid "Mods: " +msgid "Mods: " msgstr "" #: src/item.cpp @@ -108605,7 +108619,7 @@ msgid "Contains items with qualities:" msgstr "" #: src/item.cpp -msgid "Techniques: " +msgid "Techniques when wielded: " msgstr "" #: src/item.cpp @@ -109087,6 +109101,10 @@ msgstr "" msgid "isn't big enough to use that mod" msgstr "" +#: src/item.cpp +msgid "can only accept small mods on that slot" +msgstr "" + #. ~ %1$s - name of the gunmod, %2$s - name of the ammo #: src/item.cpp #, c-format diff --git a/lang/po/ru.po b/lang/po/ru.po index 5e38ede61a57..0166c62a8025 100644 --- a/lang/po/ru.po +++ b/lang/po/ru.po @@ -33,7 +33,7 @@ msgid "" msgstr "" "Project-Id-Version: cataclysm-dda 0.C\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-06-01 19:14-0400\n" +"POT-Creation-Date: 2018-06-09 21:55+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Букин Иван , 2018\n" "Language-Team: Russian (https://www.transifex.com/cataclysm-dda-translators/teams/2217/ru/)\n" @@ -73207,7 +73207,7 @@ msgid "barrel extension" msgid_plural "barrel extensions" msgstr[0] "удлинённый ствол" msgstr[1] "удлинённых ствола" -msgstr[2] "удлинённых стволов" +msgstr[2] "удлинённых стволов" msgstr[3] "удлинённых ствола" #: lang/json/gunmod_from_json.py @@ -126530,8 +126530,21 @@ msgstr "Это углевыжигательная печь." #: src/iexamine.cpp #, c-format -msgid "It should take %d minutes to finish burning." -msgstr "До конца горения осталось %d минут." +msgid "It will finish burning in about %d hour." +msgid_plural "It will finish burning in about %d hours." +msgstr[0] "Горение закончится через %d час." +msgstr[1] "Горение закончится через %d часа." +msgstr[2] "Горение закончится через %d часов." +msgstr[3] "Горение закончится через %d час." + +#: src/iexamine.cpp +msgid "It will finish burning in less than an hour." +msgstr "Горение закончится менее, чем через час." + +#: src/iexamine.cpp +#, c-format +msgid "It should take about %d minutes to finish burning." +msgstr "До конца горения осталось примерно %d минут." #: src/iexamine.cpp msgid "You have no brew to ferment." @@ -127741,8 +127754,8 @@ msgid "Compatible magazines: " msgstr "Совместимые магазины: " #: src/item.cpp -msgid "Mods: " -msgstr "Модификации: " +msgid "Mods: " +msgstr "Модификации: " #: src/item.cpp #, c-format @@ -128076,8 +128089,8 @@ msgid "Contains items with qualities:" msgstr "Содержит предметы со следующими качествами:" #: src/item.cpp -msgid "Techniques: " -msgstr "Техники: " +msgid "Techniques when wielded: " +msgstr "Техники при взятии в руки: " #: src/item.cpp msgid "* This item can be used to make long reach attacks." @@ -128590,6 +128603,10 @@ msgstr "Нельзя присоединить %s" msgid "isn't big enough to use that mod" msgstr "недостаточно велик, чтобы было возможно использовать эту модификацию." +#: src/item.cpp +msgid "can only accept small mods on that slot" +msgstr "на этот слот можно устанавливать только небольшие модификации" + #. ~ %1$s - name of the gunmod, %2$s - name of the ammo #: src/item.cpp #, c-format diff --git a/lang/po/sr.po b/lang/po/sr.po index 7300990bc6ee..5c8db3c44abf 100644 --- a/lang/po/sr.po +++ b/lang/po/sr.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: cataclysm-dda 0.C\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-06-01 19:14-0400\n" +"POT-Creation-Date: 2018-06-09 21:55+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Brett Dong , 2018\n" "Language-Team: Serbian (https://www.transifex.com/cataclysm-dda-translators/teams/2217/sr/)\n" @@ -109411,7 +109411,19 @@ msgstr "" #: src/iexamine.cpp #, c-format -msgid "It should take %d minutes to finish burning." +msgid "It will finish burning in about %d hour." +msgid_plural "It will finish burning in about %d hours." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: src/iexamine.cpp +msgid "It will finish burning in less than an hour." +msgstr "" + +#: src/iexamine.cpp +#, c-format +msgid "It should take about %d minutes to finish burning." msgstr "" #: src/iexamine.cpp @@ -110585,7 +110597,7 @@ msgid "Compatible magazines: " msgstr "" #: src/item.cpp -msgid "Mods: " +msgid "Mods: " msgstr "" #: src/item.cpp @@ -110907,7 +110919,7 @@ msgid "Contains items with qualities:" msgstr "" #: src/item.cpp -msgid "Techniques: " +msgid "Techniques when wielded: " msgstr "" #: src/item.cpp @@ -111391,6 +111403,10 @@ msgstr "" msgid "isn't big enough to use that mod" msgstr "" +#: src/item.cpp +msgid "can only accept small mods on that slot" +msgstr "" + #. ~ %1$s - name of the gunmod, %2$s - name of the ammo #: src/item.cpp #, c-format diff --git a/lang/po/zh_CN.po b/lang/po/zh_CN.po index 9ba03ed888e3..b01b63ae389e 100644 --- a/lang/po/zh_CN.po +++ b/lang/po/zh_CN.po @@ -21,7 +21,7 @@ msgid "" msgstr "" "Project-Id-Version: cataclysm-dda 0.C\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-06-01 19:14-0400\n" +"POT-Creation-Date: 2018-06-09 21:55+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: ImmortalSTAR , 2018\n" "Language-Team: Chinese (China) (https://www.transifex.com/cataclysm-dda-translators/teams/2217/zh_CN/)\n" @@ -39746,7 +39746,7 @@ msgid "" "This is an early modern sword seeing use in the 16th, 17th, and 18th " "centuries. This sword appears to be made very poorly, but it should still " "stand up to a few swings." -msgstr "一种早期的现代剑,在16到18世纪的西方被广泛使用。之所以命名为阔剑,是为了与细长的刺剑对比。这此款是做工不佳且有大量损坏的劣质品。" +msgstr "一种早期的现代剑,在16到18世纪的西方被广泛使用。之所以命名为阔剑,是为了与细长的刺剑对比。这一把看上去很糟糕,但挥舞几次问题不大。" #. ~ Description for cutlass #: lang/json/TOOL_from_json.py @@ -39754,28 +39754,28 @@ msgid "" "This is a broad saber known for its use by sailors and pirates. This sword " "appears to be made very poorly, but it should still stand up to a few " "swings." -msgstr "这种阔刃军刀因为普遍被水手与海盗使用而闻名。偏短的刀刃让它在近身时得心应手。此款是做工不佳且有大量损坏的劣质品。" +msgstr "这种阔刃军刀因为普遍被水手与海盗使用而闻名。偏短的刀刃让它在近身时得心应手。这一把看上去很糟糕,但挥舞几次问题不大。" #. ~ Description for katana #: lang/json/TOOL_from_json.py msgid "" "This is a rare sword from Japan. While it's got the right edge and weight, " "the pommel just snaps off, and the blade seems pretty worn." -msgstr "一柄武士刀,打刀款式,为日本武士步兵作战时使用,刀身中央略微弯曲,以利于迅速拔刀,全长一米左右。此款是做工不佳且有大量损坏的劣质品。" +msgstr "一柄武士刀,打刀款式,为日本武士步兵作战时使用,刀身中央略微弯曲,以利于迅速拔刀,全长一米左右。这把刀的刀柄圆头已经脱落,刀刃也磨损严重。" #. ~ Description for zweihänder #: lang/json/TOOL_from_json.py msgid "" "This is a huge two-handed sword from Germany. You're not quite sure it's " "supposed to be that bendy." -msgstr "一把德制巨型双手剑,极具视觉冲击力。此款是做工不佳且有大量损坏的劣质品。" +msgstr "一把德制巨型双手剑,极具视觉冲击力。不知是设计师的奇思妙想,还是铸剑师的偷奸耍滑,这把剑的剑刃有些不妙的弯曲。" #. ~ Description for wakizashi #: lang/json/TOOL_from_json.py msgid "" "This is a comparatively-common Japanese short sword. There's something not " "quite right about this sword." -msgstr "这是一种比较常见的日本短刀。此款是做工不佳且有大量损坏的劣质品。" +msgstr "这是一种比较常见的日本短刀。从日本人的角度看,这把刀有些“微妙”。" #. ~ Description for battle axe #: lang/json/TOOL_from_json.py @@ -39797,7 +39797,7 @@ msgstr "一把古中国剑,双刃开锋,剑身长直,护手带有装饰, msgid "" "This is an ancient Chinese doubled-edged straight sword. The sword is quite" " worn, and bent at an odd angle." -msgstr "一把古中国剑,双刃开锋,剑身长直。此款是做工不佳且有大量损坏的劣质品。" +msgstr "一把古中国剑,双刃开锋,剑身长直——本该如此,实际上它的剑刃磨损严重,还弯出了一个奇怪的角度。" #. ~ Description for scimitar #: lang/json/TOOL_from_json.py @@ -39812,7 +39812,7 @@ msgstr "一把弯刀,源于多数中东及中亚国家。专门为斩击而设 msgid "" "This is a curved sword associated with various Middle Eastern and Central " "Asian countries. This one seems oddly dull and worn." -msgstr "一把弯刀,源于多数中东及中亚国家。此款是做工不佳且有大量损坏的劣质品。" +msgstr "一把弯刀,源于多数中东及中亚国家。它看上去又钝又旧。" #. ~ Description for longsword #: lang/json/TOOL_from_json.py @@ -39828,7 +39828,7 @@ msgid "" "This is a classic medieval sword, in between the lighter arming sword and " "later two-handed swords in size. You feel like the pommel could just snap " "off if you used it." -msgstr "这是一把经典中世纪长剑,体积介乎于骑士剑和后期的双手剑之间。此款是做工不佳且有大量损坏的劣质品。" +msgstr "这是一把经典中世纪长剑,体积介乎于骑士剑和后期的双手剑之间——的劣质品,你担心用力挥舞它时剑柄会突然断掉。" #. ~ Description for arming sword #: lang/json/TOOL_from_json.py @@ -39841,7 +39841,7 @@ msgstr "一把经典的中世纪剑,贯穿整个中世纪,前由维京时期 msgid "" "This is a classic medieval sword, just the right size to use one-handed. " "This one doesn't seem to have been made right." -msgstr "这是一把经典的中世纪剑,适合单手使用。此款是做工不佳且有大量损坏的劣质品。" +msgstr "这是一把经典的中世纪剑,适合单手使用。不过,这应该是一把不合格产品。" #: lang/json/TOOL_from_json.py msgid "folded poncho" @@ -85822,17 +85822,17 @@ msgstr "对 %s 进行了相位攻击" #: lang/json/technique_from_json.py msgid "displace and counter" -msgstr "借力打力" +msgstr "换位迎击" #: lang/json/technique_from_json.py #, python-format msgid "You displace and counter %s" -msgstr "你借力打力了 %s" +msgstr "你换位迎击 %s" #: lang/json/technique_from_json.py #, python-format msgid " displaces and counters %s" -msgstr " 借力打力了 %s" +msgstr " 换位迎击 %s" #: lang/json/technique_from_json.py msgid "sweeping strike" @@ -86181,14 +86181,14 @@ msgstr "一个填满尸体的大壕沟,甚至可能是个乱坟坑。这些尸 #: lang/json/terrain_from_json.py msgid "covered pit" -msgstr "深坑(伪装)" +msgstr "深坑(加盖)" #. ~ Description for covered pit #: lang/json/terrain_from_json.py msgid "" "A deep pit with a two by four placed across it, looks sturdy enough to cross" " safely or the plank could be removed to turn it back into trap fall." -msgstr "顶上横跨一块 2x4 木板的深坑,看来坚固程度足够安全通行,也可以移走木板再充当陷坑。" +msgstr "上面铺着 2x4 木板的深坑,看来坚固程度足够安全通行,也可以移走木板再充当陷坑。" #: lang/json/terrain_from_json.py lang/json/trap_from_json.py msgid "spiked pit" @@ -86203,7 +86203,7 @@ msgstr "布尖锐物的窄沟,那些尖锐物能轻易刺穿躯体。" #: lang/json/terrain_from_json.py msgid "covered spiked pit" -msgstr "尖刺陷坑(伪装)" +msgstr "尖刺陷坑(加盖)" #. ~ Description for covered spiked pit #: lang/json/terrain_from_json.py @@ -86226,7 +86226,7 @@ msgstr "这坑底简直像倒进了一吨碎玻璃!掉进去未必致命,但 #: lang/json/terrain_from_json.py msgid "covered glass pit" -msgstr "玻璃刺陷坑(伪装)" +msgstr "玻璃刺陷坑(加盖)" #. ~ Description for covered glass pit #: lang/json/terrain_from_json.py @@ -86290,7 +86290,7 @@ msgstr "路面" msgid "" "A segment of asphalt, slowly degrading from cracks, frost heaves and lack of" " maintenance." -msgstr "一段遍布裂隙,冰冻起皮,缺乏维护的老化沥青地面。" +msgstr " 一段沥青路面,因为裂缝、冻胀和缺乏维护而逐渐老化。" #: lang/json/terrain_from_json.py msgid "yellow pavement" @@ -86312,7 +86312,7 @@ msgstr "人行道" msgid "" "An area of common poured concrete, damaged by frost heaves and large cracks " "due to lack of maintenance." -msgstr "一段普通水泥地。因缺乏维护而损于寒冻与大裂隙。" +msgstr "一段现浇混凝土路面。因为缺乏维护而毁于冻胀和大裂缝。" #. ~ Description for concrete #: lang/json/terrain_from_json.py @@ -93538,23 +93538,23 @@ msgstr "%s 已经失去连接并关闭了。" #: src/bionics.cpp msgid "You flub the removal." -msgstr "移除生化插件失败了。" +msgstr "你把这次移除搞错了。" #: src/bionics.cpp msgid "You mess up the removal." -msgstr "移除生化插件失败了。" +msgstr "你把这次移除搞得一团糟。" #: src/bionics.cpp msgid "The removal fails." -msgstr "移除生化插件失败了。" +msgstr "移除失败。" #: src/bionics.cpp msgid "The removal is a failure." -msgstr "移除生化插件失败了。" +msgstr "本次移除完全失败。" #: src/bionics.cpp msgid "You screw up the removal." -msgstr "移除生化插件失败了。" +msgstr "你搞砸了这次移除手术。" #: src/bionics.cpp msgid "Your body is severely damaged!" @@ -93728,11 +93728,11 @@ msgstr "安装生化插件失败了,但你安然无恙。" #: src/bionics.cpp msgid "You flub the installation." -msgstr "安装生化插件失败了。" +msgstr "你把这次安装搞错了。" #: src/bionics.cpp msgid "You mess up the installation." -msgstr "安装生化插件失败了。" +msgstr "你把这次安装搞得一团糟。" #: src/bionics.cpp msgid "The installation fails." @@ -93740,11 +93740,11 @@ msgstr "安装生化插件失败了。" #: src/bionics.cpp msgid "The installation is a failure." -msgstr "安装生化插件失败了。" +msgstr "本次安装完全失败。" #: src/bionics.cpp msgid "You screw up the installation." -msgstr "安装生化插件失败了。" +msgstr "你搞砸了这次安装。" #. ~"Complications" is USian medical-speak for "unintended damage from a #. medical procedure". @@ -104371,7 +104371,7 @@ msgid "" "Most normal bows require strength of at least 8, others require an above average strength of 10, or a significant strength of 12. Bows use the archery skill." msgstr "" "( 弓\n" -"无声,致命,易于制造,箭可以重复利用。弓已经被人类使用了不知道多久了。使用弓需要两只手,并且对于使用者的力量有一定要求。如果你没有足够的力量开弓,那么你的射击效率就会掉价。上箭速度,射击速度还有射程都会因此降低。\n" +"无声,致命,易于制造,箭可以重复利用。弓已经被人类使用了不知道多久了。使用弓需要两只手,并且对于使用者的力量有一定要求。如果你没有足够的力量开弓,那么你的射击效率就会下降。上箭速度,射击速度还有射程都会因此降低。\n" "大部分普通的弓都需要至少8的力量,其他的一些则需要更强的10点力量,或者更加强大的12的力量。弓使用弓术技能。" #: src/help.cpp @@ -105194,7 +105194,17 @@ msgstr "那里有一个炭窑。" #: src/iexamine.cpp #, c-format -msgid "It should take %d minutes to finish burning." +msgid "It will finish burning in about %d hour." +msgid_plural "It will finish burning in about %d hours." +msgstr[0] "它大约在 %d 小时后结束燃烧。" + +#: src/iexamine.cpp +msgid "It will finish burning in less than an hour." +msgstr "它将在一小时内结束燃烧。" + +#: src/iexamine.cpp +#, c-format +msgid "It should take about %d minutes to finish burning." msgstr "大概需要 %d 分钟才能燃烧完毕。" #: src/iexamine.cpp @@ -106361,8 +106371,8 @@ msgid "Compatible magazines: " msgstr "兼容弹匣:" #: src/item.cpp -msgid "Mods: " -msgstr "模组:" +msgid "Mods: " +msgstr "模组:" #: src/item.cpp #, c-format @@ -106671,8 +106681,8 @@ msgid "Contains items with qualities:" msgstr "道具拥有功能:" #: src/item.cpp -msgid "Techniques: " -msgstr "战斗技:" +msgid "Techniques when wielded: " +msgstr "手持战技:" #: src/item.cpp msgid "* This item can be used to make long reach attacks." @@ -107155,6 +107165,10 @@ msgstr "不可以有 %s" msgid "isn't big enough to use that mod" msgstr "太小无法使用那个模组" +#: src/item.cpp +msgid "can only accept small mods on that slot" +msgstr "该插槽仅能容纳小型模组" + #. ~ %1$s - name of the gunmod, %2$s - name of the ammo #: src/item.cpp #, c-format @@ -123722,24 +123736,24 @@ msgstr "你失足跌倒!" #: src/player_hardcoded_effects.cpp msgid "There's some kind of big machine in the sky." -msgstr "天空中有一些巨大的机器。" +msgstr "天空出现一些巨大的飞行器。(注:台词出自赌城风情画,1998)" #: src/player_hardcoded_effects.cpp msgid "It's some kind of electric snake, coming right at you!" -msgstr "一条蛇形电弧直奔你而来!" +msgstr "像是一条电蛇一样,向我们直奔过来!(注:台词出自赌城风情画,1998)" #: src/player_hardcoded_effects.cpp msgid "" "Order us some golf shoes, otherwise we'll never get out of this place alive." -msgstr "给我们点高尔夫球鞋,不然我们永远无法活着离开这。" +msgstr "要一些高尔夫球鞋,否则我们不能活着离开这个地方了。(注:台词出自赌城风情画,1998)" #: src/player_hardcoded_effects.cpp msgid "The possibility of physical and mental collapse is now very real." -msgstr "身体和精神的崩溃已经不是小概率事件了。" +msgstr "身理和心理崩溃的可能性,现在已经很真实了。(注:台词出自赌城风情画,1998)" #: src/player_hardcoded_effects.cpp msgid "No one should be asked to handle this trip." -msgstr "没人应该为这趟飞升负责。" +msgstr "没有一个人能处理我们这一次的行程。(注:台词出自赌城风情画,1998)" #: src/player_hardcoded_effects.cpp msgid "" @@ -123751,7 +123765,7 @@ msgstr "你的心脏痛苦地痉挛……之后,停止了跳动,让你不得 msgid "" "You dissolve into beautiful paroxysms of energy. Life fades from your " "nebulae and you are no more." -msgstr "你分解成了美丽而温暖的能量。生命在你身上逐渐消逝,你不再存在了。" +msgstr "你融化到了这份美丽而温暖的能量之中。生命在你身上逐渐消逝,你不再存在了。" #: src/player_hardcoded_effects.cpp msgctxt "memorial_male" diff --git a/lang/po/zh_TW.po b/lang/po/zh_TW.po index 0c91d5e935a1..4215479196f7 100644 --- a/lang/po/zh_TW.po +++ b/lang/po/zh_TW.po @@ -22,7 +22,7 @@ msgid "" msgstr "" "Project-Id-Version: cataclysm-dda 0.C\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-06-01 19:14-0400\n" +"POT-Creation-Date: 2018-06-09 21:55+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Meat , 2018\n" "Language-Team: Chinese (Taiwan) (https://www.transifex.com/cataclysm-dda-translators/teams/2217/zh_TW/)\n" @@ -104289,8 +104289,18 @@ msgstr "這裡有碳化爐。" #: src/iexamine.cpp #, c-format -msgid "It should take %d minutes to finish burning." -msgstr "還需要 %d 分鐘才能完成。" +msgid "It will finish burning in about %d hour." +msgid_plural "It will finish burning in about %d hours." +msgstr[0] "" + +#: src/iexamine.cpp +msgid "It will finish burning in less than an hour." +msgstr "" + +#: src/iexamine.cpp +#, c-format +msgid "It should take about %d minutes to finish burning." +msgstr "" #: src/iexamine.cpp msgid "You have no brew to ferment." @@ -105456,8 +105466,8 @@ msgid "Compatible magazines: " msgstr "兼容彈匣: " #: src/item.cpp -msgid "Mods: " -msgstr "模組: " +msgid "Mods: " +msgstr "" #: src/item.cpp #, c-format @@ -105766,8 +105776,8 @@ msgid "Contains items with qualities:" msgstr "收納的物品具有以下特性:" #: src/item.cpp -msgid "Techniques: " -msgstr "技巧: " +msgid "Techniques when wielded: " +msgstr "" #: src/item.cpp msgid "* This item can be used to make long reach attacks." @@ -106250,6 +106260,10 @@ msgstr "無法安裝 %s" msgid "isn't big enough to use that mod" msgstr "不夠大無法使用那個模組" +#: src/item.cpp +msgid "can only accept small mods on that slot" +msgstr "" + #. ~ %1$s - name of the gunmod, %2$s - name of the ammo #: src/item.cpp #, c-format diff --git a/src/advanced_inv.cpp b/src/advanced_inv.cpp index d37573787a90..239121da344f 100644 --- a/src/advanced_inv.cpp +++ b/src/advanced_inv.cpp @@ -1152,6 +1152,17 @@ bool advanced_inventory::move_all_items(bool nested_call) popup(_("There are no items to be moved!")); return false; } + + auto &sarea = squares[spane.get_area()]; + auto &darea = squares[dpane.get_area()]; + + + // Check first if the destination area still have enough room for moving all. + if( !is_processing() && sarea.volume > darea.free_volume( dpane.in_vehicle() ) && + !query_yn( _( "There isn't enough room, do you really want to move all?" ) ) ) { + return false; + } + // make sure that there are items to be moved bool done = false; // copy the current pane, to be restored after the move is queued @@ -1287,6 +1298,13 @@ bool advanced_inventory::move_all_items(bool nested_call) g->u.activity.str_values.push_back( "equip" ); } } else { // Vehicle and map destinations are handled the same. + + // Check first if the destination area still have enough room for moving all. + if( !is_processing() && sarea.volume > darea.free_volume( dpane.in_vehicle() ) && + !query_yn( _( "There isn't enough room, do you really want to move all?" ) ) ) { + return false; + } + g->u.assign_activity( activity_id( "ACT_MOVE_ITEMS" ) ); // store whether the source is from a vehicle (first entry) g->u.activity.values.push_back(spane.in_vehicle()); diff --git a/src/cursesport.h b/src/cursesport.h index d73b29a2a892..34a32416e5cb 100644 --- a/src/cursesport.h +++ b/src/cursesport.h @@ -94,7 +94,8 @@ extern void handle_additional_window_clear( WINDOW *win ); //@todo: move into cata_cursesport //used only in SDL mode for clearing windows using rendering void clear_window_area( const catacurses::window &win ); -int projected_window_width( int column_count ); -int projected_window_height( int row_count ); +int projected_window_width(); +int projected_window_height(); +bool handle_resize( int w, int h ); #endif diff --git a/src/game.cpp b/src/game.cpp index 981e5c1d3e63..f4792af3c406 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -431,7 +431,7 @@ void reinitialize_framebuffer() { } #endif -void game::init_ui() +void game::init_ui( const bool resized ) { // clear the screen static bool first_init = true; @@ -443,7 +443,6 @@ void game::init_ui() FULL_SCREEN_WIDTH = 80; FULL_SCREEN_HEIGHT = 24; // print an intro screen, making sure the terminal is the correct size - intro(); first_init = false; @@ -460,7 +459,16 @@ void game::init_ui() #if (defined TILES || defined _WIN32 || defined __WIN32__) TERMX = get_terminal_width(); TERMY = get_terminal_height(); + + if ( resized ) { + get_options().get_option( "TERMINAL_X" ).setValue( TERMX ); + get_options().get_option( "TERMINAL_Y" ).setValue( TERMY ); + get_options().save(); + } #else + (void) resized; + intro(); + TERMY = getmaxy( catacurses::stdscr ); TERMX = getmaxx( catacurses::stdscr ); @@ -674,6 +682,11 @@ void game::init_ui() werase(w_status2); liveview.init(); + + //Refresh only if ingame. Will crash on main menu + if( resized && !g->u.name.empty() ) { + g->refresh_all(); + } } void game::toggle_sidebar_style() @@ -4307,7 +4320,6 @@ void game::debug() void game::draw_overmap() { overmap::draw_overmap(); - refresh_all(); } void game::disp_kills() @@ -6247,11 +6259,15 @@ bool game::add_zombie(monster &critter, bool pin_upgrade) } critter.try_upgrade(pin_upgrade); + critter.try_reproduce(); + critter.try_biosignature(); if( !pin_upgrade ) { critter.on_load(); } critter.last_updated = calendar::turn; + critter.last_baby = calendar::turn; + critter.last_biosig = calendar::turn; return critter_tracker->add(critter); } diff --git a/src/game.h b/src/game.h index e58b553377cc..426cb288f63d 100644 --- a/src/game.h +++ b/src/game.h @@ -180,7 +180,7 @@ class game public: /** Initializes the UI. */ - void init_ui(); + void init_ui( const bool resized = false ); void setup(); /** True if the game has just started or loaded, else false. */ bool new_game; diff --git a/src/game_ui.cpp b/src/game_ui.cpp index f690d9ed6f89..ae1876d2d661 100644 --- a/src/game_ui.cpp +++ b/src/game_ui.cpp @@ -4,5 +4,5 @@ void game_ui::init_ui() { - g->init_ui(); + g->init_ui( true ); } diff --git a/src/iexamine.cpp b/src/iexamine.cpp index 85becbcaa20b..87840c53fde8 100644 --- a/src/iexamine.cpp +++ b/src/iexamine.cpp @@ -3515,21 +3515,23 @@ void iexamine::autodoc( player &p, const tripoint &examp ) return; } - const int bionic = g->inv_for_flag( "CBM", _( "Choose CBM to install" ) ); - if( bionic == INT_MIN ) { - p.add_msg_if_player( m_info, _( "Never mind." ) ); + const item_location bionic = g->inv_map_splice( []( const item &e ) { + return e.has_flag( "CBM" ); + }, _( "Choose CBM to install" ), PICKUP_RANGE, _( "You don't have any CBMs to install" ) ); + + if( !bionic ) { return; } - const item &it = p.i_at( bionic ); - const itype &itemtype = *it.type; - const time_duration duration = itemtype.bionic->difficulty * 20_minutes; - if( p.install_bionics( itemtype ) ) { + const item *it = bionic.get_item(); + const itype *itemtype = it->type; + const time_duration duration = itemtype->bionic->difficulty * 20_minutes; + if( p.install_bionics( *itemtype ) ) { p.add_msg_if_player( m_info, _( "You type data into the console, configuring Autodoc to install a CBM." ) ); p.fall_asleep( duration ); p.add_msg_if_player( m_info, _( "Autodoc injected you with anesthesia, and while you were sleeping conducted a medical operation on you." ) ); - p.i_rem( &it ); + g->m.i_rem( bionic.position(), it ); } } diff --git a/src/item.cpp b/src/item.cpp index bbf946f81867..61bea3e570a5 100644 --- a/src/item.cpp +++ b/src/item.cpp @@ -2972,13 +2972,27 @@ units::volume item::get_storage() const } int item::get_env_resist() const +{ + const auto t = find_armor_data(); + if( t == nullptr ) { + return 0; + } + // modify if item is a gas mask and has filter + int resist_base = static_cast( static_cast( t->env_resist ) ); + int resist_filter = get_var( "overwrite_env_resist", 0 ); + int resist = std::max( resist_base, resist_filter ); + + return lround( resist * get_relative_health() ); +} + +int item::get_env_resist_w_filter() const { const auto t = find_armor_data(); if( t == nullptr ) { return 0; } // it_armor::env_resist is unsigned char - return static_cast( static_cast( t->env_resist ) ); + return static_cast( static_cast( t->env_resist_w_filter ) ); } bool item::is_power_armor() const @@ -3335,6 +3349,11 @@ int item::max_damage() const return type->damage_max; } +float item::get_relative_health() const +{ + return ( max_damage() + 1.0f - damage() ) / ( max_damage() + 1.0f ); +} + bool item::mod_damage( double qty, damage_type dt ) { bool destroy = false; diff --git a/src/item.h b/src/item.h index e2441d0c9513..a7bf087dbf07 100644 --- a/src/item.h +++ b/src/item.h @@ -786,6 +786,13 @@ class item : public visitable /** Maximum amount of damage to an item (state before destroyed) */ int max_damage() const; + /** + * Relative item health. + * Returns 1 for undamaged ||items, values in the range (0, 1) for damaged items + * and values above 1 for reinforced ++items. + */ + float get_relative_health() const; + /** * Apply damage to item constrained by @ref min_damage and @ref max_damage * @param qty maximum amount by which to adjust damage (negative permissible) @@ -1287,6 +1294,13 @@ class item : public visitable * For non-armor it returns 0. */ int get_env_resist() const; + /** + * Returns the resistance to environmental effects if an item (for example a gas mask) + * requires a gas filter to operate and this filter is installed. Used in iuse::gasmask to + * change protection of a gas mask if it has (or don't has) filters. For other applications + * use get_env_resist() above. + */ + int get_env_resist_w_filter() const; /** * Whether this is a power armor item. Not necessarily the main armor, it could be a helmet * or similar. diff --git a/src/item_factory.cpp b/src/item_factory.cpp index 4e81fe37347e..93bd271d8523 100644 --- a/src/item_factory.cpp +++ b/src/item_factory.cpp @@ -541,6 +541,7 @@ void Item_factory::init() add_iuse( "CARVER_OFF", &iuse::carver_off ); add_iuse( "CARVER_ON", &iuse::carver_on ); add_iuse( "CATFOOD", &iuse::catfood ); + add_iuse( "CATTLEFODDER", &iuse::feedcattle ); add_iuse( "CHAINSAW_OFF", &iuse::chainsaw_off ); add_iuse( "CHAINSAW_ON", &iuse::chainsaw_on ); add_iuse( "CHEW", &iuse::chew ); @@ -567,7 +568,6 @@ void Item_factory::init() add_iuse( "ELEC_CHAINSAW_ON", &iuse::elec_chainsaw_on ); add_iuse( "EXTINGUISHER", &iuse::extinguisher ); add_iuse( "EYEDROPS", &iuse::eyedrops ); - add_iuse( "FEEDCATTLE", &iuse::feedcattle ); add_iuse( "FIRECRACKER", &iuse::firecracker ); add_iuse( "FIRECRACKER_ACT", &iuse::firecracker_act ); add_iuse( "FIRECRACKER_PACK", &iuse::firecracker_pack ); @@ -611,6 +611,7 @@ void Item_factory::init() add_iuse( "MOP", &iuse::mop ); add_iuse( "MP3", &iuse::mp3 ); add_iuse( "MP3_ON", &iuse::mp3_on ); + add_iuse( "GASMASK", &iuse::gasmask ); add_iuse( "MULTICOOKER", &iuse::multicooker ); add_iuse( "MUTAGEN", &iuse::mutagen ); add_iuse( "MUT_IV", &iuse::mut_iv ); @@ -1314,6 +1315,7 @@ void Item_factory::load( islot_armor &slot, JsonObject &jo, const std::string &s assign( jo, "coverage", slot.coverage, strict, 0, 100 ); assign( jo, "material_thickness", slot.thickness, strict, 0 ); assign( jo, "environmental_protection", slot.env_resist, strict, 0 ); + assign( jo, "environmental_protection_with_filter", slot.env_resist_w_filter, strict, 0 ); assign( jo, "warmth", slot.warmth, strict, 0 ); assign( jo, "storage", slot.storage, strict, 0 ); assign( jo, "power_armor", slot.power_armor, strict ); diff --git a/src/itype.h b/src/itype.h index 8c628c6b1316..6b053beab931 100644 --- a/src/itype.h +++ b/src/itype.h @@ -234,6 +234,10 @@ struct islot_armor { * Resistance to environmental effects. */ int env_resist = 0; + /** + * Environmental protection of a gas mask with installed filter. + */ + int env_resist_w_filter = 0; /** * How much warmth this item provides. */ diff --git a/src/iuse.cpp b/src/iuse.cpp index 876fde1a3a0e..e58a3c714626 100644 --- a/src/iuse.cpp +++ b/src/iuse.cpp @@ -1690,7 +1690,7 @@ int petfood( player &p, const item &it, Petfood animal_food_type ) } break; case CATTLEFODDER: - if( mon.has_flag( MF_MILKABLE ) ) { + if( mon.has_flag( MF_CATTLEFODDER ) ) { p.add_msg_if_player( m_good, _( "The %s seems to like you! It lets you pat its head and seems friendly." ), mon.get_name().c_str() ); mon.friendly = -1; mon.add_effect( effect_pet, 1_turns, num_bp, true ); @@ -3811,6 +3811,58 @@ int iuse::mp3_on(player *p, item *it, bool t, const tripoint &pos) return it->type->charges_to_use(); } +int iuse::gasmask( player *p, item *it, bool t, const tripoint &pos ) +{ + if( t ) { // Normal use + if( p->is_worn( *it ) ) { + // calculate amount of absorbed gas per filter charge + const field &gasfield = g->m.field_at( pos ); + for( auto &dfield : gasfield ) { + const field_entry &entry = dfield.second; + const field_id fid = entry.getFieldType(); + switch( fid ) { + case fd_smoke: + it->set_var( "gas_absorbed", it->get_var( "gas_absorbed", 0 ) + 12 ); + break; + case fd_tear_gas: + case fd_toxic_gas: + case fd_gas_vent: + case fd_relax_gas: + case fd_fungal_haze: + it->set_var( "gas_absorbed", it->get_var( "gas_absorbed", 0 ) + 15 ); + break; + default: + break; + } + } + if( it->get_var( "gas_absorbed", 0 ) >= 100 ) { + it->ammo_consume( 1, p->pos() ); + it->set_var( "gas_absorbed", 0 ); + } + if( it->charges == 0 ) { + p->add_msg_player_or_npc( + m_bad, + _( "Your %s requires new filter!" ), + _( " needs new gas mask filter!" ) + , it->tname().c_str() ); + } + } + } else { // activate + if( it->charges == 0 ) { + p->add_msg_if_player( _( "Your %s don't have a filter." ), it->tname().c_str() ); + } else { + p->add_msg_if_player( _( "You prepared your %s." ), it->tname().c_str() ); + it->active = true; + it->set_var( "overwrite_env_resist", it->get_env_resist_w_filter() ); + } + } + if( it->charges == 0 ) { + it->set_var( "overwrite_env_resist", 0 ); + it->active = false; + } + return it->type->charges_to_use(); +} + int iuse::portable_game(player *p, item *it, bool, const tripoint& ) { if( p->is_npc() ) { diff --git a/src/iuse.h b/src/iuse.h index 5f6ef6fb9552..2490d4e1b3f6 100644 --- a/src/iuse.h +++ b/src/iuse.h @@ -136,6 +136,7 @@ class iuse int shocktonfa_on ( player*, item*, bool, const tripoint& ); int mp3 ( player*, item*, bool, const tripoint& ); int mp3_on ( player*, item*, bool, const tripoint& ); + int gasmask ( player*, item*, bool, const tripoint& ); int portable_game ( player*, item*, bool, const tripoint& ); int vibe ( player*, item*, bool, const tripoint& ); int vortex ( player*, item*, bool, const tripoint& ); diff --git a/src/main_menu.cpp b/src/main_menu.cpp index b21ad88f241f..23499f0ed3b2 100644 --- a/src/main_menu.cpp +++ b/src/main_menu.cpp @@ -136,6 +136,54 @@ std::vector main_menu::load_file( const std::string &path, return result; } +std::string main_menu::handle_input_timeout( input_context &ctxt ) +{ + inp_mngr.set_timeout( 125 ); + + std::string action = ctxt.handle_input(); + + if( action == "TIMEOUT" ) { + init_windows(); + } + + inp_mngr.reset_timeout(); + + return action; +} + +void main_menu::init_windows() +{ + if( LAST_TERMX == TERMX && LAST_TERMY == TERMY ) { + return; + } + + w_background = catacurses::newwin( TERMY, TERMX, 0, 0 ); + werase( w_background ); + wrefresh( w_background ); + + // main window should also expand to use available display space. + // expanding to evenly use up half of extra space, for now. + extra_w = ( ( TERMX - FULL_SCREEN_WIDTH ) / 2 ) - 1; + int extra_h = ( ( TERMY - FULL_SCREEN_HEIGHT ) / 2 ) - 1; + extra_w = ( extra_w > 0 ? extra_w : 0 ); + extra_h = ( extra_h > 0 ? extra_h : 0 ); + const int total_w = FULL_SCREEN_WIDTH + extra_w; + const int total_h = FULL_SCREEN_HEIGHT + extra_h; + + // position of window within main display + const int x0 = ( TERMX - total_w ) / 2; + const int y0 = ( TERMY - total_h ) / 2; + + w_open = catacurses::newwin( total_h, total_w, y0, x0 ); + + iMenuOffsetY = total_h - 3; + // note: if iMenuOffset is changed, + // please update MOTD and credits to indicate how long they can be. + + LAST_TERMX = TERMX; + LAST_TERMY = TERMY; +} + void main_menu::init_strings() { // ASCII Art @@ -261,29 +309,7 @@ bool main_menu::opening_screen() world_generator->set_active_world( NULL ); world_generator->init(); - w_background = catacurses::newwin( TERMY, TERMX, 0, 0 ); - werase( w_background ); - wrefresh( w_background ); - - // main window should also expand to use available display space. - // expanding to evenly use up half of extra space, for now. - extra_w = ( ( TERMX - FULL_SCREEN_WIDTH ) / 2 ) - 1; - int extra_h = ( ( TERMY - FULL_SCREEN_HEIGHT ) / 2 ) - 1; - extra_w = ( extra_w > 0 ? extra_w : 0 ); - extra_h = ( extra_h > 0 ? extra_h : 0 ); - const int total_w = FULL_SCREEN_WIDTH + extra_w; - const int total_h = FULL_SCREEN_HEIGHT + extra_h; - - // position of window within main display - const int x0 = ( TERMX - total_w ) / 2; - const int y0 = ( TERMY - total_h ) / 2; - - w_open = catacurses::newwin( total_h, total_w, y0, x0 ); - - iMenuOffsetY = total_h - 3; - // note: if iMenuOffset is changed, - // please update MOTD and credits to indicate how long they can be. - + init_windows(); init_strings(); print_menu( w_open, 0, iMenuOffsetX, iMenuOffsetY ); @@ -341,7 +367,8 @@ bool main_menu::opening_screen() catacurses::refresh(); } - std::string action = ctxt.handle_input(); + std::string action = handle_input_timeout( ctxt ); + std::string sInput = ctxt.get_raw_input().text; // check automatic menu shortcuts for( size_t i = 0; i < vMenuHotkeys.size(); ++i ) { @@ -422,7 +449,7 @@ bool main_menu::opening_screen() wrefresh( w_open ); catacurses::refresh(); - std::string action = ctxt.handle_input(); + std::string action = handle_input_timeout( ctxt ); if( action == "LEFT" ) { if( sel2 > 0 ) { sel2--; @@ -482,7 +509,7 @@ bool main_menu::opening_screen() print_menu_items( w_open, settings_subs, sel2, yoffset, xoffset - ( xlen / 4 ) ); wrefresh( w_open ); catacurses::refresh(); - std::string action = ctxt.handle_input(); + std::string action = handle_input_timeout( ctxt ); std::string sInput = ctxt.get_raw_input().text; for( int i = 0; i < settings_subs_to_display; ++i ) { for( auto hotkey : vSettingsHotkeys[i] ) { @@ -569,7 +596,7 @@ bool main_menu::new_character_tab() wrefresh( w_open ); catacurses::refresh(); - std::string action = ctxt.handle_input(); + std::string action = handle_input_timeout( ctxt ); std::string sInput = ctxt.get_raw_input().text; for( size_t i = 0; i < vNewGameHotkeys.size(); ++i ) { for( auto hotkey : vNewGameHotkeys[i] ) { @@ -664,7 +691,7 @@ bool main_menu::new_character_tab() } wrefresh( w_open ); catacurses::refresh(); - std::string action = ctxt.handle_input(); + std::string action = handle_input_timeout( ctxt ); if( action == "DOWN" ) { if( sel3 > 0 ) { sel3--; @@ -767,7 +794,7 @@ bool main_menu::load_character_tab() } wrefresh( w_open ); catacurses::refresh(); - const std::string action = ctxt.handle_input(); + std::string action = handle_input_timeout( ctxt ); if( all_worldnames.empty() && ( action == "DOWN" || action == "CONFIRM" ) ) { layer = 1; } else if( action == "DOWN" ) { @@ -824,7 +851,7 @@ bool main_menu::load_character_tab() } wrefresh( w_open ); catacurses::refresh(); - std::string action = ctxt.handle_input(); + std::string action = handle_input_timeout( ctxt ); if( savegames.empty() && ( action == "DOWN" || action == "CONFIRM" ) ) { layer = 2; } else if( action == "DOWN" ) { @@ -901,7 +928,7 @@ void main_menu::world_tab() wrefresh( w_open ); catacurses::refresh(); - std::string action = ctxt.handle_input(); + std::string action = handle_input_timeout( ctxt ); std::string sInput = ctxt.get_raw_input().text; for( size_t i = 0; i < vWorldSubItems.size(); ++i ) { for( auto hotkey : vWorldHotkeys[i] ) { @@ -994,7 +1021,7 @@ void main_menu::world_tab() wrefresh( w_open ); catacurses::refresh(); - std::string action = ctxt.handle_input(); + std::string action = handle_input_timeout( ctxt ); if( action == "DOWN" ) { if( sel2 > 0 ) { diff --git a/src/main_menu.h b/src/main_menu.h index b2c2d6ddc446..e14a5c07f371 100644 --- a/src/main_menu.h +++ b/src/main_menu.h @@ -54,7 +54,7 @@ class main_menu // These variables are shared between @opening_screen and the tab functions. // TODO: But this is an ugly short-term solution. input_context ctxt; - int sel1 = 1, sel2 = 1, sel3 = 1, layer = 1; + int sel1 = 1, sel2 = 1, sel3 = 1, layer = 1, LAST_TERMX = 0, LAST_TERMY = 0; catacurses::window w_open; catacurses::window w_background; int iMenuOffsetX = 0; @@ -90,6 +90,9 @@ class main_menu int iMenuOffsetY, bool bShowDDA = true ); void display_credits(); + + void init_windows(); + std::string handle_input_timeout( input_context &ctxt ); }; #endif diff --git a/src/monster.cpp b/src/monster.cpp index 73bc968a8872..3508009b93df 100644 --- a/src/monster.cpp +++ b/src/monster.cpp @@ -168,6 +168,11 @@ monster::monster() ignoring = 0; upgrades = false; upgrade_time = -1; + last_updated = 0; + baby_timer = -1; + last_baby = 0; + biosig_timer = -1; + last_biosig = 0; } monster::monster( const mtype_id& id ) : monster() @@ -184,7 +189,9 @@ monster::monster( const mtype_id& id ) : monster() morale = type->morale; faction = type->default_faction; ammo = type->starting_ammo; - upgrades = type->upgrades && type->half_life; + upgrades = type->upgrades && (type->half_life || type->age_grow); + reproduces = type->reproduces && type->baby_timer; + biosignatures = type->biosignatures; } monster::monster( const mtype_id& id, const tripoint &p ) : monster(id) @@ -234,6 +241,8 @@ void monster::poly( const mtype_id& id ) } faction = type->default_faction; upgrades = type->upgrades; + reproduces = type->reproduces; + biosignatures = type->biosignatures; } bool monster::can_upgrade() { @@ -256,6 +265,9 @@ void monster::hasten_upgrade() { // This will disable upgrades in case max iters have been reached. // Checking for return value of -1 is necessary. int monster::next_upgrade_time() { + if( type->age_grow > 0 ){ + return type->age_grow; + } const int scaled_half_life = type->half_life * get_option( "MONSTER_UPGRADE_FACTOR" ); int day = scaled_half_life; for( int i = 0; i < UPGRADE_MAX_ITERS; i++ ) { @@ -276,15 +288,15 @@ void monster::try_upgrade(bool pin_time) { return; } - const int current_day = to_days( calendar::time_of_cataclysm - calendar::turn ); - + const int current_day = to_days( calendar::turn - calendar::time_of_cataclysm ); + //This should only occur when a monster is created or upgraded to a new form if (upgrade_time < 0) { upgrade_time = next_upgrade_time(); if (upgrade_time < 0) { return; } - if (pin_time) { - // offset by today + if( pin_time || type->age_grow > 0 ) { + // offset by today, always true for growing creatures upgrade_time += current_day; } else { // offset by starting season @@ -324,6 +336,89 @@ void monster::try_upgrade(bool pin_time) { } } +void monster::try_reproduce() { + if( !reproduces ) { + return; + } + + const int current_day = to_days( calendar::turn - calendar::time_of_cataclysm ); + if( baby_timer < 0 ) { + baby_timer = type->baby_timer; + if( baby_timer < 0 ) { + return; + } + baby_timer += current_day; + } + + bool season_spawn = false; + bool season_match = true; + for( auto &elem : type->baby_flags ) { + if( elem == "SUMMER" || elem == "WINTER" || elem == "SPRING" || elem == "AUTUMN" ) { + season_spawn = true; + } + } + + while( true ) { + if( baby_timer > current_day ) { + return; + } + + if( season_spawn ){ + season_match = false; + for( auto &elem : type->baby_flags ) { + if( ( season_of_year( DAYS( baby_timer ) ) == SUMMER && elem == "SUMMER" ) || + ( season_of_year( DAYS( baby_timer ) ) == WINTER && elem == "WINTER" ) || + ( season_of_year( DAYS( baby_timer ) ) == SPRING && elem == "SPRING" ) || + ( season_of_year( DAYS( baby_timer ) ) == AUTUMN && elem == "AUTUMN" ) ) { + season_match = true; + } + } + } + + if( season_match ){ + if( type->baby_monster ) { + g->m.add_spawn( type->baby_monster, type->baby_count, pos().x, pos().y ); + } else { + g->m.add_item_or_charges( pos(), item( type->baby_egg, DAYS( baby_timer ), type->baby_count ), true ); + } + } + + const int next_baby = type->baby_timer; + if( next_baby < 0 ) { + return; + } + baby_timer += next_baby; + } +} + +void monster::try_biosignature() { + if( !biosignatures ) { + return; + } + + const int current_day = to_days( calendar::turn - calendar::time_of_cataclysm ); + if( biosig_timer < 0 ) { + biosig_timer = type->biosig_timer; + if( biosig_timer < 0 ) { + return; + } + biosig_timer += current_day; + } + + while( true ) { + if( biosig_timer > current_day ) { + return; + } + + g->m.add_item_or_charges( pos(), item( type->biosig_item, DAYS( biosig_timer ), 1 ), true ); + const int next_biosig = type->biosig_timer; + if( next_biosig < 0 ) { + return; + } + biosig_timer += next_biosig; + } +} + void monster::spawn(const tripoint &p) { position = p; diff --git a/src/monster.h b/src/monster.h index 23420cc9e19c..98559990f842 100644 --- a/src/monster.h +++ b/src/monster.h @@ -82,6 +82,8 @@ class monster : public Creature bool can_upgrade(); void hasten_upgrade(); void try_upgrade( bool pin_time ); + void try_reproduce(); + void try_biosignature(); void spawn( const tripoint &p ); m_size get_size() const override; int get_hp( hp_part ) const override; @@ -425,6 +427,9 @@ class monster : public Creature void init_from_item( const item &itm ); time_point last_updated = calendar::time_of_cataclysm; + int last_baby; + int last_biosig; + /** * Do some cleanup and caching as monster is being unloaded from map. */ @@ -449,6 +454,10 @@ class monster : public Creature int next_upgrade_time(); bool upgrades; int upgrade_time; + bool reproduces; + int baby_timer; + bool biosignatures; + int biosig_timer; /** Found path. Note: Not used by monsters that don't pathfind! **/ std::vector path; std::bitset effect_cache; diff --git a/src/monstergenerator.cpp b/src/monstergenerator.cpp index 340300b1f8ce..93e390029d2f 100644 --- a/src/monstergenerator.cpp +++ b/src/monstergenerator.cpp @@ -451,6 +451,7 @@ void MonsterGenerator::init_flags() flag_map["PRIORITIZE_TARGETS"] = MF_PRIORITIZE_TARGETS; flag_map["NOT_HALLUCINATION"] = MF_NOT_HALLU; flag_map["CATFOOD"] = MF_CATFOOD; + flag_map["CATTLEFODDER"] = MF_CATTLEFODDER; flag_map["DOGFOOD"] = MF_DOGFOOD; flag_map["MILKABLE"] = MF_MILKABLE; flag_map["PET_WONT_FOLLOW"] = MF_PET_WONT_FOLLOW; @@ -630,6 +631,7 @@ void mtype::load( JsonObject &jo, const std::string &src ) } else if( jo.has_member( "upgrades" ) ) { JsonObject up = jo.get_object( "upgrades" ); optional( up, was_loaded, "half_life", half_life, -1 ); + optional( up, was_loaded, "age_grow", age_grow, -1 ); optional( up, was_loaded, "into_group", upgrade_group, auto_flags_reader {}, mongroup_id::NULL_ID() ); optional( up, was_loaded, "into", upgrade_into, auto_flags_reader {}, @@ -637,6 +639,33 @@ void mtype::load( JsonObject &jo, const std::string &src ) upgrades = true; } + //Reproduction + if( jo.has_member( "reproduction" ) ) { + JsonObject repro = jo.get_object( "reproduction" ); + optional( repro, was_loaded, "baby_count", baby_count, -1 ); + optional( repro, was_loaded, "baby_timer", baby_timer, -1 ); + optional( repro, was_loaded, "baby_monster", baby_monster, auto_flags_reader {}, + mtype_id::NULL_ID() ); + optional( repro, was_loaded, "baby_egg", baby_egg, auto_flags_reader {}, + "null" ); + if( jo.has_member( "baby_flags" ) ) { + baby_flags.clear(); + JsonArray baby_tags = jo.get_array( "baby_flags" ); + while( baby_tags.has_more() ) { + baby_flags.push_back( baby_tags.next_string() ); + } + } + reproduces = true; + } + + if( jo.has_member( "biosignature" ) ) { + JsonObject biosig = jo.get_object( "biosignature" ); + optional( biosig, was_loaded, "biosig_timer", biosig_timer, -1 ); + optional( biosig, was_loaded, "biosig_item", biosig_item, auto_flags_reader {}, + "null" ); + biosignatures = true; + } + optional( jo, was_loaded, "burn_into", burn_into, auto_flags_reader {}, mtype_id::NULL_ID() ); @@ -920,8 +949,9 @@ void MonsterGenerator::check_monster_definitions() const } if( mon.upgrades ) { - if( mon.half_life < 0 ) { - debugmsg( "half_life %d (< 0) of monster %s is invalid", mon.half_life, mon.id.c_str() ); + if( mon.half_life < 0 && mon.age_grow < 0 ) { + debugmsg( "half_life %d and age_grow %d (<0) of monster %s is invalid", + mon.half_life, mon.age_grow, mon.id.c_str() ); } if( !mon.upgrade_into && !mon.upgrade_group ) { debugmsg( "no into nor into_group defined for monster %s", mon.id.c_str() ); @@ -938,5 +968,44 @@ void MonsterGenerator::check_monster_definitions() const mon.upgrade_group.c_str(), mon.id.c_str() ); } } + + if( mon.reproduces ) { + if( mon.baby_timer < 1 ) { + debugmsg( "Time between reproductions (%d) is invalid for %s", + mon.baby_timer, mon.id.c_str() ); + } + if( mon.baby_count < 1 ) { + debugmsg( "Number of children (%d) is invalid for %s", + mon.baby_count, mon.id.c_str() ); + } + if( !mon.baby_monster && mon.baby_egg == "null" ) { + debugmsg( "No baby or egg defined for monster %s", mon.id.c_str() ); + } + if( mon.baby_monster && mon.baby_egg != "null" ) { + debugmsg( "Both an egg and a live birth baby are defined for %s", mon.id.c_str() ); + } + if( !mon.baby_monster.is_valid() ) { + debugmsg( "baby_monster %s of monster %s is not a valid monster id", + mon.baby_monster.c_str(), mon.id.c_str() ); + } + if( !item::type_is_defined( mon.baby_egg ) ) { + debugmsg( "item_id %s of monster %s is not a valid item id", + mon.baby_egg.c_str(), mon.id.c_str() ); + } + } + + if( mon.biosignatures ) { + if( mon.biosig_timer < 1 ) { + debugmsg( "Time between biosignature drops (%d) is invalid for %s", + mon.biosig_timer, mon.id.c_str() ); + } + if( mon.biosig_item == "null" ) { + debugmsg( "No biosignature drop defined for monster %s", mon.id.c_str() ); + } + if( !item::type_is_defined( mon.biosig_item ) ) { + debugmsg( "item_id %s of monster %s is not a valid item id", + mon.biosig_item.c_str(), mon.id.c_str() ); + } + } } } diff --git a/src/mtype.cpp b/src/mtype.cpp index 9ab1ee1b6bc4..c5c96d6940db 100644 --- a/src/mtype.cpp +++ b/src/mtype.cpp @@ -22,8 +22,20 @@ mtype::mtype() def_chance = 0; upgrades = false; half_life = -1; + age_grow = -1; upgrade_into = mtype_id::NULL_ID(); upgrade_group = mongroup_id::NULL_ID(); + + reproduces = false; + baby_timer = -1; + baby_count = -1; + baby_monster = mtype_id::NULL_ID(); + baby_egg = "null"; + + biosignatures = false; + biosig_timer = -1; + biosig_item = "null"; + burn_into = mtype_id::NULL_ID(); dies.push_back( &mdeath::normal ); sp_defense = nullptr; diff --git a/src/mtype.h b/src/mtype.h index ee5b6ce0a75c..4b3761354026 100644 --- a/src/mtype.h +++ b/src/mtype.h @@ -159,6 +159,7 @@ enum m_flag : int { MF_PRIORITIZE_TARGETS, // This monster will prioritize targets depending on their danger levels MF_NOT_HALLU, // Monsters that will NOT appear when player's producing hallucinations MF_CATFOOD, // This monster will become friendly when fed cat food. + MF_CATTLEFODDER, // This monster will become friendly when fed cattle fodder. MF_DOGFOOD, // This monster will become friendly when fed dog food. MF_MILKABLE, // This monster is milkable. MF_PET_WONT_FOLLOW, // This monster won't follow the player automatically when tamed. @@ -266,10 +267,24 @@ struct mtype { // Monster upgrade variables bool upgrades; int half_life; + int age_grow; mtype_id upgrade_into; mongroup_id upgrade_group; mtype_id burn_into; + // Monster reproduction variables + bool reproduces; + int baby_timer; + int baby_count; + mtype_id baby_monster; + itype_id baby_egg; + std::vector baby_flags; + + // Monster biosignature variables + bool biosignatures; + int biosig_timer; + itype_id biosig_item; + // Monster's ability to destroy terrain and vehicles int bash_skill; diff --git a/src/newcharacter.cpp b/src/newcharacter.cpp index 643ef8bd474a..8a2e32d67534 100644 --- a/src/newcharacter.cpp +++ b/src/newcharacter.cpp @@ -52,6 +52,11 @@ #define COL_TR_BAD_ON_ACT c_light_red // A toggled-on bad trait #define COL_TR_BAD_OFF_PAS c_dark_gray // A toggled-off bad trait #define COL_TR_BAD_ON_PAS c_red // A toggled-on bad trait +#define COL_TR_NEUT c_brown // Neutral trait descriptive text +#define COL_TR_NEUT_OFF_ACT c_dark_gray // A toggled-off neutral trait +#define COL_TR_NEUT_ON_ACT c_yellow // A toggled-on neutral trait +#define COL_TR_NEUT_OFF_PAS c_dark_gray // A toggled-off neutral trait +#define COL_TR_NEUT_ON_PAS c_brown // A toggled-on neutral trait #define COL_SKILL_USED c_green // A skill with at least one point #define COL_HEADER c_white // Captions, like "Profession items" #define COL_NOTE_MAJOR c_green // Important note @@ -1028,7 +1033,7 @@ tab_direction set_traits( const catacurses::window &w, player &u, points_left &p // Track how many good / bad POINTS we have; cap both at MAX_TRAIT_POINTS int num_good = 0, num_bad = 0; - std::vector vStartingTraits[2]; + std::vector vStartingTraits[3]; for( auto &traits_iter : mutation_branch::get_all() ) { // Don't list blacklisted traits @@ -1036,23 +1041,30 @@ tab_direction set_traits( const catacurses::window &w, player &u, points_left &p continue; } + // Always show profession locked traits, regardless of if they are forbidden + const std::vector proftraits = u.prof->get_locked_traits(); + const bool is_proftrait = std::find( proftraits.begin(), proftraits.end(), traits_iter.first ) != proftraits.end(); // We show all starting traits, even if we can't pick them, to keep the interface consistent. - if( traits_iter.second.startingtrait || g->scen->traitquery( traits_iter.first ) ) { - if( traits_iter.second.points >= 0 ) { + if( traits_iter.second.startingtrait || g->scen->traitquery( traits_iter.first ) || is_proftrait ) { + if( traits_iter.second.points > 0 ) { vStartingTraits[0].push_back( traits_iter.first ); if( u.has_trait( traits_iter.first ) ) { num_good += traits_iter.second.points; } - } else { + } else if( traits_iter.second.points < 0 ) { vStartingTraits[1].push_back( traits_iter.first ); if( u.has_trait( traits_iter.first ) ) { num_bad += traits_iter.second.points; } + } else { + vStartingTraits[2].push_back( traits_iter.first ); } } } + //If the third page is empty, only use the first two. + const int used_pages = vStartingTraits[2].empty() ? 2 : 3; for( auto &vStartingTrait : vStartingTraits ) { std::sort( vStartingTrait.begin(), vStartingTrait.end(), trait_display_sort ); @@ -1063,19 +1075,14 @@ tab_direction set_traits( const catacurses::window &w, player &u, points_left &p const size_t iContentHeight = TERMY - 9; int iCurWorkingPage = 0; - int iStartPos[2]; - iStartPos[0] = 0; - iStartPos[1] = 0; - - int iCurrentLine[2]; - iCurrentLine[0] = 0; - iCurrentLine[1] = 0; - - size_t traits_size[2]; - traits_size[0] = vStartingTraits[0].size(); - traits_size[1] = vStartingTraits[1].size(); + int iStartPos[3] = { 0, 0, 0 }; + int iCurrentLine[3] = { 0, 0, 0 }; + size_t traits_size[3]; + for( int i = 0; i < 3; i++ ) { + traits_size[i] = vStartingTraits[i].size(); + } - const size_t page_width = 38; + const size_t page_width = std::min( ( TERMX - 4 ) / used_pages, 38 ); input_context ctxt("NEW_CHAR_TRAITS"); ctxt.register_cardinal(); @@ -1095,25 +1102,36 @@ tab_direction set_traits( const catacurses::window &w, player &u, points_left &p // Clear the bottom of the screen. werase(w_description); - for (int iCurrentPage = 0; iCurrentPage < 2; iCurrentPage++) { //Good/Bad - if (iCurrentPage == 0) { - col_on_act = COL_TR_GOOD_ON_ACT; + for (int iCurrentPage = 0; iCurrentPage < 3; iCurrentPage++) { //Good/Bad + switch( iCurrentPage ) { + case 0: + col_on_act = COL_TR_GOOD_ON_ACT; col_off_act = COL_TR_GOOD_OFF_ACT; - col_on_pas = COL_TR_GOOD_ON_PAS; + col_on_pas = COL_TR_GOOD_ON_PAS; col_off_pas = COL_TR_GOOD_OFF_PAS; col_tr = COL_TR_GOOD; - hi_on = hilite(col_on_act); - hi_off = hilite(col_off_act); - } else { - col_on_act = COL_TR_BAD_ON_ACT; + hi_on = hilite( col_on_act ); + hi_off = hilite( col_off_act ); + break; + case 1: + col_on_act = COL_TR_BAD_ON_ACT; col_off_act = COL_TR_BAD_OFF_ACT; - col_on_pas = COL_TR_BAD_ON_PAS; + col_on_pas = COL_TR_BAD_ON_PAS; col_off_pas = COL_TR_BAD_OFF_PAS; col_tr = COL_TR_BAD; - hi_on = hilite(col_on_act); - hi_off = hilite(col_off_act); + hi_on = hilite( col_on_act ); + hi_off = hilite( col_off_act ); + break; + default: + col_on_act = COL_TR_NEUT_ON_ACT; + col_off_act = COL_TR_NEUT_OFF_ACT; + col_on_pas = COL_TR_NEUT_ON_PAS; + col_off_pas = COL_TR_NEUT_OFF_PAS; + col_tr = COL_TR_NEUT; + hi_on = hilite( col_on_act ); + hi_off = hilite( col_off_act ); + break; } - int start_y = iStartPos[iCurrentPage]; int cur_line_y = iCurrentLine[iCurrentPage]; calcStartPos( start_y, cur_line_y, iContentHeight, @@ -1173,12 +1191,12 @@ tab_direction set_traits( const catacurses::window &w, player &u, points_left &p int cur_line_y = 5 + i - start_y; int cur_line_x = 2 + iCurrentPage * page_width; mvwprintz( w, cur_line_y, cur_line_x, c_light_gray, std::string( page_width, ' ' ).c_str() ); - mvwprintz( w, cur_line_y, cur_line_x, cLine, mdata.name.c_str() ); + mvwprintz( w, cur_line_y, cur_line_x, cLine, utf8_truncate( mdata.name, page_width - 2 ).c_str() ); } - //Draw Scrollbar, one for good and one for bad traits - draw_scrollbar(w, iCurrentLine[0], iContentHeight, traits_size[0], 5); - draw_scrollbar(w, iCurrentLine[1], iContentHeight, traits_size[1], 5, getmaxx(w) - 1); + for( int i = 0; i < used_pages; i++ ) { + draw_scrollbar( w, iCurrentLine[i], iContentHeight, traits_size[i], 5 , page_width * i ); + } } wrefresh(w); @@ -1187,11 +1205,11 @@ tab_direction set_traits( const catacurses::window &w, player &u, points_left &p if (action == "LEFT") { iCurWorkingPage--; if (iCurWorkingPage < 0) { - iCurWorkingPage = 1; + iCurWorkingPage = used_pages - 1; } } else if (action == "RIGHT") { iCurWorkingPage++; - if (iCurWorkingPage > 1) { + if (iCurWorkingPage > used_pages - 1 ) { iCurWorkingPage = 0; } } else if (action == "UP") { diff --git a/src/options.cpp b/src/options.cpp index 3eff017803ef..9afa76601940 100644 --- a/src/options.cpp +++ b/src/options.cpp @@ -1844,7 +1844,7 @@ std::string options_manager::show(bool ingame, const bool world_options_only) std::stringstream value_conversion(OPTIONS[mPageItems[iCurrentPage][iCurrentLine]].getValueName()); value_conversion >> new_terminal_x; - new_window_width = projected_window_width(new_terminal_x); + new_window_width = projected_window_width(); fold_and_print(w_options_tooltip, 0, 0, 78, c_white, ngettext("%s #%s -- The window will be %d pixel wide with the selected value.", @@ -1858,7 +1858,7 @@ std::string options_manager::show(bool ingame, const bool world_options_only) std::stringstream value_conversion(OPTIONS[mPageItems[iCurrentPage][iCurrentLine]].getValueName()); value_conversion >> new_terminal_y; - new_window_height = projected_window_height(new_terminal_y); + new_window_height = projected_window_height(); fold_and_print(w_options_tooltip, 0, 0, 78, c_white, ngettext("%s #%s -- The window will be %d pixel tall with the selected value.", @@ -1984,6 +1984,7 @@ std::string options_manager::show(bool ingame, const bool world_options_only) bool used_tiles_changed = false; bool pixel_minimap_changed = false; bool sidebar_style_changed = false; + bool terminal_size_changed = true; for (auto &iter : OPTIONS_OLD) { if ( iter.second != OPTIONS[iter.first] ) { @@ -1997,17 +1998,18 @@ std::string options_manager::show(bool ingame, const bool world_options_only) || iter.first == "PIXEL_MINIMAP_RATIO" || iter.first == "PIXEL_MINIMAP_MODE" ) { pixel_minimap_changed = true; - } - if( iter.first == "SIDEBAR_STYLE" ) { + } else if( iter.first == "SIDEBAR_STYLE" ) { sidebar_style_changed = true; - } - if ( iter.first == "TILES" || iter.first == "USE_TILES" ) { + } else if ( iter.first == "TILES" || iter.first == "USE_TILES" ) { used_tiles_changed = true; } else if ( iter.first == "USE_LANG" ) { lang_changed = true; + + } else if ( iter.first == "TERMINAL_X" || iter.first == "TERMINAL_Y" ) { + terminal_size_changed = true; } } } @@ -2033,6 +2035,7 @@ std::string options_manager::show(bool ingame, const bool world_options_only) } } } + if( lang_changed ) { set_language(); } @@ -2049,6 +2052,14 @@ std::string options_manager::show(bool ingame, const bool world_options_only) } } +#if (defined TILES || defined _WIN32 || defined WINDOWS) + if ( terminal_size_changed ) { + handle_resize( projected_window_width(), projected_window_height() ); + } +#else + (void) terminal_size_changed; +#endif + refresh_tiles( used_tiles_changed, pixel_minimap_changed, ingame ); return ""; diff --git a/src/overmap.cpp b/src/overmap.cpp index 1377e2633ad3..a1563cd9345d 100644 --- a/src/overmap.cpp +++ b/src/overmap.cpp @@ -2934,7 +2934,7 @@ tripoint overmap::draw_overmap(const tripoint &orig, const draw_data_t &data) werase(g->w_overmap); werase(g->w_omlegend); catacurses::erase(); - g->refresh_all(); + g->init_ui( true ); return ret; } diff --git a/src/player.cpp b/src/player.cpp index 77695b8c34dd..dc5c98abf50d 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -1666,7 +1666,7 @@ int player::blood_loss( body_part bp ) const { int hp_cur_sum = 1; int hp_max_sum = 1; - + if( bp == bp_leg_l || bp == bp_leg_r ) { hp_cur_sum = hp_cur[hp_leg_l] + hp_cur[hp_leg_r]; hp_max_sum = hp_max[hp_leg_l] + hp_max[hp_leg_r]; @@ -1680,7 +1680,7 @@ int player::blood_loss( body_part bp ) const hp_cur_sum = hp_cur[hp_head]; hp_max_sum = hp_max[hp_head]; } - + hp_cur_sum = std::min( hp_max_sum, std::max( 0, hp_cur_sum ) ); return 100 - ( 100 * hp_cur_sum ) / hp_max_sum; } @@ -5156,24 +5156,35 @@ void player::suffer() } } // Done with while-awake-only effects - if( has_trait( trait_ASTHMA ) && one_in(3600 - stim * 50) && + if( has_trait( trait_ASTHMA ) && one_in( ( 3600 - stim * 50 ) * ( has_effect( effect_sleep ) ? 10 : 1 ) ) && !has_effect( effect_adrenaline ) & !has_effect( effect_datura ) ) { - bool auto_use = has_charges("inhaler", 1); - if (underwater) { + bool auto_use = has_charges( "inhaler", 1 ); + if ( underwater ) { oxygen = oxygen / 2; auto_use = false; } if( has_effect( effect_sleep ) ) { - add_msg_if_player(_("You have an asthma attack!")); - wake_up(); - auto_use = false; - } else { - add_msg_if_player( m_bad, _( "You have an asthma attack!" ) ); - } - - if (auto_use) { - use_charges("inhaler", 1); + inventory map_inv; + map_inv.form_from_map( g->u.pos(), 2 ); + // check if character has an inhaler + if ( auto_use ) { + add_msg_if_player( m_bad, _( "You have an asthma attack!" ) ); + use_charges( "inhaler", 1 ); + add_msg_if_player( m_info, _( "You use your inhaler and go back to sleep." ) ); + // check if an inhaler is somewhere near + } else if ( map_inv.has_charges( "inhaler", 1 ) ) { + add_msg_if_player( m_bad, _( "You have an asthma attack!" ) ); + // create new variable to resolve a reference issue + long amount = 1; + g->m.use_charges( g->u.pos(), 2, "inhaler", amount ); + add_msg_if_player( m_info, _( "You use your inhaler and go back to sleep." ) ); + } else { + add_effect( effect_asthma, rng( 5_minutes, 20_minutes ) ); + wake_up(); + } + } else if ( auto_use ) { + use_charges( "inhaler", 1 ); moves -= 40; const auto charges = charges_of( "inhaler" ); if( charges == 0 ) { @@ -5185,7 +5196,7 @@ void player::suffer() } } else { add_effect( effect_asthma, rng( 5_minutes, 20_minutes ) ); - if (!is_npc()) { + if ( !is_npc() ) { g->cancel_activity_query( _( "You have an asthma attack!" ) ); } } diff --git a/src/player_display.cpp b/src/player_display.cpp index 76bddb580395..07dc8a93b858 100644 --- a/src/player_display.cpp +++ b/src/player_display.cpp @@ -153,13 +153,21 @@ std::string dodge_skill_text( double mod ) return string_format( _( "Dodge skill %+.1f. " ), mod ); } -std::string get_encumbrance_description( const player &p, body_part bp, bool combine ) + +int get_encumbrance( const player &p, body_part bp, bool combine ) { - std::string s; // Body parts that can't combine with anything shouldn't print double values on combine // This shouldn't happen, but handle this, just in case bool combines_with_other = ( int )bp_aiOther[bp] != bp; - int eff_encumbrance = p.encumb( bp ) * ( ( combine && combines_with_other ) ? 2 : 1 ); + return p.encumb( bp ) * ( ( combine && combines_with_other ) ? 2 : 1 ); +} + +std::string get_encumbrance_description( const player &p, body_part bp, bool combine ) +{ + std::string s; + + const int eff_encumbrance = get_encumbrance( p, bp, combine ); + switch( bp ) { case bp_torso: { const int melee_roll_pen = std::max( -eff_encumbrance, -80 ); @@ -550,8 +558,15 @@ Strength - 4; Dexterity - 4; Intelligence - 4; Perception - 4" ) ); if( line < skill_win_size_y + 1 ) { mvwprintz( w_skills, line, 1, text_color, "%s:", ( elem )->name().c_str() ); - mvwprintz( w_skills, line, 19, text_color, "%-2d(%2d%%)", level_num, - ( exercise < 0 ? 0 : exercise ) ); + + if( ( elem )->ident() == skill_id( "dodge" ) ) { + mvwprintz( w_skills, line, 15, text_color, "%-.1f/%-2d(%2d%%)", + get_dodge(), level_num, exercise < 0 ? 0 : exercise ); + } else { + mvwprintz( w_skills, line, 19, text_color, "%-2d(%2d%%)", level_num, + ( exercise < 0 ? 0 : exercise ) ); + } + line++; } } @@ -990,8 +1005,14 @@ Strength - 4; Dexterity - 4; Intelligence - 4; Perception - 4" ) ); } mvwprintz( w_skills, int( 1 + i - min ), 1, c_light_gray, " " ); mvwprintz( w_skills, int( 1 + i - min ), 1, cstatus, "%s:", aSkill->name().c_str() ); - mvwprintz( w_skills, int( 1 + i - min ), 19, cstatus, "%-2d(%2d%%)", level.level(), - ( exercise < 0 ? 0 : exercise ) ); + + if( aSkill->ident() == skill_id( "dodge" ) ) { + mvwprintz( w_skills, int( 1 + i - min ), 15, cstatus, "%-.1f/%-2d(%2d%%)", + get_dodge(), level.level(), exercise < 0 ? 0 : exercise ); + } else { + mvwprintz( w_skills, int( 1 + i - min ), 19, cstatus, "%-2d(%2d%%)", level.level(), + ( exercise < 0 ? 0 : exercise ) ); + } } draw_scrollbar( w_skills, line, skill_win_size_y, int( skillslist.size() ), 1 ); @@ -1034,8 +1055,14 @@ Strength - 4; Dexterity - 4; Intelligence - 4; Perception - 4" ) ); } mvwprintz( w_skills, i + 1, 1, cstatus, "%s:", thisSkill->name().c_str() ); - mvwprintz( w_skills, i + 1, 19, cstatus, "%-2d(%2d%%)", level.level(), - ( level.exercise() < 0 ? 0 : level.exercise() ) ); + + if( thisSkill->ident() == skill_id( "dodge" ) ) { + mvwprintz( w_skills, i + 1, 15, cstatus, "%-.1f/%-2d(%2d%%)", + get_dodge(), level.level(), level.exercise() < 0 ? 0 : level.exercise() ); + } else { + mvwprintz( w_skills, i + 1, 19, cstatus, "%-2d(%2d%%)", level.level(), + ( level.exercise() < 0 ? 0 : level.exercise() ) ); + } } wrefresh( w_skills ); line = 0; diff --git a/src/requirements.cpp b/src/requirements.cpp index 26f9a6cab7bb..bf47571dfc96 100644 --- a/src/requirements.cpp +++ b/src/requirements.cpp @@ -474,7 +474,20 @@ std::vector requirement_data::get_folded_list( int width, for( const auto &comp_list : objs ) { const bool has_one = any_marked_available( comp_list ); std::ostringstream buffer; + std::vector buffer_has; + bool already_has; for( auto a = comp_list.begin(); a != comp_list.end(); ++a ) { + already_has = false; + for( auto cont : buffer_has ) { + if( cont == a->to_string( batch ) + a->get_color( has_one, crafting_inv, batch ) ) { + already_has = true; + break; + } + } + if( already_has ) { + continue; + } + if( a != comp_list.begin() ) { buffer << " " << _( "OR" ) << " "; } @@ -486,6 +499,7 @@ std::vector requirement_data::get_folded_list( int width, buffer << ""; } buffer << a->to_string( batch ) << "" << ""; + buffer_has.push_back( a->to_string( batch ) + a->get_color( has_one, crafting_inv, batch ) ); } std::vector folded = foldstring( buffer.str(), width - 2 ); diff --git a/src/savegame_json.cpp b/src/savegame_json.cpp index 1c7b5f4f59fe..549648dd4c04 100644 --- a/src/savegame_json.cpp +++ b/src/savegame_json.cpp @@ -1384,6 +1384,12 @@ void monster::load(JsonObject &data) upgrades = data.get_bool("upgrades", type->upgrades); upgrade_time = data.get_int("upgrade_time", -1); + reproduces = data.get_bool("reproduces", type->reproduces); + baby_timer = data.get_int("baby_timer", -1); + + biosignatures = data.get_bool("biosignatures", type->biosignatures); + biosig_timer = data.get_int("biosig_timer", -1); + data.read("inv", inv); if( data.has_int("ammo") && !type->starting_ammo.empty() ) { // Legacy loading for ammo. @@ -1396,6 +1402,8 @@ void monster::load(JsonObject &data) if( !data.read( "last_updated", last_updated ) ) { last_updated = calendar::turn; } + last_baby = data.get_int( "last_baby", calendar::turn ); + last_biosig = data.get_int( "last_biosig", calendar::turn ); data.read( "path", path ); } @@ -1441,7 +1449,13 @@ void monster::store(JsonOut &json) const json.member( "underwater", underwater ); json.member("upgrades", upgrades); json.member("upgrade_time", upgrade_time); - json.member( "last_updated", last_updated ); + json.member("last_updated", last_updated); + json.member("reproduces", reproduces); + json.member("baby_timer", baby_timer); + json.member("last_baby", last_baby); + json.member("biosignatures", biosignatures); + json.member("biosig_timer", biosig_timer); + json.member("last_biosig", last_biosig); json.member( "inv", inv ); diff --git a/src/sdltiles.cpp b/src/sdltiles.cpp index 195c489bc2bb..07f3cbaebafe 100644 --- a/src/sdltiles.cpp +++ b/src/sdltiles.cpp @@ -368,8 +368,6 @@ bool WinCreate() TERMINAL_HEIGHT = WindowHeight / fontheight; } - SDL_SetWindowMinimumSize( ::window.get(), fontwidth * 80, fontheight * 24 ); - // Initialize framebuffer caches terminal_framebuffer.resize(TERMINAL_HEIGHT); for (int i = 0; i < TERMINAL_HEIGHT; i++) { @@ -418,6 +416,8 @@ bool WinCreate() } } + SDL_SetWindowMinimumSize( ::window.get(), fontwidth * 80, fontheight * 24 ); + ClearScreen(); // Errors here are ignored, worst case: the option does not work as expected, @@ -1606,14 +1606,14 @@ static int test_face_size(std::string f, int size, int faceIndex) return faceIndex; } -// Calculates the new width of the window, given the number of columns. -int projected_window_width(int) +// Calculates the new width of the window +int projected_window_width() { return get_option( "TERMINAL_X" ) * fontwidth; } -// Calculates the new height of the window, given the number of rows. -int projected_window_height(int) +// Calculates the new height of the window +int projected_window_height() { return get_option( "TERMINAL_Y" ) * fontheight; } @@ -1788,7 +1788,6 @@ bool gamepad_available() { void rescale_tileset(int size) { tilecontext->set_draw_scale(size); game_ui::init_ui(); - ClearScreen(); } bool input_context::get_coordinates( const catacurses::window &capture_win_, int& x, int& y) { diff --git a/src/wincurse.cpp b/src/wincurse.cpp index 30b74bce93aa..d630c932c9aa 100644 --- a/src/wincurse.cpp +++ b/src/wincurse.cpp @@ -113,7 +113,7 @@ bool WinCreate() 0, 0, WindowINST, NULL); if (WindowHandle == 0) return false; - + return true; }; @@ -157,10 +157,10 @@ void create_backbuffer() DeleteObject(SelectObject( backbuffer, backbit ) );//load the buffer into DC } -void handle_resize() +bool handle_resize(int, int) { if( !initialized ) { - return; + return false; } needs_resize = false; RECT WndRect; @@ -179,6 +179,8 @@ void handle_resize() } catacurses::refresh(); } + + return true; } // Copied from sdlcurses.cpp @@ -306,7 +308,7 @@ LRESULT CALLBACK ProcessMessages(HWND__ *hWnd,unsigned int Msg, lastchar = code; } return 0; - + case WM_SIZE: case WM_SIZING: needs_resize = true; @@ -382,7 +384,7 @@ inline void FillRectDIB(int x, int y, int width, int height, unsigned char color void cata_cursesport::curses_drawwindow( const catacurses::window &w ) { - + WINDOW *const win = w.get(); int i,j,drawx,drawy; wchar_t tmp; @@ -506,18 +508,18 @@ void CheckMessages() DispatchMessage(&msg); } if( needs_resize ) { - handle_resize(); + handle_resize(0, 0); } } -// Calculates the new width of the window, given the number of columns. -int projected_window_width(int) +// Calculates the new width of the window +int projected_window_width() { return get_option( "TERMINAL_X" ) * fontwidth; } -// Calculates the new height of the window, given the number of rows. -int projected_window_height(int) +// Calculates the new height of the window +int projected_window_height() { return get_option( "TERMINAL_Y" ) * fontheight; } @@ -589,7 +591,7 @@ void catacurses::init_interface() stdscr = newwin( get_option( "TERMINAL_Y" ), get_option( "TERMINAL_X" ),0,0 ); //newwin calls `new WINDOW`, and that will throw, but not return nullptr. - + initialized = true; }