Kelvintaph Crusader Feedback


#1

Somewhat difficult, though with a little thinking getting the bonus achievement wasn’t too hard. Looking forward to future puzzles. :smile:

Though apparently you don’t have to kill all the enemies; not sure if this was intended or not (in my last submission I left a skeleton alive).


Help Me please on Kelvintaph Crusader
#2

Good, it should be difficult! I enjoyed your creative solution to getting the bonus, though.

Do you think it should be required to kill everyone?


#3

I really don’t know…

I’ve been used to the “Ogres must die” requirement, and the description does say for the hero to command “an elite squad to defeat an elite ogre squad”. And to truly escape there really shouldn’t be any ogres left to chase the humans.

On the other hand if I’m not required to kill every ogre it does cut down on the damage taken as well as the time spent, and the end goal is to just escape from the ogres (and survive)…

(Though I would assume in most circumstances all the ogres would have been killed before the player moves the army towards the exit.)


#4

Does that mean you can view the testers’ attempts at passing the level? That’s good because it can give valuable information on how people try to complete the level and what equipment is required. It also means that adventurers that don’t comment can still provide feedback (I’ve been guilty of that).

With my high-end glasses I seem to be able to find enemies on the other side of the wall, which might be against the purpose of the level. I also wouldn’t be surprised if most other people at that stage had the same glasses due to the gem system. Maybe disable the glasses if needed.

The default friend AI seems to be very ineffective at keeping them alive so it’ll be interesting to see how a better strategy can make a difference.


#5

Yeah, I was surprised to find that I could see the witch and hit her with a lightning bolt. This allows my squad to just attack the nearest enemy.

Then my summoned skeletons cause the catapults to target the brawlers. Of course this is how I end up with 6699 total damage taken!


#6

Yeah, we have detailed analytics on every level and can also load all players’ replays, which I like to do for the first several adventurers who play a level, to see how the balance is and what strategies y’all are using.

Hmm, I don’t think it wouldn’t really help to disable the see-through-walls glasses, because you can ask your friends what enemies they see and do any wall-penetrating attacks that way. I think it would be too limiting (and difficult) to try to figure out how to limit every attack and spell that could affect the battle through the wall.


#8

One part of my code was a bit like this:

witch=self.findByType("witch")[0]

for i in friends:
    if witch:
        self.command(i,"attack",witch)
    else:
        #attack other enemies

However, after killing the witch the allies would just stop and do nothing.

I found that checking the witch’s health made them continue on to the next part after killing the witch

for i in friends:
    if witch and witch.health>0:
        self.command(i,"attack",witch)
    else:
        #do next part

In fact, the “and witch.health>0” part was the difference between between winning with bonus and not winning.
I don’t think I had to check the enemy’s health in any other level.

Edit: You’re right, trotod, I did store the witch variable outside of the loop. This wasn’t an issue for me in other levels since I always used self.findEnemies() to get a new array of enemies every step so enemies with 0 health were filtered out.


#9

Assuming you store the witch variable outside of the loop, then the witch always returns truthy, because its just “exists”, it’s not going to be None.

How I remove dead enemies from my arrays.
// structure partly based on Wizard Dude's solution to Zero Sum

var globals = {}

this.initialize = function () {
    globals.friends = this.findFriends()
    // below assumes no Twilight Glasses,
    // else there would be no need for this sort of code
    var friend = globals.friends[0]
    // python list concatenation seems so much easier
    // globals.enemies = this.findEnemies() + friend.findEnemies()
    globals.enemies = this.findEnemies().concat(friend.findEnemies())
}

this.updateGlobals = function () {
    // python has a `filter` function, or can use list comprehensions
    globals.friends = globals.friends.filter(isAlive)
    globals.enemies = globals.enemies.filter(isAlive)
    // find other unit types like
    // globals[type] = globals[team].filter(isType(type))
}

// ...

this.initialize()

loop {
    this.updateGlobals()
    // ...
}

function isAlive (t) {
    return t.health > 0
}

function isType (type) {
    return function (thang) {
        return thang.type === type
    }
}

#10

I managed to keep all minions alive by casting chain lightning and kill the lower ogre instantly.
Without doing that I found it hard to achieve it.


#11

The bonus can be achieved by your army alone but you need to use absolutely every trick of the trade: avoid enemy AOE, tanking, priority targets, focus fire, pullout heavily wounded.