Esempio n. 1
0
	def handle (self):
		character_id = State.clients_sockets[self.websocket]

		is_master = models.SessionCharacter.query.filter_by(
			id = character_id,
			game_session_id = self.game_session_id.data,
			user_role = "master",
		).count()
		if not is_master:
			return error_response('Forbidden')

		obj = models.PlayObject.query.get(self.object_id.data)
		if not obj:
			return error_response('Invalid token')

		obj.x = self.x.data
		obj.y = self.y.data
		obj.add()

		DBSession.commit() # TODO: wrapper?

		obj.add()
		data = {'obj_id': obj.id, 'obj_type': constants.PlayfieldObject.NAME_TO_TYPE.inv[obj.type], 'x': obj.x, 'y': obj.y}
		self.group_call_client_action('MovePlayfieldObject', data)

		return {'success': True}
Esempio n. 2
0
	def handle (self):
		character_id = State.clients_sockets[self.websocket]

		has_permission = models.SessionCharacter.query.filter_by(
			id = character_id,
			game_session_id = self.game_session_id.data,
		).count()
		if not has_permission:
			return error_response('Forbidden')

		_, session_id = State.clients_by_character[character_id]

		online_players_ids = []
		master = models.SessionCharacter.query.filter_by(
			game_session_id = self.game_session_id.data,
			user_role = "master"
		).first()
		master_is_online = False
		for char_id in State.clients_by_session[session_id]:
			if char_id == master.id:
				master_is_online = True
				continue
			online_players_ids.append(char_id)

		return {'success': True, 'online_players_ids': online_players_ids, 'master_is_online': master_is_online}
Esempio n. 3
0
	def handle (self):
		character_id = State.clients_sockets[self.websocket]
		is_master = models.SessionCharacter.query.filter_by(
			id = character_id,
			game_session_id = self.game_session_id.data,
			user_role = "master",
		).count()
		if not is_master:
			return error_response('Forbidden')

		character_ids = [points_data['character_id'] for points_data in self.points.data]
		characters = models.SessionCharacter.query.filter(models.SessionCharacter.id.in_(character_ids))
		character_by_ids = {}
		for character in characters:
			character_by_ids[character.id] = character

		data_to_send = []
		for points_data in self.points.data:
			character_id = points_data['character_id']
			category_id = points_data['category_id']
			value = points_data['value']

			character = character_by_ids[character_id]
			character_points = copy.copy(character.skill_points)
			character_points[str(category_id)] += value
			character.skill_points = character_points
			character.add()

			data_to_send.append((character_id, category_id, character_points[str(category_id)]))

		DBSession.commit()

		self.group_call_client_action("MasterChangedCategoryPoints", {'data_tpls': data_to_send})

		return {'success': True}
Esempio n. 4
0
	def handle (self):
		character_id = State.clients_sockets[self.websocket]

		game_session_id = self.game_session_id.data
		character = models.SessionCharacter.query.filter_by(id = character_id, game_session_id = game_session_id).first()
		if not character or character.user_role != "player":
			return error_response('Forbidden')

		item_id = self.item_id.data
		session_item = models.SessionItem.query.filter_by(id = item_id, owner_id = character.id).first()

		if session_item:
			item = session_item.item
			if not item:
				return error_response('Item not found')

			item_group = item.item_group
			if not item_group.is_equippable:
				return error_response('Item is not wearable')

			group_items = models.Item.query.filter(models.Item.group_id == item_group.id)
			items_by_ids = {}
			for group_item in group_items:
				items_by_ids[group_item.id] = group_item

			slots_consumed = 0
			for character_item in character.items_query:
				if character_item.attrs.get('is_equipped') == True and character_item.item_id in items_by_ids:
					it = items_by_ids[character_item.item_id]
					slots_consumed += it.attrs['slots_consumed']

			if slots_consumed + item.attrs['slots_consumed'] > item_group.max_worn_items:
				return {'success': False}

			session_item.attrs['is_equipped'] = True
			session_item.attrs = session_item.attrs
			flag_modified(session_item, 'attrs')
			session_item.add()

		DBSession.commit()

		character.add()
		items = character.get_items()
		data = {'character_id': character.id, 'items': items, 'skills': character.get_skills()}
		self.group_call_client_action("AfterCharacterPutItemOn", data, include_sender = True)

		return {'success': True, 'items': items}
Esempio n. 5
0
	def handle (self):
		object_forms_by_type = {
			constants.PlayfieldObject.STR_NPC: self.NPCCase,
			constants.PlayfieldObject.STR_ITEM: self.ItemCase,
		}

		check_form = self.CheckType(self.params)
		if not check_form.validate():
			return check_form.errors

		form = object_forms_by_type[check_form.object_type.data](self.params)

		if check_form.object_type.data == constants.PlayfieldObject.STR_ITEM:
			game_session = models.GameSession.query.filter_by(id = form.game_session_id.data).first()
			form.item.query = models.Item.query.filter_by(rules_id = game_session.rules_id)

		if not form.validate():
			return form.errors

		character_id = State.clients_sockets[self.websocket]
		is_master = models.SessionCharacter.query.filter_by(
			id = character_id,
			game_session_id = form.game_session_id.data,
			user_role = "master",
		).count()
		if not is_master:
			return error_response('Forbidden')

		obj = models.PlayObject.query.filter_by(id = form.id.data).first()
		if not obj:
			return error_response('Object is not found')

		if obj.type == constants.PlayfieldObject.ITEM:
			obj.attrs = {'item': form.item.data.id}
			obj.title = form.item.data.title

		elif obj.type == constants.PlayfieldObject.NPC:
			obj.title = form.title.data

		obj.add()

		DBSession.commit()

		self.group_call_client_action('ReloadPlayfield', {})

		return {'success': True}
Esempio n. 6
0
	def check_and_process (self):
		if self.websocket not in State.clients_sockets:
			response = error_response('Forbidden')
			if self.request_id.data:
				response['request_id'] = self.request_id.data
			return response

		if not self.validate():
			response = error_response('Validation error')
			if self.request_id.data:
				response['request_id'] = self.request_id.data
			return response

		response = self.handle()
		if self.request_id.data:
			response['request_id'] = self.request_id.data

		return response
Esempio n. 7
0
	def check_and_process (self):
		if self.websocket not in State.clients_sockets:
			response = error_response('Forbidden')
			response['request_id'] = self.params.get('request_id')
			return response

		response = self.handle()
		if 'request_id' in self.params:
			response['request_id'] = self.params['request_id']

		return response
Esempio n. 8
0
	def handle (self):
		token = self.token.data

		character = models.SessionCharacter.query.filter_by(token = token).first()
		if not character:
			return error_response('Invalid token')

		State.add_client(self.websocket, character.game_session_id, character.id)

		self.group_call_client_action("CharacterJoined", {'character': character.as_dict()}, include_sender = False)

		return {'success': True, 'is_authorized': True}
Esempio n. 9
0
	def handle (self):
		character_id = State.clients_sockets[self.websocket]
		character = models.SessionCharacter.query.filter_by(
			id = character_id,
			game_session_id = self.game_session_id.data,
			user_role = "player",
		).first()
		if not character:
			return error_response('Forbidden')

		obj = models.PlayObject.query.filter_by(id = self.obj_id.data, is_deleted = False).first()
		if not obj:
			return error_response('Object is not found')

		if obj.type != constants.PlayfieldObject.ITEM:
			return error_response('Object is not an item')

		item_id = int(obj.attrs.get('item', 0))
		item = models.SessionItem.query.get(item_id)
		if not item:
			# TODO: Delete object if this situation is occured?
			return error_response('Item is not found')

		item.owner_id = character.id
		item.add()

		obj.is_deleted = True
		obj.add()

		DBSession.commit()

		obj.add()
		item.add()
		character.add()
		items = character.get_items()

		data = {'obj_id': obj.id, 'obj_type': constants.PlayfieldObject.NAME_TO_TYPE.inv[obj.type]}
		self.group_call_client_action('DeletePlayfieldObject', data)

		return {'success': True, 'items': items}
Esempio n. 10
0
	def handle (self):
		game_session = models.GameSession.query.get(self.game_session_id.data)
		if not game_session:
			return error_response('Invalid session ID')

		character_id = State.clients_sockets[self.websocket]
		is_master = models.SessionCharacter.query.filter_by(
			id = character_id,
			game_session_id = self.game_session_id.data,
			user_role = "master",
		).count()
		if not is_master:
			return error_response('Forbidden')

		game_session.board_image = self.image.data
		game_session.add()

		DBSession.commit()

		self.group_call_client_action('ReloadPlayfield', {})

		return {'success': True}
Esempio n. 11
0
	def handle (self):
		master_id = State.clients_sockets[self.websocket]
		is_master = models.SessionCharacter.query.filter_by(
			id = master_id,
			game_session_id = self.game_session_id.data,
			user_role = "master",
		).count()
		if not is_master:
			return error_response('Forbidden')

		session_characters = models.SessionCharacter.query.filter_by(
			game_session_id = self.game_session_id.data,
			user_role = "player",
		)
		players_ids = [session_character.id for session_character in session_characters]

		updated_characters = []

		for xp_info in self.xp.data:
			character_id = xp_info['character_id']
			character_xp = xp_info['character_xp']

			if character_id not in players_ids:
				# TODO: Validation error?
				continue

			character = models.SessionCharacter.query.filter_by(
				id = character_id,
				game_session_id = self.game_session_id.data,
				user_role = "player",
			).first()

			if not character:
				continue

			character.gain_xp(character_xp)
			character.add()

			updated_characters.append(character)

		DBSession.commit()
		DBSession.add_all(updated_characters)

		character_params = {char.id: char.as_dict() for char in updated_characters}

		self.group_call_client_action('CharactersXpChanged', {'characters': character_params}, include_sender = True)

		return {
			'success': True,
			'request_id': self.request_id.data,
		}
Esempio n. 12
0
	def handle (self):
		game_session = models.GameSession.query.get(self.game_session_id.data)
		if not game_session:
			return error_response('Invalid session ID')

		static_path = '{0}/static/'.format(State.SETTINGS.get('web_url'))
		playfield_objects = [x.as_dict(static_path) for x in models.PlayObject.query.filter_by(game_session_id = game_session.id, is_deleted = False)]

		return {
			'success': True,
			'image': game_session.board_image,
			'playfield_objects': playfield_objects,
			'request_id': self.request_id.data,
		}
Esempio n. 13
0
	def handle (self):
		character_id = State.clients_sockets[self.websocket]
		is_master = models.SessionCharacter.query.filter_by(
			id = character_id,
			game_session_id = self.game_session_id.data,
			user_role = "master",
		).count()
		if not is_master:
			return error_response('Forbidden')

		obj = models.PlayObject.query.filter_by(game_session_id = self.game_session_id.data, id = self.id.data).first()
		if not obj:
			return error_response('Object is not found')

		obj.is_deleted = True
		obj.add()

		DBSession.commit()

		obj.add()
		data = {'obj_id': obj.id, 'obj_type': constants.PlayfieldObject.NAME_TO_TYPE.inv[obj.type]}
		self.group_call_client_action('DeletePlayfieldObject', data)

		return {'success': True}
Esempio n. 14
0
	def handle (self):
		character_id = State.clients_sockets[self.websocket]

		game_session_id = self.game_session_id.data
		character = models.SessionCharacter.query.filter_by(id = character_id, game_session_id = game_session_id).first()
		if not character or character.user_role != "player":
			return error_response('Forbidden')

		new_skills_dict = {skill['id']: skill['value'] for skill in self.skills.data}
		skills = DBSession.query(models.Skill.id, models.Skill.category_id, models.Skill.formula).filter(models.Skill.id.in_(character.skills.keys())).all()
		skills_categories_mapper = {skill.id: skill.category_id for skill in skills}
		skills_with_formulas = {skill.id: True for skill in skills if skill.formula}

		char_skills = copy.copy(character.skills)
		char_skill_points = copy.copy(character.skill_points)

		for skill_id, val_to_add in new_skills_dict.viewitems():
			if val_to_add <= 0:
				continue # TODO: error?

			if skill_id in skills_with_formulas:
				continue

			skill_id = int(skill_id)

			category_id = skills_categories_mapper[skill_id]
			cat_points = char_skill_points[str(category_id)]

			if cat_points < val_to_add:
				continue # TODO: error?

			char_skills[str(skill_id)] += val_to_add
			char_skill_points[str(category_id)] -= val_to_add

		character.skills = char_skills
		character.skill_points = char_skill_points
		character.add()

		DBSession.commit()

		character.add()
		skills = character.get_skills()
		data = {'character_id': character_id, 'skills': skills, 'skill_points': character.skill_points}
		self.group_call_client_action("AfterCharacterChangeSkills", data, include_sender = True)

		return {'success': True, 'skills': skills}
Esempio n. 15
0
	def handle (self):
		character_id = State.clients_sockets[self.websocket]

		game_session_id = self.game_session_id.data
		character = models.SessionCharacter.query.filter_by(id = character_id, game_session_id = game_session_id).first()
		if not character or character.user_role != "player":
			return error_response('Forbidden')

		item_id = self.item_id.data
		session_item = models.SessionItem.query.filter_by(id = item_id, owner_id = character.id).first()
		if session_item:
			session_item.attrs['is_equipped'] = False
			flag_modified(session_item, 'attrs')
			session_item.add()

			DBSession.commit()

		character.add()
		items = character.get_items()
		data = {'character_id': character.id, 'items': items, 'skills': character.get_skills()}
		self.group_call_client_action("AfterCharacterTookItemOff", data, include_sender = True)

		return {'success': True, 'items': items}
Esempio n. 16
0
	def handle (self):
		player_id = None

		object_forms_by_type = {
			constants.PlayfieldObject.STR_NPC: self.NPCCase,
			constants.PlayfieldObject.STR_ITEM: self.ItemCase,
			constants.PlayfieldObject.STR_PLAYER: self.PlayerCase,
		}

		check_form = self.CheckType(self.params)
		if not check_form.validate():
			resp = check_form.errors
			resp['tmp_key'] = self.params.get('tmp_key')
			return resp

		form = object_forms_by_type[check_form.object_type.data](self.params)

		if check_form.object_type.data == constants.PlayfieldObject.STR_ITEM:
			game_session = models.GameSession.query.filter_by(id = form.game_session_id.data).first()
			form.item.query = models.Item.query.filter_by(rules_id = game_session.rules_id)

		if not form.validate():
			resp = form.errors
			resp['tmp_key'] = self.params.get('tmp_key')
			return resp

		if check_form.object_type.data == constants.PlayfieldObject.STR_PLAYER:
			player_id = form.player_id.data

			player_tokens = models.PlayObject.query.filter(
				models.PlayObject.game_session_id == form.game_session_id.data,
				models.PlayObject.attrs['player_id'].cast(INTEGER) == form.player_id.data,
				models.PlayObject.is_deleted == False,
			)
			if player_tokens.count():
				return error_response('Player is already on the field')

		character_id = State.clients_sockets[self.websocket]
		is_master = models.SessionCharacter.query.filter_by(
			id = character_id,
			game_session_id = form.game_session_id.data,
			user_role = "master",
		).count()
		if not is_master:
			return error_response('Forbidden')

		tmp_key = form.data.pop('tmp_key')
		type_name = form.data.pop('object_type')

		obj = models.PlayObject()
		form.populate_obj(obj)
		obj.type = constants.PlayfieldObject.NAME_TO_TYPE[type_name]
		obj.is_deleted = False

		if obj.type == constants.PlayfieldObject.PLAYER:
			obj.attrs = {'player_id': form.player_id.data}
		elif obj.type == constants.PlayfieldObject.ITEM:
			session_item = models.SessionItem(
				rules_id = game_session.rules_id,
				item_id = form.item.data.id,
				attrs = {'durability': form.durability.data}
			).add()
			session_item.flush()

			obj.title = form.item.data.title
			obj.attrs = {'item': session_item.id}

		obj.add()

		DBSession.commit()

		self.group_call_client_action('ReloadPlayfield', {})

		DBSession.add(obj)

		return {'success': True, 'object_id': obj.id, 'tmp_key': tmp_key, 'player_id': player_id}
Esempio n. 17
0
	def check_and_process (self):
		if not self.validate():
			return error_response('Validation error')

		return self.handle()