Пример #1
0
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)
}
Пример #2
0
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"](),
		},
	)
}
Пример #3
0
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,
		},
	)
}
Пример #4
0
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()
}
Пример #5
0
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
}
Пример #6
0
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
}
Пример #7
0
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)
}