func (gen RoomsGenerator) addDoorGuard(room *g.Room, location *g.Location, doorDirect g.DoorDirect) { var posMonster g.PosObj middleX := location.SizeX / 2 middleY := location.SizeY / 2 switch doorDirect { case g.DoorUp: posMonster = *g.NewPosObj(location, middleX, 1) case g.DoorDown: posMonster = *g.NewPosObj(location, middleX, location.SizeY-2) case g.DoorLeft: posMonster = *g.NewPosObj(location, 1, middleY) case g.DoorRight: posMonster = *g.NewPosObj(location, location.SizeX-2, middleY) default: panic("unknow DoorDirect") } monster := g.CreateRandomMonster(g.MonPirate, g.MonFastGoblin, g.MonSlyGoblin, g.MonSkeleton, g.MonGhost) monster.PosObj = posMonster if monster.TypeName == g.MonPirate { monster.Drops = &g.CustomItem{TypeName: "rum", Name: "бутылка рома", Usable: true} } room.AddMonster(monster) }
func (gen RoomsGenerator) addWaterScroll(room *g.Room, location *g.Location) { room.AddItem( &g.PlaceItem{ PosObj: *g.NewPosObj(location, location.SizeX-2, location.SizeY-2), Item: g.FactoryWeapons["WaterScroll"](), }, ) }
func (gen RoomsGenerator) addKeyToLocation(room *g.Room, location *g.Location) { key := g.CustomItem{TypeName: "golden-key", Name: "золотой ключ"} room.AddItem( &g.PlaceItem{ PosObj: *g.NewPosObj(location, location.SizeX-2, location.SizeY-2), Item: &key, }, ) }
func (gen RoomsGenerator) markLocationAsFinish(room *g.Room, location *g.Location) { cellsCount := len(location.CellsMap) idx := cellsCount / 2 location.CellsMap[idx] = "&" triggerX, triggerY := g.CellIdxToXY(idx, location.SizeX) exitTrigger := g.CreateExitTrigger(*g.NewPosObj(location, triggerX, triggerY)) room.AddTrigger(exitTrigger) room.ExitLocationID = location.RefID() }
func MoveMonster(room *g.Room, location *g.Location, monster *g.Monster, direct g.ActionDirect) (description []string) { description = make([]string, 0) newPos := calcNewPos(monster.PosObj, direct) for _, player := range room.Players() { if player.IsLive() && newPos.PosEqual(player.PosObj) { description = append(description, b.MonsterAttackToPlayer(monster, player)...) return description } } for _, mon := range room.Monsters().InLocation(location).Lives() { if newPos.PosEqual(mon.PosObj) { return description } } setNewPos(monster, location, newPos) return }
func MovePlayer(room *g.Room, location *g.Location, player *g.Player, direct g.ActionDirect) (description []string) { description = make([]string, 0) if !player.IsLive() { description = append(description, "player is dead") return } var lastTime time.Time lastTime, ok := lastTimeAction[player.RefID()] if ok { if time.Now().Before(lastTime.Add(moveSleep)) { description = append(description, "wait") return } } lastTime = time.Now() lastTimeAction[player.RefID()] = lastTime oldPos, newPos := player.PosObj, g.PosObj{LocationID: location.RefID(), PosX: player.PosX, PosY: player.PosY} switch direct { case g.DirectMoveUpLeft: newPos.PosX-- newPos.PosY-- case g.DirectMoveUp: newPos.PosY-- case g.DirectMoveUpRight: newPos.PosX++ newPos.PosY-- case g.DirectMoveDownLeft: newPos.PosX-- newPos.PosY++ case g.DirectMoveDown: newPos.PosY++ case g.DirectMoveDownRight: newPos.PosX++ newPos.PosY++ case g.DirectMoveLeft: newPos.PosX-- case g.DirectMoveRight: newPos.PosX++ default: panic("unknown direct: " + direct) } player.IncSteps() for _, monster := range room.Monsters() { if monster.IsLive() && newPos.PosEqual(monster.PosObj) { description = b.PlayerAttackToMonster(player, monster) if monster.IsDead() && monster.Drops != nil { room.AddItem( &g.PlaceItem{ PosObj: monster.PosObj, Item: monster.Drops, }, ) } return description } } for _, trigger := range room.Triggers() { //into trigger if newPos.PosEqual(trigger.PosObj) { //trigger.ExecInto trigger.Exec(player, direct) } //out trigger if !oldPos.PosEqual(player.PosObj) && oldPos.PosEqual(trigger.PosObj) { //trigger.ExecOut trigger.Exec(player, direct) } //inside if player.PosObj.PosEqual(trigger.PosObj) { //trigger.ExecInside trigger.Exec(player, direct) } } if player.CanMove() && isMovable(location, newPos.PosX, newPos.PosY) { player.PosObj = newPos return } if !player.IsLive() { return append(description, "you are dead") } return }
func (gen RoomsGenerator) addDoorTrigger(room *g.Room, posTrigger g.PosObj, target g.PosObj, doorDirect g.DoorDirect) { trigger := g.CreateDoorTrigger(posTrigger, target, doorDirect) room.AddTrigger(trigger) }