Jump to content

It's been a year since last major update.


FeNniX

Recommended Posts

On 8/3/2020 at 11:17 AM, Ogrecakes said:

When you take a look at the code, and realize that Scorpions have broken target sharing code thats left in, the Hippapotamoose has a huge amount of unfinished reworked code that is left in its file that was replaced with temporary code, the fact that several things use the wrong sound paths and are misaing sounds because of it, the Platapine being labeled as like 5 different names when looking at all of its files, and the HUGE amount of cut and unfinished content... well, it's easy to say they cut development short and kicked the dlc out the door.

How ironic.

Spoiler

Let's take a look at the Uncompromising Mod code. Your mod! It must be so much more amazing than Klei's code amirite?....

Oh, wonderful. There are 31 instances I have found where the Mod replaces functions instead of wrapping the functions(Saving the original function and running it in your new function)
 

Spoiler


local function feather_equip(inst, owner)
	onequip(inst, owner)
		
	owner:AddTag("penguin_protection")
    local attractor = owner.components.birdattractor
    if attractor then
		attractor.spawnmodifier:SetModifier(inst, TUNING.BIRD_SPAWN_MAXDELTA_FEATHERHAT, "maxbirds")
		attractor.spawnmodifier:SetModifier(inst, TUNING.BIRD_SPAWN_DELAYDELTA_FEATHERHAT.MIN, "mindelay")
		attractor.spawnmodifier:SetModifier(inst, TUNING.BIRD_SPAWN_DELAYDELTA_FEATHERHAT.MAX, "maxdelay")
            
	local birdspawner = TheWorld.components.birdspawner
		if birdspawner ~= nil then
			birdspawner:ToggleUpdate(true)
		end
	end
end

local function feather_unequip(inst, owner)
	onunequip(inst, owner)
	owner:RemoveTag("penguin_protection")

	local attractor = owner.components.birdattractor
	if attractor then
		attractor.spawnmodifier:RemoveModifier(inst)

	local birdspawner = TheWorld.components.birdspawner
		if birdspawner ~= nil then
			birdspawner:ToggleUpdate(true)
		end
	end
end

if inst.components.equippable ~= nil then
	inst.components.equippable:SetOnEquip(feather_equip)
	inst.components.equippable:SetOnUnequip(feather_unequip)
end

 

Spoiler


local function onattack(inst, attacker, target)
    if target ~= nil and (target:HasTag("shadow") or target:HasTag("shadowminion") or target:HasTag("shadowchesspiece") or target:HasTag("stalker") or target:HasTag("stalkerminion")) and not target.components.health:IsDead() then
        target.components.health:DoDelta(-12)
        --print("damage")
    end

        --print("hit")
    inst.components.weapon.attackwear = target ~= nil and target:IsValid() 
        and (target:HasTag("shadow") or target:HasTag("shadowminion") or target:HasTag("shadowchesspiece") or target:HasTag("stalker") or target:HasTag("stalkerminion")) 
        and TUNING.GLASSCUTTER.SHADOW_WEAR 
        or 1
end

if inst.components.weapon ~= nil then
        inst.components.weapon:SetOnAttack(onattack)
    end

 

And there is so much more. But let's continue....

Ah, look at this! You run and replace the depth worms attack in the caves not once but twice in the mod. But hey the code must get better right? Every mod/game has a little bit of stinky code. it has to get better.... right?

In postinits/prefab/cave.lua and init/init_weather/init_harder_weather.lua

Spoiler


env.AddPrefabPostInit("cave", function(inst)
    if not TheWorld.ismastersim then
        return
    end
    
    --inst:AddComponent("cavedeerclopsspawner")
    --[[
    if GetModConfigData("gamemode") == GAMEMODE_UNCOMPROMISING or
    (GetModConfigData("gamemode") == GAMEMODE_CUSTOM_SETTINGS and GetModConfigData("harder_weather") == true) then
    inst:AddComponent("hayfever_tracker")
    end--]]
    
        --inst:AddComponent("leechspawner") can reenable this once leeches are finished
    
local newwormspawn =
{
    base_prefab = "worm",
    winter_prefab = "shockworm",
    summer_prefab = "shockworm",

    attack_levels =
    {
        intro   = { warnduration = function() return 120 end, numspawns = function() return 1 end },
        light   = { warnduration = function() return 60 end, numspawns = function() return 1 + math.random(0,1) end },
        med     = { warnduration = function() return 45 end, numspawns = function() return 1 + math.random(0,1) end },
        heavy   = { warnduration = function() return 30 end, numspawns = function() return 2 + math.random(0,1) end },
        crazy   = { warnduration = function() return 30 end, numspawns = function() return 3 + math.random(0,2) end },
    },

    attack_delays =
    {
        rare        = function() return TUNING.TOTAL_DAY_TIME * 10, math.random() * TUNING.TOTAL_DAY_TIME * 7 end,
        occasional  = function() return TUNING.TOTAL_DAY_TIME * 8, math.random() * TUNING.TOTAL_DAY_TIME * 7 end,
        frequent    = function() return TUNING.TOTAL_DAY_TIME * 6, math.random() * TUNING.TOTAL_DAY_TIME * 5 end,
    },

    warning_speech = "ANNOUNCE_WORMS",

    --Key = time, Value = sound prefab
    warning_sound_thresholds =
    {
        { time = 30, sound = "LVL4_WORM" },
        { time = 60, sound = "LVL3_WORM" },
        { time = 90, sound = "LVL2_WORM" },
        { time = 500, sound = "LVL1_WORM" },
    },
}
inst.components.hounded:SetSpawnData(newwormspawn)
end)
Spoiler



env.AddPrefabPostInit("cave", function(inst)
    if not TheWorld.ismastersim then
        return
    end
    
    inst:AddComponent("cavedeerclopsspawner")
    inst:AddComponent("randomnighteventscaves")
    
    local newwormspawn =
{
    base_prefab = "worm",
    winter_prefab = "shockworm",
    summer_prefab = "shockworm",

    attack_levels =
    {
        intro   = { warnduration = function() return 120 end, numspawns = function() return 1 end },
        light   = { warnduration = function() return 60 end, numspawns = function() return 1 + math.random(0,1) end },
        med     = { warnduration = function() return 45 end, numspawns = function() return 1 + math.random(0,1) end },
        heavy   = { warnduration = function() return 30 end, numspawns = function() return 2 + math.random(0,1) end },
        crazy   = { warnduration = function() return 30 end, numspawns = function() return 3 + math.random(0,2) end },
    },

    attack_delays =
    {
        rare        = function() return TUNING.TOTAL_DAY_TIME * 10, math.random() * TUNING.TOTAL_DAY_TIME * 7 end,
        occasional  = function() return TUNING.TOTAL_DAY_TIME * 8, math.random() * TUNING.TOTAL_DAY_TIME * 7 end,
        frequent    = function() return TUNING.TOTAL_DAY_TIME * 6, math.random() * TUNING.TOTAL_DAY_TIME * 5 end,
    },

    warning_speech = "ANNOUNCE_WORMS",

    --Key = time, Value = sound prefab
    warning_sound_thresholds =
    {
        { time = 30, sound = "LVL4_WORM" },
        { time = 60, sound = "LVL3_WORM" },
        { time = 90, sound = "LVL2_WORM" },
        { time = 500, sound = "LVL1_WORM" },
    },
}
inst.components.hounded:SetSpawnData(newwormspawn)
end)

 

 

Let's not forget about how you replace crafting recipes to change their ingredients instead of simply changing or adding on to their ingredients table. Breaking compatibility with other mods who dare to change anything to these recipes and breaking the vanilla game if Klei decides to change any of these recipes in any way

Spoiler


Recipe("catcoonhat", {Ingredient("coontail", 5), Ingredient("silk", 4)}, RECIPETABS.DRESS, TECH.SCIENCE_TWO)
Recipe("moonrockidol", {Ingredient("moonrocknugget", GLOBAL.TUNING.DSTU.RECIPE_MOONROCK_IDOL_MOONSTONE_COST), Ingredient("purplegem", 1)}, RECIPETABS.CELESTIAL, TECH.CELESTIAL_ONE, nil, nil, true)
Recipe("minifan", {Ingredient("twigs", 3), Ingredient("petals",4)}, RECIPETABS.SURVIVAL, TECH.NONE)
Recipe("goggleshat", {Ingredient("goldnugget", 4), Ingredient("pigskin",1), Ingredient("houndstooth", 2)}, RECIPETABS.DRESS, TECH.SCIENCE_ONE)
Recipe("deserthat", {Ingredient("goggleshat", 1), Ingredient("pigskin",2)}, RECIPETABS.DRESS, TECH.SCIENCE_TWO)

 

And not to mention the several instances of the mod replacing loot tables and/or tables in the vanilla game, instead of adding onto them. which will have consequences if any mods also change loot tables of the game, or if Klei updates loot tables

Spoiler


if inst.components.lootdropper ~= nil then
	 inst.components.lootdropper:SetChanceLootTable("toadystool") end
 --
 if inst.components.lootdropper ~= nil then
	 inst.components.lootdropper:SetChanceLootTable("toadystool_dark") 
end

 

Oh, and this wonderful code. The CheckForSnow function is ran every two seconds on many basic structures, and in that CheckForSnow function the RemovedSnowedTag is set to run in 400 seconds, but oh boy. Your code doesnt check if the RemovedSnowTag function is set to run in 400 seconds and so the game constantly keeps making tasks to run the RemovedSnowTag function everytime the CheckForSnow function is ran, aka every two seconds. Resulting in these tasks building up by tens, even up to hundreds. I sure do love having 100 tasks running on the entities of my structures.
 

Spoiler


local function CheckForSnow(inst)
    
    local x, y, z = inst.Transform:GetWorldPosition()
    local ents = TheSim:FindEntities(x, y, z, 1, { "snowpile_basic" })
    
    if #ents > 0 then
        --if inst.components.container ~= nil then
            --inst:RemoveComponent("container")
                    
            local x1, y1, z1 = inst.Transform:GetWorldPosition()
            local ents2 = TheSim:FindEntities(x1, y1, z1, 1, { "snowpile" })
            
            if #ents2 > 0 then
                inst:AddTag("INLIMBO")
            end
            
            inst:AddTag("snowpiledin")
        --end
    else
        --if inst.components.container == nil then
            --inst:AddComponent("container")
        --end
        
        inst:RemoveTag("INLIMBO")
    end
    
    inst:DoTaskInTime(400, RemoveSnowedTag)    
    
    inst:DoTaskInTime(2, CheckForSnow)
end

local function AddContainers(prefab)
    AddPrefabPostInit(prefab, function (inst)
        if not GLOBAL.TheWorld.ismastersim then
            return
        end
    
        inst:DoTaskInTime(2, CheckForSnow)
        
    end)
end

 



How spectacular, broken code that has been left in since Uncompromising Mode has been released and yet it hasnt been fixed yet.

Spoiler


-----------------------------------------------------------------
--Amulet auto-respawn if worn, like in DS
-----------------------------------------------------------------
--TODO: FIx this, not working
AddPrefabPostInit("amulet", function (inst)
    if inst ~= nil and inst.components.inventoryitem ~= nil then
        inst.components.inventoryitem.keepondeath = true
    end
end)

AddPlayerPostInit(function (inst)
    local function checkamulet(inst)
        local item = inst.components.inventory:GetEquippedItem(GLOBAL.EQUIPSLOTS.BODY)
        if item ~= nil and item.prefab == "amulet" then
            if item ~= nil then
                inst.sg.statemem.usedamulet = true
                inst:PushEvent("respawnfromghost", { source = item })
                item:Remove()
            end
        end
    end

    local function hardcoredeath(inst)
        inst:DoTaskInTime(5, checkamulet)
        if inst.components.trader ~= nil then
            inst.components.trader.enabled = false
        end
    end

    inst:ListenForEvent("death", hardcoredeath)
end)

 

unknown.png
Good ol files that are left in. Sound familiar?
 

Listen, Im not here to diss your mod, or make you feel bad. But it frustrates me, and its extremely annoying and hypocritical when you rant on Klei and Hamlet, and how terribly coded and unfinished it is. And yet you and your folks act like you are so much better than Klei. And do the same thing, leaving in files, having "terrible" and "unfinished" code. And it's arguably much worse than what Klei has done.

 

Link to comment
Share on other sites

4 hours ago, Ogrecakes said:

JoeW doesn't clear up why the development was so obviously canceled, and there's no answer as to where all the promised content and bug fixes are.

That's what I have a problem with. I would be completely happy and satisfied with Hamlet if everything that was supposed to be included was actually there. But it's hard to support a DLC that had a lot of content cut for no apparent reason. Especially after the devs specifically saying that it will be added.

Link to comment
Share on other sites

5 minutes ago, Hornete said:

How ironic.

  Hide contents

Let's take a look at the Uncompromising Mod code. Your mod! It must be so much more amazing than Klei's code amirite?....

Oh, wonderful. There are 31 instances I have found where the Mod replaces functions instead of wrapping the functions(Saving the original function and running it in your new function)
 

  Reveal hidden contents



local function feather_equip(inst, owner)
	onequip(inst, owner)
		
	owner:AddTag("penguin_protection")
    local attractor = owner.components.birdattractor
    if attractor then
		attractor.spawnmodifier:SetModifier(inst, TUNING.BIRD_SPAWN_MAXDELTA_FEATHERHAT, "maxbirds")
		attractor.spawnmodifier:SetModifier(inst, TUNING.BIRD_SPAWN_DELAYDELTA_FEATHERHAT.MIN, "mindelay")
		attractor.spawnmodifier:SetModifier(inst, TUNING.BIRD_SPAWN_DELAYDELTA_FEATHERHAT.MAX, "maxdelay")
            
	local birdspawner = TheWorld.components.birdspawner
		if birdspawner ~= nil then
			birdspawner:ToggleUpdate(true)
		end
	end
end

local function feather_unequip(inst, owner)
	onunequip(inst, owner)
	owner:RemoveTag("penguin_protection")

	local attractor = owner.components.birdattractor
	if attractor then
		attractor.spawnmodifier:RemoveModifier(inst)

	local birdspawner = TheWorld.components.birdspawner
		if birdspawner ~= nil then
			birdspawner:ToggleUpdate(true)
		end
	end
end

if inst.components.equippable ~= nil then
	inst.components.equippable:SetOnEquip(feather_equip)
	inst.components.equippable:SetOnUnequip(feather_unequip)
end

 

  Reveal hidden contents



local function onattack(inst, attacker, target)
    if target ~= nil and (target:HasTag("shadow") or target:HasTag("shadowminion") or target:HasTag("shadowchesspiece") or target:HasTag("stalker") or target:HasTag("stalkerminion")) and not target.components.health:IsDead() then
        target.components.health:DoDelta(-12)
        --print("damage")
    end

        --print("hit")
    inst.components.weapon.attackwear = target ~= nil and target:IsValid() 
        and (target:HasTag("shadow") or target:HasTag("shadowminion") or target:HasTag("shadowchesspiece") or target:HasTag("stalker") or target:HasTag("stalkerminion")) 
        and TUNING.GLASSCUTTER.SHADOW_WEAR 
        or 1
end

if inst.components.weapon ~= nil then
        inst.components.weapon:SetOnAttack(onattack)
    end

 

And there is so much more. But let's continue....

Ah, look at this! You run and replace the depth worms attack in the caves not once but twice in the mod. But hey the code must get better right? Every mod/game has a little bit of stinky code. it has to get better.... right?

In postinits/prefab/cave.lua and init/init_weather/init_harder_weather.lua

  Reveal hidden contents



env.AddPrefabPostInit("cave", function(inst)
    if not TheWorld.ismastersim then
        return
    end
    
    --inst:AddComponent("cavedeerclopsspawner")
    --[[
    if GetModConfigData("gamemode") == GAMEMODE_UNCOMPROMISING or
    (GetModConfigData("gamemode") == GAMEMODE_CUSTOM_SETTINGS and GetModConfigData("harder_weather") == true) then
    inst:AddComponent("hayfever_tracker")
    end--]]
    
        --inst:AddComponent("leechspawner") can reenable this once leeches are finished
    
local newwormspawn =
{
    base_prefab = "worm",
    winter_prefab = "shockworm",
    summer_prefab = "shockworm",

    attack_levels =
    {
        intro   = { warnduration = function() return 120 end, numspawns = function() return 1 end },
        light   = { warnduration = function() return 60 end, numspawns = function() return 1 + math.random(0,1) end },
        med     = { warnduration = function() return 45 end, numspawns = function() return 1 + math.random(0,1) end },
        heavy   = { warnduration = function() return 30 end, numspawns = function() return 2 + math.random(0,1) end },
        crazy   = { warnduration = function() return 30 end, numspawns = function() return 3 + math.random(0,2) end },
    },

    attack_delays =
    {
        rare        = function() return TUNING.TOTAL_DAY_TIME * 10, math.random() * TUNING.TOTAL_DAY_TIME * 7 end,
        occasional  = function() return TUNING.TOTAL_DAY_TIME * 8, math.random() * TUNING.TOTAL_DAY_TIME * 7 end,
        frequent    = function() return TUNING.TOTAL_DAY_TIME * 6, math.random() * TUNING.TOTAL_DAY_TIME * 5 end,
    },

    warning_speech = "ANNOUNCE_WORMS",

    --Key = time, Value = sound prefab
    warning_sound_thresholds =
    {
        { time = 30, sound = "LVL4_WORM" },
        { time = 60, sound = "LVL3_WORM" },
        { time = 90, sound = "LVL2_WORM" },
        { time = 500, sound = "LVL1_WORM" },
    },
}
inst.components.hounded:SetSpawnData(newwormspawn)
end)
  Reveal hidden contents




env.AddPrefabPostInit("cave", function(inst)
    if not TheWorld.ismastersim then
        return
    end
    
    inst:AddComponent("cavedeerclopsspawner")
    inst:AddComponent("randomnighteventscaves")
    
    local newwormspawn =
{
    base_prefab = "worm",
    winter_prefab = "shockworm",
    summer_prefab = "shockworm",

    attack_levels =
    {
        intro   = { warnduration = function() return 120 end, numspawns = function() return 1 end },
        light   = { warnduration = function() return 60 end, numspawns = function() return 1 + math.random(0,1) end },
        med     = { warnduration = function() return 45 end, numspawns = function() return 1 + math.random(0,1) end },
        heavy   = { warnduration = function() return 30 end, numspawns = function() return 2 + math.random(0,1) end },
        crazy   = { warnduration = function() return 30 end, numspawns = function() return 3 + math.random(0,2) end },
    },

    attack_delays =
    {
        rare        = function() return TUNING.TOTAL_DAY_TIME * 10, math.random() * TUNING.TOTAL_DAY_TIME * 7 end,
        occasional  = function() return TUNING.TOTAL_DAY_TIME * 8, math.random() * TUNING.TOTAL_DAY_TIME * 7 end,
        frequent    = function() return TUNING.TOTAL_DAY_TIME * 6, math.random() * TUNING.TOTAL_DAY_TIME * 5 end,
    },

    warning_speech = "ANNOUNCE_WORMS",

    --Key = time, Value = sound prefab
    warning_sound_thresholds =
    {
        { time = 30, sound = "LVL4_WORM" },
        { time = 60, sound = "LVL3_WORM" },
        { time = 90, sound = "LVL2_WORM" },
        { time = 500, sound = "LVL1_WORM" },
    },
}
inst.components.hounded:SetSpawnData(newwormspawn)
end)

 

 

Let's not forget about how you replace crafting recipes to change their ingredients instead of simply changing or adding on to their ingredients table. Breaking compatibility with other mods who dare to change anything to these recipes and breaking the vanilla game if Klei decides to change any of these recipes in any way

  Reveal hidden contents



Recipe("catcoonhat", {Ingredient("coontail", 5), Ingredient("silk", 4)}, RECIPETABS.DRESS, TECH.SCIENCE_TWO)
Recipe("moonrockidol", {Ingredient("moonrocknugget", GLOBAL.TUNING.DSTU.RECIPE_MOONROCK_IDOL_MOONSTONE_COST), Ingredient("purplegem", 1)}, RECIPETABS.CELESTIAL, TECH.CELESTIAL_ONE, nil, nil, true)
Recipe("minifan", {Ingredient("twigs", 3), Ingredient("petals",4)}, RECIPETABS.SURVIVAL, TECH.NONE)
Recipe("goggleshat", {Ingredient("goldnugget", 4), Ingredient("pigskin",1), Ingredient("houndstooth", 2)}, RECIPETABS.DRESS, TECH.SCIENCE_ONE)
Recipe("deserthat", {Ingredient("goggleshat", 1), Ingredient("pigskin",2)}, RECIPETABS.DRESS, TECH.SCIENCE_TWO)

 

And not to mention the several instances of the mod replacing loot tables and/or tables in the vanilla game, instead of adding onto them. which will have consequences if any mods also change loot tables of the game, or if Klei updates loot tables

  Reveal hidden contents



if inst.components.lootdropper ~= nil then
	 inst.components.lootdropper:SetChanceLootTable("toadystool") end
 --
 if inst.components.lootdropper ~= nil then
	 inst.components.lootdropper:SetChanceLootTable("toadystool_dark") 
end

 

Oh, and this wonderful code. The CheckForSnow function is ran every two seconds on many basic structures, and in that CheckForSnow function the RemovedSnowedTag is set to run in 400 seconds, but oh boy. Your code doesnt check if the RemovedSnowTag function is set to run in 400 seconds and so the game constantly keeps making tasks to run the RemovedSnowTag function everytime the CheckForSnow function is ran, aka every two seconds. Resulting in these tasks building up by tens, even up to hundreds. I sure do love having 100 tasks running on the entities of my structures.
 



local function CheckForSnow(inst)
    
    local x, y, z = inst.Transform:GetWorldPosition()
    local ents = TheSim:FindEntities(x, y, z, 1, { "snowpile_basic" })
    
    if #ents > 0 then
        --if inst.components.container ~= nil then
            --inst:RemoveComponent("container")
                    
            local x1, y1, z1 = inst.Transform:GetWorldPosition()
            local ents2 = TheSim:FindEntities(x1, y1, z1, 1, { "snowpile" })
            
            if #ents2 > 0 then
                inst:AddTag("INLIMBO")
            end
            
            inst:AddTag("snowpiledin")
        --end
    else
        --if inst.components.container == nil then
            --inst:AddComponent("container")
        --end
        
        inst:RemoveTag("INLIMBO")
    end
    
    inst:DoTaskInTime(400, RemoveSnowedTag)    
    
    inst:DoTaskInTime(2, CheckForSnow)
end

local function AddContainers(prefab)
    AddPrefabPostInit(prefab, function (inst)
        if not GLOBAL.TheWorld.ismastersim then
            return
        end
    
        inst:DoTaskInTime(2, CheckForSnow)
        
    end)
end



How spectacular, broken code that has been left in since Uncompromising Mode has been released and yet it hasnt been fixed yet.

  Reveal hidden contents



-----------------------------------------------------------------
--Amulet auto-respawn if worn, like in DS
-----------------------------------------------------------------
--TODO: FIx this, not working
AddPrefabPostInit("amulet", function (inst)
    if inst ~= nil and inst.components.inventoryitem ~= nil then
        inst.components.inventoryitem.keepondeath = true
    end
end)

AddPlayerPostInit(function (inst)
    local function checkamulet(inst)
        local item = inst.components.inventory:GetEquippedItem(GLOBAL.EQUIPSLOTS.BODY)
        if item ~= nil and item.prefab == "amulet" then
            if item ~= nil then
                inst.sg.statemem.usedamulet = true
                inst:PushEvent("respawnfromghost", { source = item })
                item:Remove()
            end
        end
    end

    local function hardcoredeath(inst)
        inst:DoTaskInTime(5, checkamulet)
        if inst.components.trader ~= nil then
            inst.components.trader.enabled = false
        end
    end

    inst:ListenForEvent("death", hardcoredeath)
end)

 

unknown.png
Good ol files that are left in. Sound familiar?
 

Listen, Im not here to diss your mod, or make you feel bad. But it frustrates me, and its extremely annoying and hypocritical when you rant on Klei and Hamlet, and how terribly coded and unfinished it is. And yet you and your folks do the same thing, leaving in files, having "terrible" and "unfinished" code. And it's arguably much worse than what Klei has done.

 

Youre comparing someone that learned all their coding from scratch, with no prior knowledge or real experience,  who finished up a project on their own free time for free, that was abandoned and left broken and by yourself and others, to a team of professional coders, artists, and designers who are payed for their work, and are selling their product.

 

You left broken and unfinished code that caused crashes, I dont know what you hope to gain by this arguement.

 

https://cdn.discordapp.com/attachments/623668772196319262/740541423866347589/morshu_confused.png

Link to comment
Share on other sites

1 hour ago, Ogrecakes said:

Youre comparing someone that learned all their coding from scratch, with no prior knowledge or real experience,  who finished up a project on their own free time for free, that was abandoned and left broken and by yourself and others, to a team of professional coders, artists, and designers who are payed for their work, and are selling their product.

 

You left broken and unfinished code that caused crashes, I dont know what you hope to gain by this arguement.

 

https://cdn.discordapp.com/attachments/623668772196319262/740541423866347589/morshu_confused.png

Putting this in simpler words:

Klei: A heavily funded studio full of professionals creating content as a job

Uncomp Devs: Individuals (Some not even adults yet, including myself) with little prior experience and 0 funding, making a passion project in their spare time.

@Hornete this may seem petty considering both Scrimbles and I are uncomp devs coming to defend uncomp, but frankly your argument sucks. We are never going to have the manpower that Klei has, but that doesn't mean that they are above critique.

You going out of your way to look through our mod's code (which again, isn't made by paid professionals) is really petty. This is like comparing an artist (or maybe a group of artists in our case) who has been drawing as a hobby for a year to an artist that has made a living with a 10-year long career under their belt because the former saw an error.

In short, we're allowed to "punch up" and critique Klei because they are a studio of paid professionals, and comparing a ragtag team of fans making a passion project is silly.

Link to comment
Share on other sites

On 8/5/2020 at 5:36 PM, Hornete said:

How ironic.

  Hide contents

Let's take a look at the Uncompromising Mod code. Your mod! It must be so much more amazing than Klei's code amirite?....

Oh, wonderful. There are 31 instances I have found where the Mod replaces functions instead of wrapping the functions(Saving the original function and running it in your new function)
 

  Reveal hidden contents



local function feather_equip(inst, owner)
	onequip(inst, owner)
		
	owner:AddTag("penguin_protection")
    local attractor = owner.components.birdattractor
    if attractor then
		attractor.spawnmodifier:SetModifier(inst, TUNING.BIRD_SPAWN_MAXDELTA_FEATHERHAT, "maxbirds")
		attractor.spawnmodifier:SetModifier(inst, TUNING.BIRD_SPAWN_DELAYDELTA_FEATHERHAT.MIN, "mindelay")
		attractor.spawnmodifier:SetModifier(inst, TUNING.BIRD_SPAWN_DELAYDELTA_FEATHERHAT.MAX, "maxdelay")
            
	local birdspawner = TheWorld.components.birdspawner
		if birdspawner ~= nil then
			birdspawner:ToggleUpdate(true)
		end
	end
end

local function feather_unequip(inst, owner)
	onunequip(inst, owner)
	owner:RemoveTag("penguin_protection")

	local attractor = owner.components.birdattractor
	if attractor then
		attractor.spawnmodifier:RemoveModifier(inst)

	local birdspawner = TheWorld.components.birdspawner
		if birdspawner ~= nil then
			birdspawner:ToggleUpdate(true)
		end
	end
end

if inst.components.equippable ~= nil then
	inst.components.equippable:SetOnEquip(feather_equip)
	inst.components.equippable:SetOnUnequip(feather_unequip)
end

 

  Reveal hidden contents



local function onattack(inst, attacker, target)
    if target ~= nil and (target:HasTag("shadow") or target:HasTag("shadowminion") or target:HasTag("shadowchesspiece") or target:HasTag("stalker") or target:HasTag("stalkerminion")) and not target.components.health:IsDead() then
        target.components.health:DoDelta(-12)
        --print("damage")
    end

        --print("hit")
    inst.components.weapon.attackwear = target ~= nil and target:IsValid() 
        and (target:HasTag("shadow") or target:HasTag("shadowminion") or target:HasTag("shadowchesspiece") or target:HasTag("stalker") or target:HasTag("stalkerminion")) 
        and TUNING.GLASSCUTTER.SHADOW_WEAR 
        or 1
end

if inst.components.weapon ~= nil then
        inst.components.weapon:SetOnAttack(onattack)
    end

 

And there is so much more. But let's continue....

Ah, look at this! You run and replace the depth worms attack in the caves not once but twice in the mod. But hey the code must get better right? Every mod/game has a little bit of stinky code. it has to get better.... right?

In postinits/prefab/cave.lua and init/init_weather/init_harder_weather.lua

  Reveal hidden contents



env.AddPrefabPostInit("cave", function(inst)
    if not TheWorld.ismastersim then
        return
    end
    
    --inst:AddComponent("cavedeerclopsspawner")
    --[[
    if GetModConfigData("gamemode") == GAMEMODE_UNCOMPROMISING or
    (GetModConfigData("gamemode") == GAMEMODE_CUSTOM_SETTINGS and GetModConfigData("harder_weather") == true) then
    inst:AddComponent("hayfever_tracker")
    end--]]
    
        --inst:AddComponent("leechspawner") can reenable this once leeches are finished
    
local newwormspawn =
{
    base_prefab = "worm",
    winter_prefab = "shockworm",
    summer_prefab = "shockworm",

    attack_levels =
    {
        intro   = { warnduration = function() return 120 end, numspawns = function() return 1 end },
        light   = { warnduration = function() return 60 end, numspawns = function() return 1 + math.random(0,1) end },
        med     = { warnduration = function() return 45 end, numspawns = function() return 1 + math.random(0,1) end },
        heavy   = { warnduration = function() return 30 end, numspawns = function() return 2 + math.random(0,1) end },
        crazy   = { warnduration = function() return 30 end, numspawns = function() return 3 + math.random(0,2) end },
    },

    attack_delays =
    {
        rare        = function() return TUNING.TOTAL_DAY_TIME * 10, math.random() * TUNING.TOTAL_DAY_TIME * 7 end,
        occasional  = function() return TUNING.TOTAL_DAY_TIME * 8, math.random() * TUNING.TOTAL_DAY_TIME * 7 end,
        frequent    = function() return TUNING.TOTAL_DAY_TIME * 6, math.random() * TUNING.TOTAL_DAY_TIME * 5 end,
    },

    warning_speech = "ANNOUNCE_WORMS",

    --Key = time, Value = sound prefab
    warning_sound_thresholds =
    {
        { time = 30, sound = "LVL4_WORM" },
        { time = 60, sound = "LVL3_WORM" },
        { time = 90, sound = "LVL2_WORM" },
        { time = 500, sound = "LVL1_WORM" },
    },
}
inst.components.hounded:SetSpawnData(newwormspawn)
end)
  Reveal hidden contents




env.AddPrefabPostInit("cave", function(inst)
    if not TheWorld.ismastersim then
        return
    end
    
    inst:AddComponent("cavedeerclopsspawner")
    inst:AddComponent("randomnighteventscaves")
    
    local newwormspawn =
{
    base_prefab = "worm",
    winter_prefab = "shockworm",
    summer_prefab = "shockworm",

    attack_levels =
    {
        intro   = { warnduration = function() return 120 end, numspawns = function() return 1 end },
        light   = { warnduration = function() return 60 end, numspawns = function() return 1 + math.random(0,1) end },
        med     = { warnduration = function() return 45 end, numspawns = function() return 1 + math.random(0,1) end },
        heavy   = { warnduration = function() return 30 end, numspawns = function() return 2 + math.random(0,1) end },
        crazy   = { warnduration = function() return 30 end, numspawns = function() return 3 + math.random(0,2) end },
    },

    attack_delays =
    {
        rare        = function() return TUNING.TOTAL_DAY_TIME * 10, math.random() * TUNING.TOTAL_DAY_TIME * 7 end,
        occasional  = function() return TUNING.TOTAL_DAY_TIME * 8, math.random() * TUNING.TOTAL_DAY_TIME * 7 end,
        frequent    = function() return TUNING.TOTAL_DAY_TIME * 6, math.random() * TUNING.TOTAL_DAY_TIME * 5 end,
    },

    warning_speech = "ANNOUNCE_WORMS",

    --Key = time, Value = sound prefab
    warning_sound_thresholds =
    {
        { time = 30, sound = "LVL4_WORM" },
        { time = 60, sound = "LVL3_WORM" },
        { time = 90, sound = "LVL2_WORM" },
        { time = 500, sound = "LVL1_WORM" },
    },
}
inst.components.hounded:SetSpawnData(newwormspawn)
end)

 

 

Let's not forget about how you replace crafting recipes to change their ingredients instead of simply changing or adding on to their ingredients table. Breaking compatibility with other mods who dare to change anything to these recipes and breaking the vanilla game if Klei decides to change any of these recipes in any way

  Reveal hidden contents



Recipe("catcoonhat", {Ingredient("coontail", 5), Ingredient("silk", 4)}, RECIPETABS.DRESS, TECH.SCIENCE_TWO)
Recipe("moonrockidol", {Ingredient("moonrocknugget", GLOBAL.TUNING.DSTU.RECIPE_MOONROCK_IDOL_MOONSTONE_COST), Ingredient("purplegem", 1)}, RECIPETABS.CELESTIAL, TECH.CELESTIAL_ONE, nil, nil, true)
Recipe("minifan", {Ingredient("twigs", 3), Ingredient("petals",4)}, RECIPETABS.SURVIVAL, TECH.NONE)
Recipe("goggleshat", {Ingredient("goldnugget", 4), Ingredient("pigskin",1), Ingredient("houndstooth", 2)}, RECIPETABS.DRESS, TECH.SCIENCE_ONE)
Recipe("deserthat", {Ingredient("goggleshat", 1), Ingredient("pigskin",2)}, RECIPETABS.DRESS, TECH.SCIENCE_TWO)

 

And not to mention the several instances of the mod replacing loot tables and/or tables in the vanilla game, instead of adding onto them. which will have consequences if any mods also change loot tables of the game, or if Klei updates loot tables

  Reveal hidden contents



if inst.components.lootdropper ~= nil then
	 inst.components.lootdropper:SetChanceLootTable("toadystool") end
 --
 if inst.components.lootdropper ~= nil then
	 inst.components.lootdropper:SetChanceLootTable("toadystool_dark") 
end

 

Oh, and this wonderful code. The CheckForSnow function is ran every two seconds on many basic structures, and in that CheckForSnow function the RemovedSnowedTag is set to run in 400 seconds, but oh boy. Your code doesnt check if the RemovedSnowTag function is set to run in 400 seconds and so the game constantly keeps making tasks to run the RemovedSnowTag function everytime the CheckForSnow function is ran, aka every two seconds. Resulting in these tasks building up by tens, even up to hundreds. I sure do love having 100 tasks running on the entities of my structures.
 

  Reveal hidden contents



local function CheckForSnow(inst)
    
    local x, y, z = inst.Transform:GetWorldPosition()
    local ents = TheSim:FindEntities(x, y, z, 1, { "snowpile_basic" })
    
    if #ents > 0 then
        --if inst.components.container ~= nil then
            --inst:RemoveComponent("container")
                    
            local x1, y1, z1 = inst.Transform:GetWorldPosition()
            local ents2 = TheSim:FindEntities(x1, y1, z1, 1, { "snowpile" })
            
            if #ents2 > 0 then
                inst:AddTag("INLIMBO")
            end
            
            inst:AddTag("snowpiledin")
        --end
    else
        --if inst.components.container == nil then
            --inst:AddComponent("container")
        --end
        
        inst:RemoveTag("INLIMBO")
    end
    
    inst:DoTaskInTime(400, RemoveSnowedTag)    
    
    inst:DoTaskInTime(2, CheckForSnow)
end

local function AddContainers(prefab)
    AddPrefabPostInit(prefab, function (inst)
        if not GLOBAL.TheWorld.ismastersim then
            return
        end
    
        inst:DoTaskInTime(2, CheckForSnow)
        
    end)
end

 



How spectacular, broken code that has been left in since Uncompromising Mode has been released and yet it hasnt been fixed yet.

  Reveal hidden contents



-----------------------------------------------------------------
--Amulet auto-respawn if worn, like in DS
-----------------------------------------------------------------
--TODO: FIx this, not working
AddPrefabPostInit("amulet", function (inst)
    if inst ~= nil and inst.components.inventoryitem ~= nil then
        inst.components.inventoryitem.keepondeath = true
    end
end)

AddPlayerPostInit(function (inst)
    local function checkamulet(inst)
        local item = inst.components.inventory:GetEquippedItem(GLOBAL.EQUIPSLOTS.BODY)
        if item ~= nil and item.prefab == "amulet" then
            if item ~= nil then
                inst.sg.statemem.usedamulet = true
                inst:PushEvent("respawnfromghost", { source = item })
                item:Remove()
            end
        end
    end

    local function hardcoredeath(inst)
        inst:DoTaskInTime(5, checkamulet)
        if inst.components.trader ~= nil then
            inst.components.trader.enabled = false
        end
    end

    inst:ListenForEvent("death", hardcoredeath)
end)

 

unknown.png
Good ol files that are left in. Sound familiar?
 

Listen, Im not here to diss your mod, or make you feel bad. But it frustrates me, and its extremely annoying and hypocritical when you rant on Klei and Hamlet, and how terribly coded and unfinished it is. And yet you and your folks act like you are so much better than Klei. And do the same thing, leaving in files, having "terrible" and "unfinished" code. And it's arguably much worse than what Klei has done.

 

The whole problem with this argument is Klei is here making games professionally and Ogrecakes is just a player that makes mods in their free time. When someone who is less experienced in coding can point out so many proffesionall coders' mistakes, it says something.
And your argument is just awfully bad, because it's like saying to some casual cook that they shouldn't express their negative opinion on cake made by professionall chef because they are less experienced. So no, it's not ironic that Ogrecakes is "bad" at coding too. They are not obligated to be good at it, Klei is.

Link to comment
Share on other sites

On 8/5/2020 at 8:40 AM, TimothyCarter said:

I know a lot of people are upset with Ham, but like, I really love it. Yeah, the bugs are annoying sometimes, but I can't help but laugh at them a lot of times. Hamlet isn't perfect, but for me, it added a lot to the game that I really love. Crafting finally being integrated between DLCs opened the game up to so much, the interiors are so fun to decorate and add to. Hell, even just storing stuff in a very small location on your base makes interiors amazing. The End's Well made teleportation very viable. The iron man suit is so much fun when you want/need to destroy some annoying enemy infested areas. O B S I D E A N F I R E P I T I N R O G. Shops that sell volt goat horns and ox horns. I can actually craft morning stars and weather pains and the ox horn helmet. The root trunk is such a great way to store common things you need in worlds like money and key to the city. People on this message board are so sour and I feel like I can never really express my opinion here about how much I like Hamlet. Yeah, I get it, the aporkalypse feels a bit empty, the weather seems like more could have been done, but the game is so different now due to Hamlet, and for me, it so perfect and distinct from DST.

 

Aight rant over, ya'll can leave

i lovee the mechanics you said, i really like hamlet and i think is worth to buy it and more being so cheap as it is but i would pay more if the lacks that it has were covered and the bugs fixed

single player ds has a lot of potential dlcs with differents kind of worlds but its sad to see that we were stuck on the map of rog forever since klei doesnt want to continue singleplayer and dst cant affort multiple worlds

Link to comment
Share on other sites

On 8/7/2020 at 5:23 PM, inferjus4 said:

The whole problem with this argument is Klei is here making games professionally and Ogrecakes is just a player that makes mods in their free time. When someone who is less experienced in coding can point out so many proffesionall coders' mistakes, it says something.
And your argument is just awfully bad, because it's like saying to some casual cook that they shouldn't express their negative opinion on cake made by professionall chef because they are less experienced. So no, it's not ironic that Ogrecakes is "bad" at coding too. They are not obligated to be good at it, Klei is.

Also Hornet is a former dev that left unfinished code that caused crashes in the mod, I had to fix that stuff too.

We're on good terms over all, but what a dummy :^)

Link to comment
Share on other sites

Look, i get not being completely satisfied with Hamlet, just yesterday no joke i spent around 15 minutes thinking on how you could tie things together in the dlc, even if cutting it's scope a little. 

But is it really worth it to dabble on it over and over until the end of time? i mean Klei IS a game dev studio,and they SHOULD have tried to polish Hamlet to the best it could be, but  they're bound to make mistakes too because, they're human. I'm not excusing them mind you, and i guess it would have sucked to get a less complete dlc for 2 more bucks than the other two, but just BECAUSE they're game devs, that means that they likely use those jobs to provide for their homesteads and whatnot, and Hamlet just didn't and doesn't sell how they hoped it would.Maybe it was due to lack of planning or other behind the scenes stuff, but it's heavily implied that they cut it because they went overbudget.  (and please, let's not dabble on the free copies gift event people use to blame Hamlet's cut dev time on). Hamlet's situation sucks and i can think of a bajillion ways to make Hamlet less broad, more compact and therefore a more complete product, but, no budget means no development and let's not forget that Klei is a business too. 

i get that complaining is the only thing we could do but it's been over a year and it's fruitless, so why not focus somewhere else instead of crying over spilled milk?

 

Also, @Ogrecakes (hope you don't mind me tagging you), a bit of constructive criticism, a lot of people are somewhat edgy or hostile regarding uncompromising not because of the mod itself but the community surrounding it. Sometimes you give the impression that you're completely and utterly disatisfied at whatever Klei throws into dst (which is fine, you have free will and the right to be entitled to your opinions) but the way you approach to criticize them sometimes pointing all of their flaws out while claiming that such design issues are fixed in your mod sort of makes you, and the members of your community that are like that, seem stuck up, proud and a bit edgy or unfriendly, which i don't think it's the intention. Not trying to call you out or anything, just pointing that out in a friendly manner

 

Link to comment
Share on other sites

I guess I am unusual, but despite all the new content in DST right now, including a lot of stuff I haven’t even really experienced myself yet, I still find myself playing Shipwrecked and Hamlet a lot more than DST. I love both of these DLC ‘s, and I especially appreciate a break from the sepia tone color palette and too-familiar biomes of ROG. I know multiplayer games are what everyone seems to want right now, but it’s too hard to find friends to play with and ultimately I just don’t care about that. I would happily buy more single player DLCs on the order of Hamlet. I love what was added in terms of mechanics and interiors and biomes, and the ability to bring Hamlet structures into SW, my all-time favorite, is fantastic. I really don’t get all this griping. Hamlet expanded on the existing base game and DLCs exponentially. It just saddens me to think that there won’t be more DLCs for single-player. I would happily pay four times what they charge for them, or pay for events and add-ons if that were possible.

Link to comment
Share on other sites

Hamlet together. PLZ bro PLZ

I want hamlet together bad. REAL bad. I want neighbors. I want to borrow gears, bro. I want to set fire to manure in front of their houses, watch the stamp it out and get smelly shoes, bro. I want to steal a froggle bunwich and blame it on my neighbor and laugh as he gets chased by guards, bro. I want it. I NEED it. I want city planning but with friends and enemies. PLZ BRO

Link to comment
Share on other sites

On 8/15/2020 at 8:08 AM, JosePapp said:

Also, @Ogrecakes (hope you don't mind me tagging you), a bit of constructive criticism, a lot of people are somewhat edgy or hostile regarding uncompromising not because of the mod itself but the community surrounding it. Sometimes you give the impression that you're completely and utterly disatisfied at whatever Klei throws into dst (which is fine, you have free will and the right to be entitled to your opinions) but the way you approach to criticize them sometimes pointing all of their flaws out while claiming that such design issues are fixed in your mod sort of makes you, and the members of your community that are like that, seem stuck up, proud and a bit edgy or unfriendly, which i don't think it's the intention. Not trying to call you out or anything, just pointing that out in a friendly manner

 

Yeah, that's my biggest problem too. In no way do I think the mod "fixes" things. It makes them different, and some people like that.

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

Please be aware that the content of this thread may be outdated and no longer applicable.

×
  • Create New...